init301.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:314k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1.       else if(SiS_Pr->SiS_VGAVDE == 600) tempbx = 775;
  2.       else if(SiS_Pr->SiS_VGAVDE == 350) tempbx = 560;
  3.       else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 640;
  4.       else                               tempbx = 768;
  5.     }
  6.     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024){
  7.       tempax = 1280;
  8.       if     (SiS_Pr->SiS_VGAVDE == 360) tempbx = 768;
  9.       else if(SiS_Pr->SiS_VGAVDE == 375) tempbx = 800;
  10.       else if(SiS_Pr->SiS_VGAVDE == 405) tempbx = 864;
  11.       else                               tempbx = 1024;
  12.     }
  13.     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960){
  14.       tempax = 1280;
  15.       if     (SiS_Pr->SiS_VGAVDE == 350)  tempbx = 700;
  16.       else if(SiS_Pr->SiS_VGAVDE == 400)  tempbx = 800;
  17.       else if(SiS_Pr->SiS_VGAVDE == 1024) tempbx = 960;
  18.       else                                tempbx = 960;
  19.     }
  20.     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050){
  21.       tempax = 1400;
  22.       tempbx = 1050;
  23.     }
  24.     if(SiS_Pr->SiS_LCDInfo & LCDNonExpanding) {
  25.        tempax = SiS_Pr->SiS_VGAHDE;
  26.        tempbx = SiS_Pr->SiS_VGAVDE;
  27.     }
  28.     SiS_Pr->SiS_HDE = tempax;
  29.     SiS_Pr->SiS_VDE = tempbx;
  30.     return;
  31.   }
  32. }
  33. USHORT
  34. SiS_GetResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
  35. {
  36.   USHORT resindex;
  37.   if(ModeNo<=0x13)
  38.      resindex=SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
  39.   else
  40.      resindex=SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
  41.   return(resindex);
  42. }
  43. /* TW: Checked against 650/301LV, 650/LVDS, 630/LVDS, 630/301 and 630/301B BIOS */
  44. void
  45. SiS_GetCRT2ResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
  46.                    PSIS_HW_DEVICE_INFO HwDeviceExtension)
  47. {
  48.   USHORT xres,yres,modeflag=0,resindex;
  49.   resindex = SiS_GetResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex);
  50.   if(ModeNo <= 0x13) {
  51.      xres = SiS_Pr->SiS_StResInfo[resindex].HTotal;
  52.      yres = SiS_Pr->SiS_StResInfo[resindex].VTotal;
  53.   } else {
  54. xres = SiS_Pr->SiS_ModeResInfo[resindex].HTotal;
  55.      yres = SiS_Pr->SiS_ModeResInfo[resindex].VTotal;
  56.      modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  57.   }
  58.   /* TW: Inserted entire if-section from 650/LVDS BIOS 1.10.07: */
  59.   if((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_IF_DEF_LVDS == 1)) {
  60.       if((ModeNo != 0x03) && (SiS_Pr->SiS_SetFlag & CRT2IsVGA)) {
  61.           if(yres == 350) yres = 400;
  62.       }
  63.       if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x3a) & 0x01) {
  64.     if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x34) == 0x12)
  65.       yres = 400;
  66.       }
  67.   }
  68.   if(ModeNo > 0x13) {
  69.       if(SiS_Pr->SiS_IF_DEF_FSTN == 1){
  70.             xres *= 2;
  71.             yres *= 2;
  72.       } else {
  73.        if(modeflag & HalfDCLK)       xres *= 2;
  74.        if(modeflag & DoubleScanMode) yres *= 2;
  75.       }
  76.   }
  77.   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
  78.         /* TW: Inserted from 650/301LV BIOS */
  79.         if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
  80.                 if(xres == 720) xres = 640;
  81. } else {
  82.    if(xres == 720) xres = 640;
  83.         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
  84.        if(yres == 400) yres = 405;
  85.        if(yres == 350) yres = 360;
  86.        if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
  87.          if(yres == 360) yres = 375;
  88.        }
  89.        }
  90.         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768){
  91.        if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
  92.          if(!(SiS_Pr->SiS_LCDInfo & LCDNonExpanding)) {
  93.            if(yres == 350) yres = 357;
  94.            if(yres == 400) yres = 420;
  95.              if(yres == 480) yres = 525;
  96.          }
  97.        }
  98.         }
  99.    /* TW: Inserted for 630/301B */
  100.    if(HwDeviceExtension->jChipType < SIS_315H) {
  101.       if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
  102.                   if(xres == 720) xres = 640;
  103.       }
  104.    }
  105. }
  106.   } else {
  107.      if(xres == 720) xres = 640;
  108. /* TW: Inserted from 650/LVDS and 630/LVDS BIOS */
  109. if(SiS_Pr->SiS_SetFlag & CRT2IsVGA) {
  110.       yres = 400;
  111.       if(HwDeviceExtension->jChipType >= SIS_315H) {
  112.           if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x80) yres = 480;
  113.       } else {
  114.           if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80) yres = 480;
  115.       }
  116. }
  117.   }
  118.   SiS_Pr->SiS_VGAHDE = SiS_Pr->SiS_HDE = xres;
  119.   SiS_Pr->SiS_VGAVDE = SiS_Pr->SiS_VDE = yres;
  120. }
  121. /* TW: Checked against 650/301 and 650/LVDS (1.10.07) BIOS; modified for new panel resolutions */
  122. /* TW: Done differently in 630/301B BIOS; but same effect; checked against 630/301 */
  123. void
  124. SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
  125.        USHORT RefreshRateTableIndex,USHORT *CRT2Index,USHORT *ResIndex,
  126.        PSIS_HW_DEVICE_INFO HwDeviceExtension)
  127. {
  128.   USHORT tempbx=0,tempal=0;
  129.   USHORT Flag,resinfo=0;
  130.   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
  131.      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {                            /* LCD */
  132.         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
  133. tempbx = 15;
  134. } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
  135.         tempbx = 20;
  136. if(SiS_Pr->SiS_LCDInfo & LCDNonExpanding) tempbx = 21;
  137. if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx = 22;
  138. } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
  139.         tempbx = 23;
  140. if(SiS_Pr->SiS_LCDInfo & LCDNonExpanding) tempbx = 24;
  141. if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx = 25;
  142. } else if(SiS_Pr->SiS_LCDInfo & LCDNonExpanding) {
  143. tempbx = 13;
  144. if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempbx++;
  145. } else {
  146.           tempbx = SiS_Pr->SiS_LCDResInfo - SiS_Pr->SiS_Panel1024x768;
  147.           if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
  148.          tempbx += 5;
  149.                         /* GetRevisionID();  */
  150. /* TW: BIOS only adds 5 once */
  151.          tempbx += 5;
  152.            }
  153.         }
  154.       } else {
  155. #ifdef oldHV            /* TV */
  156.         if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV){
  157.           if(SiS_Pr->SiS_VGAVDE > 480) SiS_Pr->SiS_SetFlag &= (~TVSimuMode); /* TW: Was "(!TVSimuMode)" - WRONG */
  158.           tempbx = 2;
  159.           if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
  160.              if(!(SiS_Pr->SiS_SetFlag & TVSimuMode)) tempbx = 12;  /* TW: Was 10! - WRONG */
  161.           }
  162.         } else {
  163. #endif
  164.           if(SiS_Pr->SiS_VBInfo & SetPALTV) tempbx = 3;
  165.           else tempbx = 4;
  166.           if(SiS_Pr->SiS_SetFlag & TVSimuMode) tempbx += 5;
  167. #ifdef oldHV
  168.         }
  169. #endif
  170.       }
  171.       if(ModeNo <= 0x13)
  172.         tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
  173.       else
  174.         tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
  175.       tempal &= 0x3F;
  176.        if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)
  177.                      && (SiS_Pr->SiS_VBInfo & (SetCRT2ToTV-SetCRT2ToHiVisionTV))) {  /* TW: Added -Hivision (BIOS) */
  178.        if(tempal == 0x06) tempal = 0x07;
  179.         }
  180.         if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
  181.             if((ModeNo == 0x31) || (ModeNo == 0x32)) tempal = 6;
  182. }
  183.       *CRT2Index = tempbx;
  184.       *ResIndex = tempal;
  185.   } else {   /* LVDS */
  186.      Flag = 1;
  187.      tempbx = 0;
  188.      if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
  189.        if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
  190.          Flag = 0;
  191.          tempbx = 10;
  192.          if(SiS_Pr->SiS_VBInfo & SetPALTV)        tempbx += 2;
  193.          if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
  194.        }
  195.      }
  196.      if(Flag == 1) {
  197.        tempbx = SiS_Pr->SiS_LCDResInfo - SiS_Pr->SiS_PanelMinLVDS;
  198. if(SiS_Pr->SiS_LCDResInfo <= SiS_Pr->SiS_Panel1280x1024) {
  199.                if(SiS_Pr->SiS_LCDInfo & LCDNonExpanding)  tempbx += 3;
  200. } else {
  201.     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
  202. tempbx = 8;
  203. if(SiS_Pr->SiS_LCDInfo & LCDNonExpanding)  tempbx++;
  204.     }
  205.              if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
  206. tempbx = 7;
  207.              }
  208.           if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480)  tempbx = 6;
  209.     /* TW: Inserted from 630/LVDS 2.04.5c BIOS */
  210.     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
  211. tempbx = 15;
  212.            if(SiS_Pr->SiS_LCDInfo & LCDNonExpanding)  tempbx += 2;
  213.     }
  214.     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
  215.         tempbx = 16;
  216. if(SiS_Pr->SiS_LCDInfo & LCDNonExpanding)  tempbx += 2;
  217.     }
  218.  }
  219. }
  220.      if(ModeNo <= 0x13)
  221.        tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
  222.      else {
  223.        tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
  224. resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
  225. }
  226. if(SiS_Pr->SiS_IF_DEF_FSTN){
  227.           if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel320x480){
  228.           tempbx = 14;
  229.           tempal = 6;
  230.          }
  231.      }
  232. /* TW: Inserted from 650/LVDS BIOS */
  233. if(SiS_Pr->SiS_SetFlag & CRT2IsVGA) {
  234.         if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) tempal = 7;
  235. if(HwDeviceExtension->jChipType < SIS_315H) {
  236.     /* TW: Inserted from 630/LVDS (2.04.5c) and 630/301B (II) BIOS */
  237.     if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80) tempal++;
  238. }
  239. }
  240. /* TW: Inserted from 630/301B BIOS */
  241. if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
  242.     if(ModeNo > 0x13) {
  243.         if((resinfo == 0x0c) || (resinfo == 0x0d))  /* 720 */
  244.     tempal = 6;
  245.     }
  246. }
  247.      *CRT2Index = tempbx;
  248.      *ResIndex = tempal & 0x1F;
  249.   }
  250. }
  251. void
  252. SiS_GetCRT2PtrA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
  253. USHORT RefreshRateTableIndex,USHORT *CRT2Index,
  254. USHORT *ResIndex)
  255. {
  256.   USHORT tempbx,tempal;
  257.   tempbx = SiS_Pr->SiS_LCDResInfo;
  258.   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
  259.        tempbx = 4;
  260.   } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
  261.        tempbx = 3;
  262.   } else {
  263.        tempbx -= SiS_Pr->SiS_Panel1024x768;
  264.   }
  265.   if(SiS_Pr->SiS_LCDInfo & LCDNonExpanding)  tempbx += 5;
  266.   if(ModeNo <= 0x13)
  267.        tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
  268.   else
  269.        tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
  270.   *CRT2Index = tempbx;
  271.   *ResIndex = tempal & 0x1F;
  272. }
  273. /* TW: New from 650/301LVx BIOS */
  274. void
  275. SiS_GetCRT2Part2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
  276.     USHORT RefreshRateTableIndex,USHORT *CRT2Index,
  277.     USHORT *ResIndex)
  278. {
  279.   USHORT tempbx,tempal;
  280.   if(ModeNo <= 0x13)
  281.        tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
  282.   else
  283.        tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
  284.   tempbx = SiS_Pr->SiS_LCDResInfo;
  285.   if(SiS_Pr->SiS_LCDInfo & LCDNonExpanding)    tempbx += 16;
  286.   else if(SiS_Pr->SiS_SetFlag & LCDVESATiming) tempbx += 32;
  287.   *CRT2Index = tempbx;
  288.   *ResIndex = tempal & 0x3F;
  289. }
  290. /* TW: Checked against all (incl 650/LVDS (1.10.07), 630/301B, 630/301) BIOSes */
  291. USHORT
  292. SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  293.                    PSIS_HW_DEVICE_INFO HwDeviceExtension)
  294. {
  295.   SHORT  LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01,
  296.                                0x01, 0x01, 0x01, 0x01,
  297.        0x01, 0x01, 0x01, 0x01,
  298.        0x01, 0x01, 0x01, 0x01 };
  299.   USHORT RefreshRateTableIndex,i,backup_i;
  300.   USHORT modeflag,index,temp,backupindex;
  301.   if (ModeNo <= 0x13)
  302.      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  303.   else
  304.      modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  305.   if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
  306.      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
  307.        if(modeflag & HalfDCLK) return(0);
  308.      }
  309.   }
  310.   if(ModeNo < 0x14) return(0xFFFF);
  311.  /* TW: CR33 holds refresh rate index for CRT1 [3:0] and CRT2 [7:4].
  312.   *     On LVDS machines, CRT2 index is always 0 and will be
  313.   *     set to 0 by the following code; this causes the function
  314.   *     to take the first non-interlaced mode in SiS_Ext2Struct
  315.   */
  316.   index = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x33);
  317.   index >>= SiS_Pr->SiS_SelectCRT2Rate;
  318.   index &= 0x0F;
  319.   backupindex = index;
  320.   if(index > 0) index--;
  321.   if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
  322.       if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
  323.         if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))  index = 0;
  324.       } else {
  325.         if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
  326.     if(HwDeviceExtension->jChipType < SIS_315H)    index = 0;
  327.     else if(SiS_Pr->SiS_LCDInfo & LCDNonExpanding) index = backupindex = 0;
  328. }
  329.       }
  330.   }
  331.   if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
  332.      if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
  333.        if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
  334.          index = 0;
  335.        }
  336.      }
  337.      if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
  338.        if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
  339.         /* TW: This is not done in 630/301B BIOS */
  340.             temp = LCDRefreshIndex[SiS_Pr->SiS_LCDResInfo];
  341.          if(index > temp) index = temp;
  342.        } else {
  343.          index = 0;
  344.        }
  345.      }
  346.   }
  347.   RefreshRateTableIndex = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
  348.   ModeNo = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].ModeID;
  349.   /* TW: Inserted from 650/LVDS 1.10.07, 650/301LVx 1.10.6s */
  350.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  351.     if(!(SiS_Pr->SiS_VBInfo & DriverMode)) {
  352.       if( (SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_VESAID == 0x105) ||
  353.           (SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_VESAID == 0x107) ) {
  354.             if(backupindex <= 1)
  355.        RefreshRateTableIndex++;
  356.       }
  357.     }
  358.   }
  359.   i = 0;
  360.   do {
  361.      if(SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + i].ModeID != ModeNo) break;
  362.      temp = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + i].Ext_InfoFlag;
  363.      temp &= ModeInfoFlag;
  364.      if(temp < SiS_Pr->SiS_ModeType) break;
  365.      i++;
  366.      index--;
  367.   } while(index != 0xFFFF);
  368.   if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
  369.      if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
  370.        temp = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + i - 1].Ext_InfoFlag;
  371.        if(temp & InterlaceMode) {
  372.          i++;
  373.        }
  374.      }
  375.   }
  376.   i--;
  377.   if((SiS_Pr->SiS_SetFlag & ProgrammingCRT2) && (!(SiS_Pr->SiS_VBInfo & DisableCRT2Display))) {
  378.      backup_i = i;
  379.      if (!(SiS_AdjustCRT2Rate(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
  380.                              RefreshRateTableIndex,&i,HwDeviceExtension))) {
  381. /* TW: This is for avoiding random data to be used; i is
  382.  *     in an undefined state if no matching CRT2 mode is
  383.  *     found.
  384.  */
  385. i = backup_i;
  386. }
  387.   }
  388.   return(RefreshRateTableIndex + i);
  389. }
  390. /* Checked against all (incl 650/LVDS (1.10.07), 630/301) BIOSes */
  391. BOOLEAN
  392. SiS_AdjustCRT2Rate(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
  393.                    USHORT RefreshRateTableIndex,USHORT *i,PSIS_HW_DEVICE_INFO HwDeviceExtension)
  394. {
  395.   USHORT tempax,tempbx,resinfo;
  396.   USHORT modeflag,infoflag;
  397.   if (ModeNo <= 0x13)
  398.      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  399.   else
  400.      modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  401.   resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
  402.   tempbx = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID;
  403.   tempax = 0;
  404.   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
  405.    /* TW: For 301, 301B, 302B, 301LV, 302LV */
  406.      if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
  407.        tempax |= SupportRAMDAC2;
  408. if(HwDeviceExtension->jChipType >= SIS_315H) {
  409.     tempax |= SupportTV;
  410.     if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
  411.         if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
  412.     if(resinfo == 0x0a) tempax |= SupportTV1024;
  413. }
  414.     }
  415. }
  416.      }
  417.      if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
  418.        tempax |= SupportLCD;
  419. if(HwDeviceExtension->jChipType >= SIS_315H) {
  420.                    if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1600x1200) {
  421.       if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1400x1050) {
  422.          if((resinfo == 6) && (SiS_Pr->SiS_LCDInfo & LCDNonExpanding)) {
  423.     tempax |= SupportAllCRT2;
  424.     (*i) = 0;   /* TW: Restore RefreshTableIndex (BIOS 650/301LVx 1.10.6s) */
  425.                             return(1);
  426.          } else {
  427.                    if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) {
  428.                if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960) {
  429.             if((resinfo == 6) && (SiS_Pr->SiS_LCDInfo & LCDNonExpanding)) {
  430.     return(0);
  431. } else {
  432.                   if((resinfo >= 9) && (resinfo != 0x14)) {
  433.                 tempax = 0;
  434.                 return(0);
  435.                   }
  436.             }
  437.                }
  438.             }
  439.          }
  440.       }
  441.           }
  442. } else {
  443.   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
  444.      if((resinfo != 0x0f) && ((resinfo == 4) || (resinfo >= 8))) return(0);
  445.   } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
  446.      if((resinfo != 0x10) && (resinfo > 8)) return(0);
  447.   } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
  448.      if((resinfo != 0x0e) && (resinfo > 8)) return(0);
  449.   } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
  450.      if(resinfo > 9) return(0);
  451.   } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
  452.      if(resinfo > 8) return(0);
  453.   } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
  454.      if((resinfo == 4) || (resinfo > 7)) return(0);
  455.   } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
  456.      if((resinfo == 4) || (resinfo == 3) || (resinfo > 6)) return(0);
  457.   }
  458. }
  459.      }
  460. #ifdef oldHV
  461.      if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {    /* for HiTV */
  462.        tempax |= SupportHiVisionTV;
  463.        if(SiS_Pr->SiS_VBInfo & SetInSlaveMode){
  464.          if(resinfo == 4) return(0);
  465.          if(resinfo == 3) {
  466.            if(SiS_Pr->SiS_SetFlag & TVSimuMode) return(0);
  467.          }
  468.          if(resinfo > 7) return(0);
  469.        }
  470.      } else {
  471. #endif
  472.        if(SiS_Pr->SiS_VBInfo & (SetCRT2ToAVIDEO|SetCRT2ToSVIDEO|SetCRT2ToSCART)) {
  473.          tempax |= SupportTV;
  474. tempax |= SupportTV1024;
  475. if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
  476.     if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
  477.         if((SiS_Pr->SiS_VBInfo & SetNotSimuMode) && (SiS_Pr->SiS_VBInfo & SetPALTV)) {
  478.      if(resinfo != 8) {
  479.          if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
  480.      ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 4)) ) {
  481.      tempax &= ~(SupportTV1024);
  482.      if(HwDeviceExtension->jChipType >= SIS_315H) {
  483.                                          if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
  484.              if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
  485.                          ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 7)) ) {
  486.                          if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
  487.                              }
  488.          }
  489.                      } else {
  490.          if( (resinfo != 3) ||
  491.      (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
  492.      (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
  493.      if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
  494.  if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
  495.      if(resinfo == 3) return(0);
  496.      if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
  497.  }
  498.                              }
  499.                                          } else return(0);
  500.      }
  501.  }
  502.      }
  503. } else {
  504.     tempax &= ~(SupportTV1024);
  505.     if(HwDeviceExtension->jChipType >= SIS_315H) {
  506.         if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
  507.             if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
  508.                 ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 7)) ) {
  509.                 if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
  510.                     }
  511.                 }
  512.     } else {
  513.         if( (resinfo != 3) ||
  514.     (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
  515.     (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
  516.      if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
  517.  if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
  518.      if(resinfo == 3) return(0);
  519.      if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
  520.  }
  521.                      }
  522.                                 } else return(0);
  523.                             }
  524. }
  525.     } else {  /* slavemode */
  526. if(resinfo != 8) {
  527.     if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
  528.         ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 4) ) ) {
  529.  tempax &= ~(SupportTV1024);
  530.  if(HwDeviceExtension->jChipType >= SIS_315H) {
  531.      if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
  532.          if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
  533.                      ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 7)) ) {
  534.                      if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode))  return(0);
  535.                          }
  536.                      }
  537.         } else {
  538.     if( (resinfo != 3) ||
  539.         (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
  540.         (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
  541.          if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
  542.      if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
  543.          if(resinfo == 3) return(0);
  544.          if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
  545.      }
  546.                          }
  547.                                     } else return(0);
  548. }
  549.     }
  550. }
  551.     }
  552. } else {   /* 301 */
  553.     tempax &= ~(SupportTV1024);
  554.     if(HwDeviceExtension->jChipType >= SIS_315H) {
  555.         if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
  556.             if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
  557.         ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 7)) ) {
  558.         if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
  559.             }
  560.         }
  561.     } else {
  562.         if( (resinfo != 3) ||
  563.     (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
  564.     (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
  565.     if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
  566.         if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
  567.     if(resinfo == 3) return(0);
  568.     if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
  569. }
  570.             }
  571.                         } else return(0);
  572.     }
  573. }
  574.         }
  575. #ifdef oldHV
  576.      }
  577. #endif
  578.   } else { /* TW: for LVDS  */
  579.      if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
  580.        if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
  581.          tempax |= SupportCHTV;
  582.        }
  583.      }
  584.      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
  585.        tempax |= SupportLCD;
  586. if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
  587.      if((resinfo != 0x14) && (resinfo > 0x09)) return(0);
  588. } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
  589.      if((resinfo != 0x0f) && (resinfo > 0x08)) return(0);
  590. } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
  591.      if((resinfo != 0x10) && (resinfo > 0x08)) return(0);
  592. } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
  593.      if((resinfo != 0x15) && (resinfo > 0x09)) return(0);
  594. } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
  595.                      if(resinfo > 0x09) return(0);
  596.                 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
  597.      if(resinfo > 0x08) return(0);
  598. } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600){
  599.      if(resinfo > 0x07) return(0);
  600.      if(resinfo == 0x04) return(0);
  601. }
  602.      }
  603.   }
  604.   /* TW: Look backwards in table for matching CRT2 mode */
  605.   for(; SiS_Pr->SiS_RefIndex[RefreshRateTableIndex+(*i)].ModeID == tempbx; (*i)--) {
  606.       infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
  607.       if(infoflag & tempax) {
  608.         return(1);
  609.       }
  610.       if ((*i) == 0) break;
  611.   }
  612.   /* TW: Look through the whole mode-section of the table from the beginning
  613.    *     for a matching CRT2 mode if no mode was found yet.
  614.    */
  615.   for((*i) = 0; ; (*i)++) {
  616.       infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
  617.       if(SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID != tempbx) {
  618.         return(0);
  619.       }
  620.       if(infoflag & tempax) {
  621.         return(1);
  622.       }
  623.   }
  624.   return(1);
  625. }
  626. /* Checked against 650/LVDS (1.10.07) and 650/301LV BIOS */
  627. void
  628. SiS_SaveCRT2Info(SiS_Private *SiS_Pr, USHORT ModeNo)
  629. {
  630.   USHORT temp1,temp2;
  631.   /* TW: We store CRT1 ModeNo in CR34 */
  632.   SiS_SetReg1(SiS_Pr->SiS_P3d4,0x34,ModeNo);
  633.   temp1 = (SiS_Pr->SiS_VBInfo & SetInSlaveMode) >> 8;
  634.   temp2 = ~(SetInSlaveMode >> 8);
  635.   SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x31,temp2,temp1);
  636. }
  637. /* TW: Checked against 650+301, 650/LVDS (1.10.07) and 650/301LVx (1.10.6s) BIOS */
  638. void
  639. SiS_GetVBInfo(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
  640.               USHORT ModeIdIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
  641. {
  642.   USHORT tempax,tempbx,temp;
  643.   USHORT modeflag, resinfo=0;
  644.   UCHAR  OutputSelect = *SiS_Pr->pSiS_OutputSelect;
  645.   if (ModeNo<=0x13)
  646.      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  647.   else {
  648.     modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  649. resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
  650.   }
  651.   SiS_Pr->SiS_SetFlag = 0;
  652.   SiS_Pr->SiS_ModeType = modeflag & ModeInfoFlag;
  653.   tempbx = 0;
  654.   if(SiS_BridgeIsOn(SiS_Pr,BaseAddr,HwDeviceExtension) == 0) {              /* TW: "== 0" inserted from 630/301B BIOS */
  655.      temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
  656. if(SiS_Pr->SiS_HiVision & 0x03) { /* TW: New from 650/301LVx 1.10.6s */
  657.      temp &= (SetCRT2ToHiVisionTV | SwitchToCRT2 | SetSimuScanMode);  /* 0x83 */
  658.      temp |= SetCRT2ToHiVisionTV;    /* 0x80 */
  659. }
  660. if(SiS_Pr->SiS_HiVision & 0x04) { /* TW: New from 650/301LVx 1.10.6s */
  661.      temp &= (SetCRT2ToHiVisionTV | SwitchToCRT2 | SetSimuScanMode);  /* 0x83 */
  662.      temp |= SetCRT2ToSVIDEO;   /* 0x08 */
  663. }
  664. #if 0   /* TW: Not in 650/301LVx 1.10.6s BIOS */
  665.      if(SiS_Pr->SiS_VBType & VB_SIS30xLV) {
  666.         temp &= 0xbf;   /* 301lvds disable CRT2RAMDAC */
  667.      }
  668. #endif
  669.      if(SiS_Pr->SiS_IF_DEF_FSTN) {   /* fstn must set CR30=0x21 */
  670.         temp = (SetCRT2ToLCD | SetSimuScanMode);
  671.         SiS_SetReg1(SiS_Pr->SiS_P3d4,0x30,temp);
  672.      }
  673.      tempbx |= temp;
  674.      temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31);
  675. tempax = temp << 8;
  676.         tempax &= (LoadDACFlag | DriverMode | SetDispDevSwitch |        /* TW: Inserted from 650/LVDS+301LV BIOS */
  677.          SetNotSimuMode | SetPALTV);                    /* TW: Inserted from 650/LVDS+301LV BIOS */
  678.      tempbx |= tempax;
  679.      temp = SetCHTVOverScan | SetInSlaveMode | DisableCRT2Display;
  680.     temp = 0xFFFF ^ temp;
  681.      tempbx &= temp;
  682. #ifdef SIS315H
  683. if(HwDeviceExtension->jChipType >= SIS_315H) {
  684.    temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
  685.         if(SiS_Pr->SiS_VBType & (VB_SIS302B | VB_SIS30xLV | VB_SIS30xNEW)) {
  686.                 if((SiS_GetReg1(SiS_Pr->SiS_P3d4, 0x36) & 0x0f) == SiS_Pr->SiS_Panel1400x1050) {
  687.     if(tempbx & SetCRT2ToLCD) {
  688.         if(ModeNo <= 0x13) {
  689.      if(SiS_CRT2IsLCD(SiS_Pr, BaseAddr)) {
  690.           if(!(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & (SetNotSimuMode >> 8))) {
  691.       SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x38,0x03);
  692.   }
  693.      }
  694. }
  695.     }
  696. }
  697.         if((temp & (EnableDualEdge | SetToLCDA))
  698.           == (EnableDualEdge | SetToLCDA))   /* TW: BIOS only tests these bits, added "& ..." */
  699.            tempbx |= SetCRT2ToLCDA;
  700.         }
  701.    /* TW: Inserted from 650/LVDS 1.10.07 BIOS: */
  702.    if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
  703.         if(temp & SetToLCDA)
  704.         tempbx |= SetCRT2ToLCDA;
  705.         if(temp & EnableLVDSHiVision)
  706.         tempbx |= SetCRT2ToHiVisionTV;
  707.    }
  708. }
  709. #endif
  710.      if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
  711.         temp = SetCRT2ToLCDA   | SetCRT2ToSCART      | SetCRT2ToLCD |
  712.        SetCRT2ToRAMDAC | SetCRT2ToSVIDEO     | SetCRT2ToAVIDEO; /* = 0x807C; */
  713.        if(SiS_Pr->SiS_IF_DEF_HiVision == 1)
  714.                      temp |= SetCRT2ToHiVisionTV; /* = 0x80FC; */
  715.      } else {
  716.                 if(HwDeviceExtension->jChipType >= SIS_315H) {
  717.                     if(SiS_Pr->SiS_IF_DEF_CH70xx != 0)
  718.          temp = SetCRT2ToLCDA   | SetCRT2ToSCART |
  719.        SetCRT2ToLCD    | SetCRT2ToHiVisionTV |
  720.        SetCRT2ToAVIDEO | SetCRT2ToSVIDEO;  /* = 0x80bc */
  721.            else
  722.          temp = SetCRT2ToLCDA | SetCRT2ToLCD;
  723. } else {
  724.            if(SiS_Pr->SiS_IF_DEF_CH70xx != 0)
  725.          temp = SetCRT2ToTV | SetCRT2ToLCD;
  726.            else
  727.          temp = SetCRT2ToLCD;
  728. }
  729.      }
  730.      if(!(tempbx & temp)) {
  731.        tempax = DisableCRT2Display;
  732.        tempbx = 0;
  733.      }
  734.     if(SiS_Pr->SiS_IF_DEF_LVDS==0) {
  735.        if(tempbx & SetCRT2ToLCDA) {
  736.          tempbx &= (0xFF00|SwitchToCRT2|SetSimuScanMode);
  737.        } else if(tempbx & SetCRT2ToRAMDAC) {
  738.          tempbx &= (0xFF00|SetCRT2ToRAMDAC|SwitchToCRT2|SetSimuScanMode);
  739.        } else if((tempbx & SetCRT2ToLCD) && (!(SiS_Pr->SiS_VBType & VB_NoLCD)) ){
  740.          tempbx &= (0xFF00|SetCRT2ToLCD|SwitchToCRT2|SetSimuScanMode);
  741.        } else if(tempbx & SetCRT2ToSCART){
  742.          tempbx &= (0xFF00|SetCRT2ToSCART|SwitchToCRT2|SetSimuScanMode);
  743.          tempbx |= SetPALTV;
  744. }
  745. #if 0 /* TW: Not done in 650/301LVx 1.10.6s BIOS */
  746.        } else if(tempbx & SetCRT2ToHiVisionTV){
  747.          tempbx &= (0xFF00|SetCRT2ToHiVisionTV|SwitchToCRT2|SetSimuScanMode);
  748.          tempbx |= SetPALTV;
  749.        }
  750. #endif
  751.     } else { /* LVDS */
  752.         if(HwDeviceExtension->jChipType >= SIS_315H) {
  753.     if(tempbx & SetCRT2ToLCDA)
  754.         tempbx &= (0xFF00|SwitchToCRT2|SetSimuScanMode);
  755. }
  756.        if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
  757.              if(tempbx & SetCRT2ToTV)
  758.             tempbx &= (0xFF00|SetCRT2ToTV|SwitchToCRT2|SetSimuScanMode);
  759.        }
  760.        if(tempbx & SetCRT2ToLCD) {
  761.          tempbx &= (0xFF00|SetCRT2ToLCD|SwitchToCRT2|SetSimuScanMode);
  762. }
  763.         if(HwDeviceExtension->jChipType >= SIS_315H) {
  764.     if(tempbx & SetCRT2ToLCDA)
  765.         tempbx |= SetCRT2ToLCD;
  766. }
  767. }
  768.      if(tempax & DisableCRT2Display) {
  769.        if(!(tempbx & (SwitchToCRT2 | SetSimuScanMode))) {
  770.          tempbx = SetSimuScanMode | DisableCRT2Display;
  771.        }
  772.      }
  773.      if(!(tempbx & DriverMode)){
  774.        tempbx |= SetSimuScanMode;
  775.      }
  776. /* TW: LVDS (LCD/TV) and 630+301B (LCD) can only be slave in 8bpp modes */
  777. if( (SiS_Pr->SiS_IF_DEF_LVDS == 1) && (SiS_Pr->SiS_ModeType <= ModeVGA) ) {
  778. modeflag &= (~CRT2Mode);
  779. }
  780. if( (HwDeviceExtension->jChipType < SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
  781.         if(SiS_Pr->SiS_ModeType <= ModeVGA) {
  782. if(tempbx & SetCRT2ToLCD) {
  783.      modeflag &= (~CRT2Mode);
  784. }
  785.         }
  786. }
  787. /* TW end */
  788.      if(!(tempbx & SetSimuScanMode)){
  789.        if(tempbx & SwitchToCRT2) {
  790.              if(!(modeflag & CRT2Mode)) {
  791. if( (HwDeviceExtension->jChipType >= SIS_315H) &&
  792.         (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) ) {
  793.     if(resinfo != 0x0a)
  794.                                 tempbx |= SetSimuScanMode;
  795. } else {
  796.              tempbx |= SetSimuScanMode;
  797.                 }
  798.              }
  799.        } else {
  800.              if(!(SiS_BridgeIsEnable(SiS_Pr,BaseAddr,HwDeviceExtension))) {
  801.            if(!(tempbx & DriverMode)) {
  802.                  if(SiS_BridgeInSlave(SiS_Pr)) {
  803. tempbx |= SetSimuScanMode; /* TW: from BIOS 650/301/301LV/LVDS */
  804.                  }
  805.                         }
  806.                     }
  807.        }
  808.      }
  809.      if(!(tempbx & DisableCRT2Display)) {
  810.             if(tempbx & DriverMode) {
  811.                 if(tempbx & SetSimuScanMode) {
  812.                if(!(modeflag & CRT2Mode)) {
  813.                 if( (HwDeviceExtension->jChipType >= SIS_315H) &&
  814.        (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) ) {
  815.      if(resinfo != 0x0a) {  /* TW: Inserted from 650/301 BIOS */
  816.           tempbx |= SetInSlaveMode;
  817.                        if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
  818.                       if(tempbx & SetCRT2ToTV) {
  819.                           if(!(tempbx & SetNotSimuMode))
  820.      SiS_Pr->SiS_SetFlag |= TVSimuMode;
  821.                     }
  822.                                   }
  823.      }                      /* TW: Inserted from 650/301 BIOS */
  824.         } else {
  825.                  tempbx |= SetInSlaveMode;
  826.                  if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
  827.                        if(tempbx & SetCRT2ToTV) {
  828.                      if(!(tempbx & SetNotSimuMode))
  829. SiS_Pr->SiS_SetFlag |= TVSimuMode;
  830.                }
  831.                  }
  832.                         }
  833.             }
  834.                 }
  835.             } else {
  836.                 tempbx |= SetInSlaveMode;
  837.          if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
  838.                if(tempbx & SetCRT2ToTV) {
  839.              if(!(tempbx & SetNotSimuMode))
  840.     SiS_Pr->SiS_SetFlag |= TVSimuMode;
  841.                }
  842.          }
  843.            }
  844.      }
  845. if(SiS_Pr->SiS_CHOverScan) {
  846.         if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
  847.        temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x35);
  848.        if((temp & TVOverScan) || (SiS_Pr->SiS_CHOverScan == 1) )
  849.       tempbx |= SetCHTVOverScan;
  850.         }
  851.    if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
  852.        temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x79);
  853.        if( (temp & 0x80) || (SiS_Pr->SiS_CHOverScan == 1) )
  854.       tempbx |= SetCHTVOverScan;
  855.         }
  856. }
  857.   }
  858.   if(SiS_Pr->SiS_IF_DEF_LVDS==0) {
  859. #ifdef SIS300
  860.       if((HwDeviceExtension->jChipType==SIS_630)||
  861.            (HwDeviceExtension->jChipType==SIS_730)) {
  862.     if(ROMAddr && SiS_Pr->SiS_UseROM) {
  863. OutputSelect = ROMAddr[0xfe];
  864.                 }
  865.             if(!(OutputSelect & EnablePALMN))
  866.               SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x35,0x3F);
  867.             if(tempbx & SetCRT2ToTV) {
  868.                if(tempbx & SetPALTV) {
  869.                    temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x35);
  870. /* temp &= 0xC0;  */ /* TW: BIOS only tests 0x40, not 0x80 */
  871.                    if(temp & 0x40)
  872.                      tempbx &= (~SetPALTV);
  873.               }
  874.            }
  875.        }
  876. #endif
  877. #ifdef SIS315H
  878.       if(HwDeviceExtension->jChipType >= SIS_315H) {
  879.         if(ROMAddr && SiS_Pr->SiS_UseROM) {
  880. OutputSelect = ROMAddr[0xf3];
  881.                 }
  882. if(!(OutputSelect & EnablePALMN))
  883.          SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x38,0x3F);
  884.     if(tempbx & SetCRT2ToTV) {
  885.      if(tempbx & SetPALTV) {
  886.                 temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
  887.                 if(temp & 0x40)
  888.                 tempbx &= (~SetPALTV);
  889.                }
  890.          }
  891.    }
  892. #endif
  893.   }
  894.   SiS_Pr->SiS_VBInfo=tempbx;
  895. #ifdef TWDEBUG
  896. #ifdef LINUX_KERNEL
  897.   printk(KERN_INFO "sisfb: (VBInfo= 0x%04x, SetFlag=0x%04x)n", SiS_Pr->SiS_VBInfo, SiS_Pr->SiS_SetFlag);
  898. #endif
  899. #ifdef LINUX_XF86
  900.   xf86DrvMsg(0, X_PROBED, "(init301: VBInfo=0x%04x, SetFlag=0x%04x)n", SiS_Pr->SiS_VBInfo, SiS_Pr->SiS_SetFlag);
  901. #endif
  902. #endif
  903. #if 0  /* TW: Incomplete! (But does not seem to be required) */
  904.   if(HwDeviceExtension->jChipType < SIS_315H) {
  905.      /* TW: From A901/630+301B BIOS */
  906.      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
  907.          if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80)
  908.      }
  909.      if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
  910.          if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80)
  911.      if( [si] == 3) ModeIdIndex = 0x3f2b;
  912.  }
  913.      }
  914.      SiS_SetRegAND(SiS_Pr->SiS_P3d4, 0x31, 0xF7);
  915.      if(ModeNo == 0x13) bp+4 = 0x03;
  916.   } else {
  917.      /* From 650/301LVx BIOS: */
  918.      SiS_SetRegAND(SiS_Pr->SiS_P3d4, 0x31, 0xF7);
  919.      if(ModeNo == 0x13) bp+4 = 0x03;
  920.      else bp+4 = ModeNo;
  921.   }
  922. #endif
  923.   /* TW: 630/301B and 650/301 (not 301LV!) BIOSes do more here, but this seems for DOS mode */
  924. }
  925. void
  926. SiS_GetRAMDAC2DATA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
  927.                    USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
  928. {
  929.   USHORT tempax,tempbx,temp;
  930.   USHORT temp1,temp2,modeflag=0,tempcx;
  931.   USHORT StandTableIndex,CRT1Index;
  932.   USHORT ResInfo,DisplayType;
  933.   const  SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr = NULL;
  934.   SiS_Pr->SiS_RVBHCMAX  = 1;
  935.   SiS_Pr->SiS_RVBHCFACT = 1;
  936.   if(ModeNo <= 0x13){
  937.      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  938.      StandTableIndex = SiS_GetModePtr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex);
  939.      tempax = SiS_Pr->SiS_StandTable[StandTableIndex].CRTC[0];
  940.      tempbx = SiS_Pr->SiS_StandTable[StandTableIndex].CRTC[6];
  941.      temp1 = SiS_Pr->SiS_StandTable[StandTableIndex].CRTC[7];
  942.   } else {
  943.      if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) ) {
  944.      temp = SiS_GetLVDSCRT1Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
  945. RefreshRateTableIndex,&ResInfo,&DisplayType);
  946.      if(temp == 0)  return;
  947.      switch(DisplayType) {
  948.      case 0 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_1; break;
  949.      case 1 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1;          break;
  950.      case 2 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_1;         break;
  951.      case 3 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_1_H;         break;
  952.      case 4 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1_H;        break;
  953.      case 5 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_1_H;       break;
  954.      case 6 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_2;           break;
  955.      case 7 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_2;          break;
  956.      case 8 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_2;         break;
  957.      case 9 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_2_H;         break;
  958.      case 10: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_2_H;        break;
  959.      case 11: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_2_H;       break;
  960. case 12: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1XXXxXXX_1;           break;
  961. case 13: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1XXXxXXX_1_H;         break;
  962. case 14: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11400x1050_1;         break;
  963. case 15: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11400x1050_1_H;       break;
  964. case 16: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11400x1050_2;         break;
  965. case 17: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11400x1050_2_H;       break;
  966.      case 18: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1UNTSC;               break;
  967.      case 19: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1ONTSC;               break;
  968.      case 20: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1UPAL;                break;
  969.      case 21: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1OPAL;                break;
  970.      case 22: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1320x480_1;           break;
  971. case 23: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x600_1;          break;
  972.      case 24: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x600_1_H;        break;
  973.      case 25: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x600_2;          break;
  974.      case 26: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x600_2_H;        break;
  975.      case 27: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11152x768_1;          break;
  976.      case 28: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11152x768_1_H;        break;
  977.      case 29: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11152x768_2;          break;
  978.      case 30: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11152x768_2_H;        break;
  979. case 36: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11600x1200_1;         break;
  980. case 37: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11600x1200_1_H;       break;
  981. case 38: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11600x1200_2;         break;
  982. case 39: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11600x1200_2_H;       break;
  983.      }
  984.      temp1  = (LVDSCRT1Ptr+ResInfo)->CR[0];
  985.      temp2  = (LVDSCRT1Ptr+ResInfo)->CR[14];
  986.      tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
  987.      tempbx = (LVDSCRT1Ptr+ResInfo)->CR[6];
  988.      tempcx = (LVDSCRT1Ptr+ResInfo)->CR[13]<<8;
  989.      tempcx = tempcx & 0x0100;
  990.      tempcx = tempcx << 2;
  991.      tempbx = tempbx | tempcx;
  992.      temp1  = (LVDSCRT1Ptr+ResInfo)->CR[7];
  993.     } else {
  994.      modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  995.      CRT1Index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
  996. if(HwDeviceExtension->jChipType < SIS_315H) {
  997.         CRT1Index &= 0x3F;
  998. }
  999.      temp1  = (USHORT)SiS_Pr->SiS_CRT1Table[CRT1Index].CR[0];
  1000.      temp2  = (USHORT)SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14];
  1001.      tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
  1002.      tempbx = (USHORT)SiS_Pr->SiS_CRT1Table[CRT1Index].CR[6];
  1003.      tempcx = (USHORT)SiS_Pr->SiS_CRT1Table[CRT1Index].CR[13]<<8;
  1004.      tempcx = tempcx & 0x0100;
  1005.      tempcx = tempcx << 2;
  1006.      tempbx = tempbx | tempcx;
  1007.      temp1  = (USHORT)SiS_Pr->SiS_CRT1Table[CRT1Index].CR[7];
  1008.     }
  1009.   }
  1010.   if(temp1 & 0x01) tempbx |= 0x0100;
  1011.   if(temp1 & 0x20) tempbx |= 0x0200;
  1012.   tempax += 5;
  1013.   /* Charx8Dot is no more used (and assumed), so we set it */
  1014.   modeflag |= Charx8Dot;
  1015.   if(modeflag & Charx8Dot) tempax *= 8;
  1016.   else                     tempax *= 9;
  1017.   /* TW: From 650/301LVx 1.10.6s */
  1018.   if(modeflag & HalfDCLK)  tempax <<= 1;
  1019.   SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = tempax;
  1020.   tempbx++;
  1021.   SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_VT = tempbx;
  1022. }
  1023. void
  1024. SiS_UnLockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
  1025. {
  1026.   if(HwDeviceExtension->jChipType >= SIS_315H)
  1027.      SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2f,0x01);
  1028.   else
  1029.      SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x24,0x01);
  1030. }
  1031. void
  1032. SiS_LockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
  1033. {
  1034.   if(HwDeviceExtension->jChipType >= SIS_315H)
  1035.      SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2F,0xFE);
  1036.   else
  1037.       SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x24,0xFE);
  1038. }
  1039. void
  1040. SiS_EnableCRT2(SiS_Private *SiS_Pr)
  1041. {
  1042.   SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
  1043. }
  1044. /* Checked against all BIOSes */
  1045. void
  1046. SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
  1047. {
  1048.   USHORT tempah,pushax,temp=0;
  1049.   UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase;
  1050.   if (SiS_Pr->SiS_IF_DEF_LVDS == 0) {
  1051.       if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {   /* ===== TW: For 30xB/LV ===== */
  1052.         if(HwDeviceExtension->jChipType < SIS_315H) {
  1053.    /* 300 series */
  1054.    if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
  1055.       SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x08);
  1056.       SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1057.    }
  1058.    if(SiS_Is301B(SiS_Pr,BaseAddr)) {
  1059.       SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,0x3f);
  1060.       SiS_ShortDelay(SiS_Pr,1);
  1061.    }
  1062.    SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xDF);
  1063.    SiS_DisplayOff(SiS_Pr);
  1064.    SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
  1065.    SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
  1066.    SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension,BaseAddr);
  1067.    SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x80);
  1068.    SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x02,0x40);
  1069.    if( (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr))) ||
  1070.               (!(SiS_CR36BIOSWord23d(SiS_Pr,HwDeviceExtension))) ) {
  1071.       SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
  1072.               SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xFB,0x04);
  1073.    }
  1074.         } else {
  1075.    /* 310 series */
  1076. #ifdef SIS650301NEW  /* From 650/301LVx 1.10.6s */
  1077.    if(!(SiS_IsM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1078.        tempah = 0xef;
  1079.        if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1080.            tempah = 0xf7;
  1081.                }
  1082.        SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah);
  1083.    }
  1084.    SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
  1085.    if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1086.          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
  1087.    } else if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1088.    SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
  1089.            }
  1090.    SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00);
  1091.            pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06);
  1092.    SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1093.            if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1094.        SiS_DisplayOff(SiS_Pr);
  1095.        SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
  1096.        SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
  1097.        SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1E,0xDF);
  1098.    } else {
  1099.               SiS_DisplayOff(SiS_Pr);
  1100.       SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
  1101.       SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
  1102.       SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
  1103.       temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
  1104.               SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
  1105.       SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
  1106.       SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
  1107.    }
  1108.    tempah = 0x3f;
  1109.    if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1110.       tempah = 0x7f;
  1111.       if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1112.   tempah = 0xbf;
  1113.               }
  1114.    }
  1115.    SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,tempah);
  1116.    SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
  1117.    if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1118.       SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xdf);
  1119.    }
  1120.    if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1121.       if(!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr))) {
  1122.          if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1123.     SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00);
  1124.                  }
  1125.               }
  1126.    }
  1127.    SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
  1128. #else     /* TW: From 650/301LV BIOS */
  1129.    if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1130.          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
  1131.    SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1132.    } else if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1133.    SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
  1134.    SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1135.            }
  1136.            /* TW: 301B dependent code starts here in 650/301LV BIOS */
  1137.    if(SiS_Is301B(SiS_Pr,BaseAddr)) {
  1138.      tempah = 0x3f;
  1139.              SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,tempah);
  1140.            }
  1141.            SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xDF);
  1142.    SiS_DisplayOff(SiS_Pr);
  1143.            SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
  1144.            SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
  1145.    temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
  1146.            SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
  1147.    SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
  1148.    SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
  1149.    /* TW: Inserted from 650/301LV BIOS */
  1150.    if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1151.        if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1152.            if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1153.           SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
  1154.   SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00);
  1155.   SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 4);
  1156.                    } else if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1157.                           SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
  1158.   SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00);
  1159.   SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 4);
  1160.    }
  1161.        }
  1162.     } else if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1163.        if(!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr))) {
  1164.             SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 2);
  1165.     SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00);
  1166.     SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 4);
  1167.                } else if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1168.            if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1169.           SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 2);
  1170.   SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00);
  1171.   SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 4);
  1172.                    } else if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1173.                           SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 2);
  1174.   SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00);
  1175.   SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 4);
  1176.    }
  1177.        }
  1178.    } /* TW: 650/301LV end */
  1179. #endif
  1180. }
  1181.       } else {     /* ============ TW: For 301 ================ */
  1182.         if(HwDeviceExtension->jChipType < SIS_315H) {
  1183.             if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr)) {
  1184.                 SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF0,0x0B);
  1185.         SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 1);
  1186.     }
  1187. }
  1188.         SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xDF);           /* disable VB */
  1189.         SiS_DisplayOff(SiS_Pr);
  1190.         if(HwDeviceExtension->jChipType >= SIS_315H) {
  1191.             SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
  1192. }
  1193.         SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);                /* disable lock mode */
  1194. if(HwDeviceExtension->jChipType >= SIS_315H) {
  1195.             temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
  1196.             SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
  1197.     SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
  1198.     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
  1199. } else {
  1200.             SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);            /* disable CRT2 */
  1201. }
  1202.       }
  1203.   } else {     /* ============ TW: For LVDS =============*/
  1204.     if(HwDeviceExtension->jChipType < SIS_315H) {
  1205. /* 300 series */
  1206. if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
  1207. #if 0 /* TW: Implemented this for power saving, but it's not worth
  1208.          *     the problems
  1209.  */
  1210.     if(SiS_Pr->SiS_Backup70xx == 0xff) {
  1211. SiS_Pr->SiS_Backup70xx = SiS_GetCH700x(SiS_Pr,0x0e);
  1212.     }
  1213. #endif
  1214.     SiS_SetCH700x(SiS_Pr,0x090E);
  1215. }
  1216. if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x11) & 0x08)) {
  1217.     if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
  1218.         if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
  1219.                      SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
  1220.      if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06) & 0x1c)) {
  1221.          SiS_DisplayOff(SiS_Pr);
  1222.              }
  1223.              SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x08);
  1224.              SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1225.                 }
  1226.             }
  1227. }
  1228. SiS_DisplayOff(SiS_Pr);
  1229. SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
  1230. SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
  1231. SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension,BaseAddr);
  1232. SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x80);
  1233. SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x02,0x40);
  1234. if( (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr))) ||
  1235.               (!(SiS_CR36BIOSWord23d(SiS_Pr,HwDeviceExtension))) ) {
  1236. SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
  1237. SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xFB,0x04);
  1238. }
  1239.     } else {
  1240. /* 310 series */
  1241. if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
  1242. if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1243. SiS_Chrontel701xBLOff(SiS_Pr);
  1244. SiS_Chrontel701xOff(SiS_Pr);
  1245. } else if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1246. SiS_Chrontel701xBLOff(SiS_Pr);
  1247. SiS_Chrontel701xOff(SiS_Pr);
  1248. }
  1249. if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1250. SiS_SetCH701x(SiS_Pr,0x0149);
  1251. } else if(SiS_IsTVOrYPbPr(SiS_Pr,HwDeviceExtension, BaseAddr))  {
  1252. SiS_SetCH701x(SiS_Pr,0x0149);
  1253. }
  1254. }
  1255. if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1256. SiS_DisplayOff(SiS_Pr);
  1257. } else if(!(SiS_IsTVOrYPbPr(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1258. SiS_DisplayOff(SiS_Pr);
  1259. }
  1260. if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1261. SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
  1262. } else if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1263. SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
  1264. }
  1265. SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
  1266. if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1267. SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
  1268. } else if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1269. SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
  1270. }
  1271. if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1272. SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
  1273. }
  1274. if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1275. SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xff);
  1276. } else {
  1277. SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
  1278. }
  1279. SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension, BaseAddr);
  1280. if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1281. SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
  1282. } else if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1283. SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
  1284. }
  1285. #if 0  /* TW: BIOS code makes no sense */
  1286.        if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1287.            if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1288.         if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1289.   /* Nothing there! */
  1290. }
  1291.            }
  1292.        }
  1293. #endif
  1294.     }  /* 310 series */
  1295.   }  /* LVDS */
  1296. }
  1297. /* TW: Checked against all BIOSes */
  1298. void
  1299. SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
  1300. {
  1301.   USHORT temp=0,tempah,pushax,temp1;
  1302.   UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase;
  1303.   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
  1304.     if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {   /* TW: ====== For 301B et al  ====== */
  1305.       if(HwDeviceExtension->jChipType < SIS_315H) {
  1306.          /* 300 series */
  1307.  if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr)) {
  1308.     SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xFB);
  1309.     if(!(SiS_CR36BIOSWord23d(SiS_Pr,HwDeviceExtension))) {
  1310.        SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 0);
  1311.     }
  1312.     SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);   /* Enable CRT2 */
  1313. /*     DoSomeThingPCI_On(SiS_Pr) */
  1314.             SiS_DisplayOn(SiS_Pr);
  1315.     SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension, BaseAddr);
  1316.     SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x02,0xBF);
  1317.     if(SiS_BridgeInSlave(SiS_Pr)) {
  1318.        SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x01,0x1F);
  1319.            } else {
  1320.        SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0x1F,0x40);
  1321.             }
  1322.     if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
  1323.         if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
  1324.     if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
  1325.         SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
  1326.                     }
  1327.     SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
  1328.                     SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x00);
  1329.                 }
  1330.     }
  1331.          } else {
  1332.    temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF;             /* lock mode */
  1333.            if(SiS_BridgeInSlave(SiS_Pr)) {
  1334.               tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
  1335.               if(!(tempah & SetCRT2ToRAMDAC))  temp |= 0x20;
  1336.            }
  1337.            SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
  1338.    SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
  1339.    SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1F,0x20);        /* enable VB processor */
  1340.    if(SiS_Is301B(SiS_Pr,BaseAddr)) {
  1341.               SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0);
  1342.       SiS_DisplayOn(SiS_Pr);
  1343.    } else {
  1344.       SiS_VBLongWait(SiS_Pr);
  1345.       SiS_DisplayOn(SiS_Pr);
  1346.       SiS_VBLongWait(SiS_Pr);
  1347.    }
  1348.  }
  1349.       } else {
  1350.          /* 310 series */
  1351. #ifdef SIS650301NEW   /* TW: From 650/301LVx 1.10.6s */
  1352.          if(!(SiS_IsM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1353.        tempah = 0x10;
  1354.        if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1355.            tempah = 0x08;
  1356.                }
  1357.        SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,tempah);
  1358.  }
  1359.  SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00);
  1360.  SiS_DisplayOff(SiS_Pr);
  1361.  pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06);
  1362.  if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
  1363.      (SiS_CRT2IsLCD(SiS_Pr,BaseAddr)) ) {
  1364.              if(!(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) {
  1365.         SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1366. SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1367. SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
  1368.      }
  1369.  }
  1370.  if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1371.              temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
  1372.      if(SiS_BridgeInSlave(SiS_Pr)) {
  1373.                 tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
  1374.                 if(!(tempah & SetCRT2ToRAMDAC))  temp |= 0x20;
  1375.              }
  1376.              SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
  1377.      SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);                   /* enable CRT2 */
  1378.      SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
  1379.  }
  1380.  if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1381.      SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x20);
  1382.  }
  1383.  SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1f,0x20);
  1384.  tempah = 0xc0;
  1385.  if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1386.      tempah = 0x80;
  1387.      if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1388.         tempah = 0x40;
  1389.              }
  1390.  }
  1391.          SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,tempah);
  1392.  SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x80);
  1393.  if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1394.     if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
  1395.         ((SiS_CRT2IsLCD(SiS_Pr,BaseAddr))) ) {
  1396. SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1397. SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1398. SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1399. SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1400. SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1401. SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1402. SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1403. SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1404. SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1405. SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
  1406.                 SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
  1407. SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01);
  1408.     }
  1409.  }
  1410.  SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
  1411.  SiS_DisplayOn(SiS_Pr);
  1412.  SiS_SetReg3(SiS_Pr->SiS_P3c6,0xff);
  1413.  if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1414.      SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
  1415.  }
  1416.          SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
  1417.  SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x0c);
  1418.  SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20);
  1419.  SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x05);
  1420.  SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x60);
  1421.  SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x00);
  1422.  SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
  1423.  SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40);
  1424. #else  /* TW: From 650/301LV BIOS (different PanelDelay!) */
  1425.  if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1426.      SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfd,0x02);
  1427.      SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 0);
  1428.  } else if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr)) {
  1429.      SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfd,0x02);
  1430.      SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 0);
  1431.  }
  1432.  /* TW: --- end --- */
  1433.          if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1434.             temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
  1435.     if(SiS_BridgeInSlave(SiS_Pr)) {
  1436.                tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
  1437.                if(!(tempah & SetCRT2ToRAMDAC))  temp |= 0x20;
  1438.             }
  1439.             SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
  1440.     SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);                   /* enable CRT2 */
  1441. /*          SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2E,0x7F);   */  /* TW: Not done in 650/301LV BIOS */
  1442.             temp=SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E);
  1443.             if (!(temp & 0x80))
  1444.                    SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
  1445.           }
  1446.           SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1F,0x20);        /* enable VB processor */
  1447.           if(SiS_Is301B(SiS_Pr,BaseAddr)) {
  1448.              SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0xc0);
  1449.              if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)))   /* TW: "if" new from 650/301LV BIOS */
  1450.         SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7F);
  1451.           } else {
  1452.              SiS_VBLongWait(SiS_Pr);
  1453.              SiS_DisplayOn(SiS_Pr);
  1454.      if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)))  {  /* TW: "if" new from 650/301LV BIOS */
  1455.         SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7F);
  1456.                 SiS_VBLongWait(SiS_Pr);
  1457.      }
  1458.           }
  1459.   /* TW: Entire section from 650/301LV BIOS */
  1460.   if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1461.      if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1462. /*         if (!(SiS_WeHaveBacklightCtrl(HwDeviceExtension, BaseAddr))) {  */ /* TW: BIOS code makes no sense */
  1463.    SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
  1464.    SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
  1465.    SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x01);
  1466. /*              }   */
  1467.              } else if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr)) {
  1468. /*         if (!(SiS_WeHaveBacklightCtrl(HwDeviceExtension, BaseAddr))) {  */ /* TW: BIOS code makes no sense */
  1469.    SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
  1470.    SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
  1471.    SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x01);
  1472. /*              }   */
  1473.      }
  1474.   }
  1475. #endif
  1476.       }
  1477.     } else { /* ============  TW: For 301 ================ */
  1478.        if(HwDeviceExtension->jChipType < SIS_315H) {
  1479.             if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr)) {
  1480.                 SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF0,0x0B);
  1481.         SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 0);
  1482.     }
  1483.        }
  1484.        temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF;          /* lock mode */
  1485.        if(SiS_BridgeInSlave(SiS_Pr)) {
  1486.          tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
  1487.          if(!(tempah & SetCRT2ToRAMDAC))  temp |= 0x20;
  1488.        }
  1489.        SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
  1490.        SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);                  /* enable CRT2 */
  1491.        if(HwDeviceExtension->jChipType >= SIS_315H) {
  1492.          temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E);
  1493.          if(!(temp & 0x80))
  1494.            SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);         /* BVBDOENABLE=1 */
  1495.        }
  1496.        SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1F,0x20);     /* enable VB processor */
  1497.        SiS_VBLongWait(SiS_Pr);
  1498.        SiS_DisplayOn(SiS_Pr);
  1499.        if(HwDeviceExtension->jChipType >= SIS_315H) {
  1500.            SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
  1501.        }
  1502.        SiS_VBLongWait(SiS_Pr);
  1503.        if(HwDeviceExtension->jChipType < SIS_315H) {
  1504.             if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr)) {
  1505.         SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 1);
  1506.                 SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF0,0x03);
  1507.     }
  1508.        }
  1509.     }
  1510.   } else {   /* =================== TW: For LVDS ================== */
  1511.     if(HwDeviceExtension->jChipType < SIS_315H) {
  1512.       /* 300 series */
  1513.       if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr)) {
  1514.          SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xFB);
  1515.  if(!(SiS_CR36BIOSWord23d(SiS_Pr,HwDeviceExtension))) {
  1516.     SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 0);
  1517.  }
  1518.       }
  1519.       SiS_EnableCRT2(SiS_Pr);
  1520.       SiS_DisplayOn(SiS_Pr);
  1521.       SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension, BaseAddr);
  1522.       SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x02,0xBF);
  1523.       if(SiS_BridgeInSlave(SiS_Pr)) {
  1524.        SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x01,0x1F);
  1525.       } else {
  1526.        SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0x1F,0x40);
  1527.       }
  1528.       if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
  1529.         if(!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr))) {
  1530. #if 0 /* TW: Implemented this for power saving, but it's not worth
  1531.          *     the problems
  1532.  */
  1533.            if(SiS_Pr->SiS_Backup70xx != 0xff) {
  1534. SiS_SetCH700x(SiS_Pr,((SiS_Pr->SiS_Backup70xx<<8)|0x0E));
  1535. SiS_Pr->SiS_Backup70xx = 0xff;
  1536.    } else
  1537. #endif
  1538.         SiS_SetCH700x(SiS_Pr,0x0B0E);
  1539.         }
  1540.       }
  1541.       if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr)) {
  1542.           if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
  1543.               if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
  1544.           if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
  1545. SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
  1546.          SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
  1547.   }
  1548.   SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
  1549.                   SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xF7);
  1550.               }
  1551.   }
  1552.       }
  1553.     } else {
  1554.        /* 310 series */
  1555. #if 0  /* BIOS code makes no sense */
  1556.        if(SiS_IsVAMode()) {
  1557.           if(SiS_IsLCDOrLCDA()) {
  1558.   }
  1559.        }
  1560. #endif
  1561.        SiS_EnableCRT2(SiS_Pr);
  1562.        SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension, BaseAddr);
  1563.        SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
  1564.        if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
  1565.           temp = SiS_GetCH701x(SiS_Pr,0x66);
  1566.   temp &= 0x20;
  1567.   SiS_Chrontel701xBLOff(SiS_Pr);
  1568.        }
  1569.        SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
  1570.        temp1 = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E);
  1571.        if (!(temp1 & 0x80))
  1572.            SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
  1573.        if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
  1574.            if(temp) {
  1575.        SiS_Chrontel701xBLOn(SiS_Pr);
  1576.    }
  1577.        }
  1578.        if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1579.            SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
  1580.        }
  1581.        if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1582.            SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
  1583.        }
  1584.        if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
  1585.         if(SiS_IsTVOrYPbPr(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1586.             SiS_Chrontel701xOn(SiS_Pr,HwDeviceExtension, BaseAddr);
  1587.           }
  1588.           if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1589.             SiS_ChrontelDoSomething1(SiS_Pr,HwDeviceExtension, BaseAddr);
  1590.           } else if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1591.             SiS_ChrontelDoSomething1(SiS_Pr,HwDeviceExtension, BaseAddr);
  1592.          }
  1593.        }
  1594.        if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
  1595.           if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1596.       if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
  1597.              SiS_Chrontel701xBLOn(SiS_Pr);
  1598.              SiS_ChrontelDoSomething4(SiS_Pr,HwDeviceExtension, BaseAddr);
  1599.             } else if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension, BaseAddr))  {
  1600. /*        if(!SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {  */ /* TW: makes no sense */
  1601.              SiS_Chrontel701xBLOn(SiS_Pr);
  1602.              SiS_ChrontelDoSomething4(SiS_Pr,HwDeviceExtension, BaseAddr);
  1603. /*             }   */
  1604.     }
  1605.         }
  1606.        }
  1607.     } /* 310 series */
  1608.   }  /* LVDS */
  1609. }
  1610. void
  1611. SiS_SiS30xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1612. {
  1613.   USHORT  BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;
  1614.   /* TW: Switch on LCD backlight on SiS30x */
  1615.   if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
  1616.       (SiS_CRT2IsLCD(SiS_Pr,BaseAddr)) ) {
  1617.     if(!(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) {
  1618. SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
  1619. SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
  1620.     }
  1621.     if(!(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x26) & 0x01)) {
  1622.         SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
  1623.     }
  1624.   }
  1625. }
  1626. void
  1627. SiS_SiS30xBLOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1628. {
  1629.   USHORT  BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;
  1630.   /* TW: Switch off LCD backlight on SiS30x */
  1631.   if( (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
  1632.       (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ) {
  1633.  SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
  1634.   }
  1635.   if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1636.       if(!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr))) {
  1637.           if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
  1638.          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00);
  1639.           }
  1640.       }
  1641.   }
  1642. }
  1643. BOOLEAN
  1644. SiS_CR36BIOSWord23b(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1645. {
  1646.   USHORT temp,temp1;
  1647.   UCHAR *ROMAddr;
  1648.   if((ROMAddr = (UCHAR *)HwDeviceExtension->pjVirtualRomBase) && SiS_Pr->SiS_UseROM) {
  1649.      temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xff;
  1650.      temp >>= 4;
  1651.      temp = 1 << temp;
  1652.      temp1 = (ROMAddr[0x23c] << 8) | ROMAddr[0x23b];
  1653.      if(temp1 & temp) return(1);
  1654.      else return(0);
  1655.   } else {
  1656.      return(0);
  1657.   }
  1658. }
  1659. BOOLEAN
  1660. SiS_CR36BIOSWord23d(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1661. {
  1662.   USHORT temp,temp1;
  1663.   UCHAR *ROMAddr;
  1664.   if((ROMAddr = (UCHAR *)HwDeviceExtension->pjVirtualRomBase) && SiS_Pr->SiS_UseROM) {
  1665.      temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xff;
  1666.      temp >>= 4;
  1667.      temp = 1 << temp;
  1668.      temp1 = (ROMAddr[0x23e] << 8) | ROMAddr[0x23d];
  1669.      if(temp1 & temp) return(1);
  1670.      else return(0);
  1671.   } else {
  1672.      return(0);
  1673.   }
  1674. }
  1675. void
  1676. SiS_SetPanelDelay(SiS_Private *SiS_Pr, UCHAR *ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
  1677.                   USHORT DelayTime)
  1678. {
  1679.   USHORT PanelID, DelayIndex, Delay, temp;
  1680.   if(HwDeviceExtension->jChipType < SIS_315H) {
  1681.       if(SiS_Pr->SiS_IF_DEF_LVDS == 1) { /* 300 series, LVDS */
  1682.   PanelID = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
  1683.   DelayIndex = PanelID >> 4;
  1684.   if((DelayTime >= 2) && ((PanelID & 0x0f) == 1))  {
  1685.               Delay = 3;
  1686.           } else {
  1687.               if(DelayTime >= 2) DelayTime -= 2;
  1688.               if(!(DelayTime & 0x01)) {
  1689.           Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[0];
  1690.               } else {
  1691.           Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[1];
  1692.               }
  1693.       if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
  1694.                   if(ROMAddr[0x220] & 0x40) {
  1695.                       if(!(DelayTime & 0x01)) {
  1696.                Delay = (USHORT)ROMAddr[0x225];
  1697.                       } else {
  1698.                Delay = (USHORT)ROMAddr[0x226];
  1699.                       }
  1700.                   }
  1701.               }
  1702.           }
  1703.   SiS_ShortDelay(SiS_Pr,Delay);
  1704.       } else { /* 300 series, 301(B) */
  1705.   PanelID = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
  1706.   temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x18);
  1707.           if(!(temp & 0x10))  PanelID = 0x12;
  1708.           DelayIndex = PanelID >> 4;
  1709.   if((DelayTime >= 2) && ((PanelID & 0x0f) == 1))  {
  1710.               Delay = 3;
  1711.           } else {
  1712.               if(DelayTime >= 2) DelayTime -= 2;
  1713.               if(!(DelayTime & 0x01)) {
  1714.           Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[0];
  1715.               } else {
  1716.           Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[1];
  1717.               }
  1718.       if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
  1719.                   if(ROMAddr[0x220] & 0x40) {
  1720.                       if(!(DelayTime & 0x01)) {
  1721.                Delay = (USHORT)ROMAddr[0x225];
  1722.                       } else {
  1723.                Delay = (USHORT)ROMAddr[0x226];
  1724.                       }
  1725.                   }
  1726.               }
  1727.           }
  1728.   SiS_ShortDelay(SiS_Pr,Delay);
  1729.       }
  1730.    } else {
  1731.       if(SiS_Pr->SiS_IF_DEF_LVDS == 1) { /* 310/325 series, LVDS */
  1732.           /* TW: Not currently used */
  1733.       } else { /* 310/325 series, 301(B) */
  1734.           PanelID = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
  1735.   DelayIndex = PanelID >> 4;
  1736.           if(!(DelayTime & 0x01)) {
  1737.         Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[0];
  1738.           } else {
  1739.         Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[1];
  1740.           }
  1741.   SiS_DDC2Delay(SiS_Pr, Delay * 4);
  1742.       }
  1743.    }
  1744. }
  1745. void
  1746. SiS_LongDelay(SiS_Private *SiS_Pr, USHORT delay)
  1747. {
  1748.   while(delay--) {
  1749.     SiS_GenericDelay(SiS_Pr,0x19df);
  1750.   }
  1751. }
  1752. void
  1753. SiS_ShortDelay(SiS_Private *SiS_Pr, USHORT delay)
  1754. {
  1755.   while(delay--) {
  1756.       SiS_GenericDelay(SiS_Pr,0x42);
  1757.   }
  1758. }
  1759. void
  1760. SiS_GenericDelay(SiS_Private *SiS_Pr, USHORT delay)
  1761. {
  1762.   USHORT temp,flag;
  1763.   flag = SiS_GetReg3(0x61) & 0x10;
  1764.   while(delay) {
  1765.       temp = SiS_GetReg3(0x61) & 0x10;
  1766.       if(temp == flag) continue;
  1767.       flag = temp;
  1768.       delay--;
  1769.   }
  1770. }
  1771. BOOLEAN
  1772. SiS_Is301B(SiS_Private *SiS_Pr, USHORT BaseAddr)
  1773. {
  1774.   USHORT flag;
  1775.   flag = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x01);
  1776.   if(flag >= 0x0B0) return(1);
  1777.   else return(0);
  1778. }
  1779. BOOLEAN
  1780. SiS_CRT2IsLCD(SiS_Private *SiS_Pr, USHORT BaseAddr)
  1781. {
  1782.   USHORT flag;
  1783.   flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
  1784.   if(flag & 0x20) return(1);
  1785.   else return(0);
  1786. }
  1787. BOOLEAN
  1788. SiS_IsDualEdge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
  1789. {
  1790. #ifdef SIS315H
  1791.   USHORT flag;
  1792.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  1793.      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
  1794.      if(flag & EnableDualEdge)  return(1);
  1795.      else  return(0);
  1796.   } else
  1797. #endif
  1798.      return(0);
  1799. }
  1800. BOOLEAN
  1801. SiS_IsVAMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
  1802. {
  1803. #ifdef SIS315H
  1804.   USHORT flag;
  1805.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  1806.      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
  1807.      if((flag & EnableDualEdge) && (flag & SetToLCDA))   return(1);
  1808. #if 0 /* Not done in 650/301LVx 1.10.6s, but in 650/301LV */
  1809.      else if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
  1810.        if(flag) return(1);
  1811.        else     return(0);             
  1812.      }
  1813. #endif
  1814.      else
  1815.        return(0);
  1816.   } else
  1817. #endif
  1818.      return(0);
  1819.  }
  1820. BOOLEAN
  1821. SiS_WeHaveBacklightCtrl(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
  1822. {
  1823. #ifdef SIS315H
  1824.   USHORT flag;
  1825.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  1826.      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x79);
  1827.      if(flag & 0x10)  return(1);
  1828.      else             return(0);
  1829.   } else
  1830. #endif
  1831.      return(0);
  1832.  }
  1833. #if 0
  1834. BOOLEAN
  1835. SiS_Is315E(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
  1836. {
  1837. #ifdef SIS315H
  1838.   USHORT flag;
  1839.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  1840.      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f);
  1841.      if(flag & 0x10)  return(1);
  1842.      else             return(0);
  1843.   } else
  1844. #endif
  1845.      return(0);
  1846. }
  1847. #endif
  1848. BOOLEAN
  1849. SiS_IsM650or651(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
  1850. {
  1851. #ifdef SIS315H
  1852.   USHORT flag;
  1853.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  1854.      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f);
  1855.      flag &= 0xF0;
  1856.      if((flag == 0xb0) || (flag == 0x90)) return 0;
  1857.      else return 1;
  1858.   } else
  1859. #endif
  1860.     return 1;
  1861. }
  1862. BOOLEAN
  1863. SiS_IsYPbPr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
  1864. {
  1865. #ifdef SIS315H
  1866.   USHORT flag;
  1867.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  1868.      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
  1869.      if(flag & 0x08)  return(1);
  1870.      else             return(0);
  1871.   } else
  1872. #endif
  1873.      return(0);
  1874. }
  1875. BOOLEAN
  1876. SiS_IsTVOrYPbPr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
  1877. {
  1878.   USHORT flag;
  1879. #ifdef SIS315H
  1880.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  1881.      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
  1882.      if(flag & SetCRT2ToTV) return(1);
  1883.      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
  1884.      if(flag & 0x08)        return(1);
  1885.      else                   return(0);
  1886.   } else
  1887. #endif
  1888.   {
  1889.      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
  1890.      if(flag & SetCRT2ToTV) return(1);
  1891.   }
  1892.   return(0);
  1893. }
  1894. BOOLEAN
  1895. SiS_IsLCDOrLCDA(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
  1896. {
  1897.   USHORT flag;
  1898. #ifdef SIS315H
  1899.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  1900.      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
  1901.      if(flag & SetCRT2ToLCD) return(1);
  1902.      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
  1903.      if(flag & SetToLCDA)    return(1);
  1904.      else                    return(0);
  1905.   } else
  1906. #endif
  1907.   {
  1908.    flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
  1909.    if(flag & SetCRT2ToLCD)   return(1);
  1910.   }
  1911.   return(0);
  1912. }
  1913. BOOLEAN
  1914. SiS_IsDisableCRT2(SiS_Private *SiS_Pr, USHORT BaseAddr)
  1915. {
  1916.   USHORT flag;
  1917.   flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
  1918.   if(flag & 0x20) return(0);
  1919.   else            return(1);
  1920. }
  1921. BOOLEAN
  1922. SiS_BridgeIsOn(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1923. {
  1924.   USHORT flag;
  1925.   if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
  1926.      return(0);    /* TW: Changed from 1 to 0! */
  1927.   } else {
  1928. #if 0   /* TW: Commented for test on bridge-less systems */
  1929.      if(HwDeviceExtension->jChipType >= SIS_315H) {     /* TW: New (from 630/301B BIOS - not done there) */
  1930. #endif
  1931.         flag = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x00);
  1932.         if((flag == 1) || (flag == 2)) return(0);       /* TW: Changed from 1 to 0! */
  1933.         else return(1);                                 /* TW: Changed from 0 to 1! */
  1934. #if 0
  1935.      } else  return(0); /* TW: New (from 630/301B BIOS - always return 0) */
  1936. #endif
  1937.   }
  1938. }
  1939. BOOLEAN
  1940. SiS_BridgeIsEnable(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1941. {
  1942.   USHORT flag;
  1943.   if(!(SiS_BridgeIsOn(SiS_Pr,BaseAddr,HwDeviceExtension))) {
  1944.     flag = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
  1945.     if(HwDeviceExtension->jChipType < SIS_315H) {
  1946.       /* 300 series (630/301B 2.04.5a) */
  1947.       flag &= 0xa0;
  1948.       if((flag == 0x80) || (flag == 0x20)) return 0;
  1949.       else                            return 1;
  1950.     } else {
  1951.       /* 310/325 series (650/301LVx 1.10.6s) */
  1952.       flag &= 0x50;
  1953.       if((flag == 0x40) || (flag == 0x10)) return 0;
  1954.       else                                 return 1;
  1955.     }
  1956.   }
  1957.   return 1;
  1958. }
  1959. BOOLEAN
  1960. SiS_BridgeInSlave(SiS_Private *SiS_Pr)
  1961. {
  1962.   USHORT flag1;
  1963.   flag1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31);
  1964.   if(flag1 & (SetInSlaveMode >> 8)) return 1;
  1965.   else return 0;
  1966. }
  1967. /* TW: New from 650/301LV(x) 1.10.6s BIOS */
  1968. void
  1969. SiS_SetHiVision(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1970. {
  1971.   USHORT temp;
  1972.   SiS_Pr->SiS_HiVision = 0;
  1973.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  1974.      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
  1975. #if 0   /* TW: Old */
  1976.         if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
  1977.            SiS_Pr->SiS_HiVision = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
  1978.    SiS_Pr->SiS_HiVision &= 0x38;
  1979.    SiS_Pr->SiS_HiVision >>= 3;
  1980.         }
  1981. #endif  /* TW: New from 650/301LVx BIOS 1.10.6s */
  1982.         temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
  1983. if(temp & 0x40) {
  1984.     temp &= 0x30;
  1985.     switch(temp) {
  1986.       case 0x00: SiS_Pr->SiS_HiVision = 4; break;
  1987.       case 0x10: SiS_Pr->SiS_HiVision = 1; break;
  1988.       case 0x20: SiS_Pr->SiS_HiVision = 2; break;
  1989.       default:   SiS_Pr->SiS_HiVision = 3; break;
  1990.     }
  1991. }
  1992.      }
  1993.   }
  1994. }
  1995. /* TW: Checked against 630/LVDS 2.08, 650/LVDS and 650/301LV BIOS */
  1996. BOOLEAN
  1997. SiS_GetLCDResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,
  1998.                   USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1999. {
  2000.   USHORT temp,modeflag,resinfo=0;
  2001.   const unsigned char SiS300SeriesLCDRes[] =
  2002.          { 0, 1, 2, 3, 7, 4, 5, 8,
  2003.    0, 0, 0, 0, 0, 0, 0, 0 };
  2004.   SiS_Pr->SiS_LCDResInfo = 0;
  2005.   SiS_Pr->SiS_LCDTypeInfo = 0;
  2006.   SiS_Pr->SiS_LCDInfo = 0;
  2007.   if (ModeNo<=0x13) {
  2008.      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  2009.   } else {
  2010.      modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  2011.      resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
  2012.   }
  2013.   if(!(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)))   return 0;
  2014.   if(!(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SwitchToCRT2))) return 0;
  2015.   temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
  2016.   /* FSTN: Fake CR36 (TypeInfo 2, ResInfo SiS_Panel320x480) */
  2017.   if(SiS_Pr->SiS_IF_DEF_FSTN){
  2018.     temp = 0x20 | SiS_Pr->SiS_Panel320x480;
  2019.     SiS_SetReg1(SiS_Pr->SiS_P3d4,0x36,temp);
  2020.   }
  2021.   SiS_Pr->SiS_LCDTypeInfo = temp >> 4;
  2022.   temp &= 0x0f;
  2023.   if(HwDeviceExtension->jChipType < SIS_315H) {
  2024.       /* TW: Translate 300 series LCDRes to 310/325 series for unified usage */
  2025.       temp = SiS300SeriesLCDRes[temp];
  2026.   }
  2027.   SiS_Pr->SiS_LCDResInfo = temp;
  2028.   if(SiS_Pr->SiS_IF_DEF_FSTN){
  2029.         SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_Panel320x480;
  2030.   }
  2031.   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
  2032.      if(SiS_Pr->SiS_LCDResInfo < SiS_Pr->SiS_PanelMin301)
  2033. SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_PanelMin301;
  2034.   } else {
  2035.      if(SiS_Pr->SiS_LCDResInfo < SiS_Pr->SiS_PanelMinLVDS)
  2036. SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_PanelMinLVDS;
  2037.   }
  2038.   if(SiS_Pr->SiS_LCDResInfo > SiS_Pr->SiS_PanelMax)
  2039.    SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_Panel1024x768;
  2040.   temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37);
  2041.   if(SiS_Pr->SiS_IF_DEF_FSTN){
  2042.         /* TW: Fake LVDS bridge for FSTN */
  2043.        temp = 0x04;
  2044.        SiS_SetReg1(SiS_Pr->SiS_P3d4,0x37,temp);
  2045.   }
  2046.   SiS_Pr->SiS_LCDInfo = temp;
  2047.   /* TW: Inserted entire 315-block from 650/LVDS/301+LVx BIOSes */
  2048.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  2049.      if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
  2050.          if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
  2051.      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
  2052.  if(ModeNo == 0x3a || ModeNo == 0x4d || ModeNo == 0x65) {
  2053.      SiS_Pr->SiS_LCDInfo |= LCDNonExpanding;
  2054.  }
  2055.      }
  2056.  }
  2057.      }
  2058.      if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x01) {
  2059.          SiS_Pr->SiS_LCDInfo &= 0xFFEF;    
  2060.  SiS_Pr->SiS_LCDInfo |= LCDPass11;
  2061.      }
  2062.   } else {
  2063.      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
  2064.         if((ROMAddr) && SiS_Pr->SiS_UseROM) {
  2065.            if(!(ROMAddr[0x235] & 0x02)) {
  2066.       SiS_Pr->SiS_LCDInfo &= 0xEF;
  2067.    }
  2068.         }
  2069.      } else {
  2070.         if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
  2071.    if((SiS_Pr->SiS_SetFlag & CRT2IsVGA) && ((ModeNo == 0x03) || (ModeNo == 0x10))) {
  2072.                SiS_Pr->SiS_LCDInfo &= 0xEF;
  2073.    }
  2074. }
  2075.      }
  2076.   }
  2077. #ifdef LINUX_KERNEL
  2078.   printk(KERN_INFO "sisfb: (LCDInfo = 0x%x LCDResInfo = 0x%x LCDTypeInfo = 0x%x)n",
  2079.                    SiS_Pr->SiS_LCDInfo, SiS_Pr->SiS_LCDResInfo, SiS_Pr->SiS_LCDTypeInfo);
  2080. #endif
  2081. #ifdef LINUX_XF86
  2082.   xf86DrvMsg(0, X_PROBED, "(init301: LCDInfo=0x%04x LCDResInfo=0x%02x LCDTypeInfo=0x%02x)n",
  2083. SiS_Pr->SiS_LCDInfo, SiS_Pr->SiS_LCDResInfo, SiS_Pr->SiS_LCDTypeInfo);
  2084. #endif
  2085.   /* TW: With Trumpion, always Expanding */
  2086.   if(SiS_Pr->SiS_IF_DEF_TRUMPION != 0){
  2087.        SiS_Pr->SiS_LCDInfo &= (~LCDNonExpanding);
  2088.   }
  2089.   if(!((HwDeviceExtension->jChipType < SIS_315H) && (SiS_Pr->SiS_SetFlag & CRT2IsVGA))) {
  2090.      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
  2091.         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
  2092.    if(ModeNo > 0x13) {
  2093.       if(!(SiS_Pr->SiS_LCDInfo & LCDNonExpanding)) {
  2094.                  if((resinfo == 7) || (resinfo == 3)) {
  2095.                     SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
  2096.  }
  2097.               }
  2098.            }
  2099.         }
  2100. if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
  2101.    SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
  2102. }
  2103.      }
  2104.      if(modeflag & HalfDCLK) {
  2105.         if(SiS_Pr->SiS_IF_DEF_TRUMPION == 0) {
  2106.            if(!(SiS_Pr->SiS_LCDInfo & LCDNonExpanding)) {
  2107.       if(!(((SiS_Pr->SiS_IF_DEF_LVDS == 1) || (HwDeviceExtension->jChipType < SIS_315H)) &&
  2108.                                       (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480))) {
  2109.                  if(ModeNo > 0x13) {
  2110.                     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
  2111.                        if(resinfo == 4) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;     /* 512x384  */
  2112.                     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
  2113.                        if(resinfo == 3) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;     /* 400x300  */
  2114.                     }
  2115.                  }
  2116.       } else SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
  2117.            } else SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
  2118.         } else SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
  2119.      }
  2120.   }
  2121.   /* TW: wdr: if (VBInfo & LCD) && (VBInfo & (SetSimuScanMode | SwitchToCRT2)) { */
  2122.   if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
  2123.      if(SiS_Pr->SiS_VBInfo & SetNotSimuMode) {
  2124.        SiS_Pr->SiS_SetFlag |= LCDVESATiming;
  2125.      }
  2126.   } else {
  2127.      SiS_Pr->SiS_SetFlag |= LCDVESATiming;
  2128.   }
  2129.   /* TW: Inserted from 650/301LVx BIOS 1.10.6s */
  2130.   if(SiS_Pr->SiS_VBType & VB_SIS30xNEW) {
  2131.       temp = 0x00;
  2132.       if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) temp = 0x04;
  2133.       if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) temp = 0x04;
  2134.       if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) temp = 0x04;
  2135.       SiS_SetReg1(SiS_Pr->SiS_P3d4,0x39,temp);
  2136.   } else if((HwDeviceExtension->jChipType > SIS_315H) && (SiS_Pr->SiS_IF_DEF_LVDS == 0)) {
  2137.       SiS_SetReg1(SiS_Pr->SiS_P3d4,0x39,0x00);
  2138.   }
  2139.   return 1;
  2140. }
  2141. void
  2142. SiS_PresetScratchregister(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
  2143. {
  2144.   return;
  2145.   /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x30,0x21);  */
  2146.   /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x31,0x41);  */
  2147.   /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x32,0x28);  */
  2148.   /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x33,0x22);  */
  2149.   /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x35,0x43);  */
  2150.   /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x36,0x01);  */
  2151.   /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x37,0x00);  */
  2152. }
  2153. void
  2154. SiS_LongWait(SiS_Private *SiS_Pr)
  2155. {
  2156.   USHORT i;
  2157.   i = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1F);
  2158.   if(!(i & 0xC0)) {
  2159.     for(i=0; i<0xFFFF; i++) {
  2160.        if(!(SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08))
  2161.          break;
  2162.     }
  2163.     for(i=0; i<0xFFFF; i++) {
  2164.        if((SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08))
  2165.          break;
  2166.     }
  2167.   }
  2168. }
  2169. void
  2170. SiS_VBLongWait(SiS_Private *SiS_Pr)
  2171. {
  2172.   if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
  2173.     SiS_VBWait(SiS_Pr);
  2174.   } else {
  2175.     SiS_LongWait(SiS_Pr);
  2176.   }
  2177.   return;
  2178. }
  2179. void
  2180. SiS_VBWait(SiS_Private *SiS_Pr)
  2181. {
  2182.   USHORT tempal,temp,i,j;
  2183.   temp = 0;
  2184.   for(i=0; i<3; i++) {
  2185.     for(j=0; j<100; j++) {
  2186.        tempal = SiS_GetReg2(SiS_Pr->SiS_P3da);
  2187.        if(temp & 0x01) {
  2188.           if((tempal & 0x08))  continue;
  2189.           if(!(tempal & 0x08)) break;
  2190.        } else {
  2191.           if(!(tempal & 0x08)) continue;
  2192.           if((tempal & 0x08))  break;
  2193.        }
  2194.     }
  2195.     temp ^= 0x01;
  2196.   }
  2197. }
  2198. void
  2199. SiS_WaitVBRetrace(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
  2200. {
  2201.   if(HwDeviceExtension->jChipType < SIS_315H) {
  2202.      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
  2203.         if(!(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x20)) return;
  2204.      }
  2205.      if(!(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x80)) {
  2206.         SiS_WaitRetrace1(SiS_Pr,HwDeviceExtension);
  2207.      } else {
  2208.         SiS_WaitRetrace2(SiS_Pr,HwDeviceExtension);
  2209.      }
  2210.   } else {
  2211.      if(!(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x40)) {
  2212.         SiS_WaitRetrace1(SiS_Pr,HwDeviceExtension);
  2213.      } else {
  2214.         SiS_WaitRetrace2(SiS_Pr,HwDeviceExtension);
  2215.      }
  2216.   }
  2217. }
  2218. void
  2219. SiS_WaitRetrace1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
  2220. {
  2221.   USHORT i,watchdog;
  2222.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  2223.      if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1f) & 0xc0) return;
  2224.      watchdog = 65535;
  2225.      while( (SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08) && --watchdog);
  2226.      watchdog = 65535;
  2227.      while( (!(SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08)) && --watchdog);
  2228.   } else {
  2229. #if 0  /* TW: Not done in A901 BIOS */
  2230.      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
  2231.         if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1f) & 0xc0) return;
  2232.      }
  2233. #endif
  2234.      for(i=0; i<10; i++) {
  2235.         watchdog = 65535;
  2236.         while( (SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08) && --watchdog);
  2237. if(watchdog) break;
  2238.      }
  2239.      for(i=0; i<10; i++) {
  2240.         watchdog = 65535;
  2241.         while( (!(SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08)) && --watchdog);
  2242. if(watchdog) break;
  2243.      }
  2244.   }
  2245. }
  2246. void
  2247. SiS_WaitRetraceDDC(SiS_Private *SiS_Pr)
  2248. {
  2249.   USHORT watchdog;
  2250.   if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1f) & 0xc0) return;
  2251.   watchdog = 65535;
  2252.   while( (SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08) && --watchdog);
  2253.   watchdog = 65535;
  2254.   while( (!(SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08)) && --watchdog);
  2255. }
  2256. void
  2257. SiS_WaitRetrace2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
  2258. {
  2259.   USHORT i,watchdog,temp;
  2260.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  2261.      watchdog = 65535;
  2262.      while( (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x30) & 0x02) && --watchdog);
  2263.      watchdog = 65535;
  2264.      while( (!(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x30) & 0x02)) && --watchdog);
  2265.   } else {
  2266.      for(i=0; i<10; i++) {
  2267.         watchdog = 65535;
  2268. while( (temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x25) & 0x02) && --watchdog);
  2269. if(watchdog) break;
  2270.      }
  2271.      for(i=0; i<10; i++) {
  2272.         watchdog = 65535;
  2273. while( (!(temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x25) & 0x02)) && --watchdog);
  2274. if(watchdog) break;
  2275.      }
  2276.   }
  2277. }
  2278. /* =========== Set and Get register routines ========== */
  2279. void
  2280. SiS_SetRegANDOR(USHORT Port,USHORT Index,USHORT DataAND,USHORT DataOR)
  2281. {
  2282.   USHORT temp;
  2283.   temp = SiS_GetReg1(Port,Index);     /* SiS_Pr->SiS_Part1Port index 02 */
  2284.   temp = (temp & (DataAND)) | DataOR;
  2285.   SiS_SetReg1(Port,Index,temp);
  2286. }
  2287. void
  2288. SiS_SetRegAND(USHORT Port,USHORT Index,USHORT DataAND)
  2289. {
  2290.   USHORT temp;
  2291.   temp = SiS_GetReg1(Port,Index);     /* SiS_Pr->SiS_Part1Port index 02 */
  2292.   temp &= DataAND;
  2293.   SiS_SetReg1(Port,Index,temp);
  2294. }
  2295. void SiS_SetRegOR(USHORT Port,USHORT Index,USHORT DataOR)
  2296. {
  2297.   USHORT temp;
  2298.   temp = SiS_GetReg1(Port,Index);     /* SiS_Pr->SiS_Part1Port index 02 */
  2299.   temp |= DataOR;
  2300.   SiS_SetReg1(Port,Index,temp);
  2301. }
  2302. /* ========================================================= */
  2303. /* TW: Set 301 TV Encoder (and some LCD relevant) registers */
  2304. /* TW: Checked against 650/301LV, 650/301LVx and 630/301B (I+II) */
  2305. void
  2306. SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr, USHORT ModeNo,
  2307.               USHORT ModeIdIndex,USHORT RefreshRateTableIndex,
  2308.       PSIS_HW_DEVICE_INFO HwDeviceExtension)
  2309. {
  2310.   USHORT      i, j, tempax, tempbx, tempcx, temp, temp1;
  2311.   USHORT      push1, push2;
  2312.   const       UCHAR *PhasePoint;
  2313.   const       UCHAR *TimingPoint;
  2314.   const       SiS_Part2PortTblStruct *CRT2Part2Ptr = NULL;
  2315.   USHORT      modeflag, resinfo, crt2crtc, resindex, CRT2Index;
  2316.   ULONG       longtemp, tempeax, tempebx, temp2, tempecx;
  2317.   const UCHAR atable[] = {
  2318.                  0xc3,0x9e,0xc3,0x9e,0x02,0x02,0x02,
  2319.          0xab,0x87,0xab,0x9e,0xe7,0x02,0x02
  2320.   };
  2321.   /* TW: Inserted from 650/301LV BIOS */
  2322.   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
  2323.      /* TW: Inserted from 650/301LVx 1.10.6s: (Is at end of SetGroup2!) */
  2324.      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
  2325.         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
  2326.    SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1a,0xfc,0x03);
  2327.    temp = 1;
  2328.    if(ModeNo<=0x13) temp = 3;
  2329.    SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0b,temp);
  2330. }
  2331.      }
  2332.      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {    /* 650/301LV: (VB_SIS301LV | VB_SIS302LV)) */
  2333.        if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
  2334.          if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
  2335.            if((ModeNo == 0x4a) || (ModeNo == 0x38)) {
  2336.                SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1c,0xa7);
  2337.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1d,0x07);
  2338.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1e,0xf2);
  2339.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1f,0x6e);
  2340.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x20,0x17);
  2341.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x21,0x8b);
  2342.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x22,0x73);
  2343.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x23,0x53);
  2344.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x24,0x13);
  2345.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x25,0x40);
  2346.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x26,0x34);
  2347.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x27,0xf4);
  2348.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x28,0x63);
  2349.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x29,0xbb);
  2350.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2a,0xcc);
  2351.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2b,0x7a);
  2352.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2c,0x58);
  2353.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2d,0xe4);
  2354.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2e,0x73);
  2355.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,0xda);
  2356.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0x13);
  2357.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x43,0x72);
  2358.            }
  2359.          }
  2360.        }
  2361.      }
  2362.      return;
  2363.   }
  2364.   if(ModeNo<=0x13) {
  2365.      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
  2366.      resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
  2367.      crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
  2368.   } else {
  2369.      modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
  2370.      resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
  2371.      crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
  2372.   }
  2373.   tempcx = SiS_Pr->SiS_VBInfo;
  2374.   tempax = (tempcx & 0x00FF) << 8;
  2375.   tempbx = (tempcx & 0x00FF) | ((tempcx & 0x00FF) << 8);
  2376.   tempbx &= 0x0410;
  2377.   temp = (tempax & 0x0800) >> 8;
  2378.   temp >>= 1;
  2379.   temp |= (((tempbx & 0xFF00) >> 8) << 1);
  2380.   temp |= ((tempbx & 0x00FF) >> 3);
  2381.   temp ^= 0x0C;
  2382.   PhasePoint  = SiS_Pr->SiS_PALPhase;
  2383.   TimingPoint = SiS_Pr->SiS_PALTiming;
  2384. #ifdef oldHV
  2385.   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {          /* PALPhase */
  2386.     temp ^= 0x01;
  2387.     if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
  2388.       TimingPoint = SiS_Pr->SiS_HiTVSt2Timing;
  2389.       if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
  2390.         if(modeflag & Charx8Dot) TimingPoint = SiS_Pr->SiS_HiTVSt1Timing;
  2391.         else TimingPoint = SiS_Pr->SiS_HiTVTextTiming;
  2392.       }
  2393.     } else TimingPoint = SiS_Pr->SiS_HiTVExtTiming;
  2394.   } else {
  2395. #endif
  2396.     if(SiS_Pr->SiS_VBInfo & SetPALTV){
  2397.       TimingPoint = SiS_Pr->SiS_PALTiming;
  2398.       PhasePoint  = SiS_Pr->SiS_PALPhase;
  2399.       if( (SiS_Pr->SiS_VBType & (VB_SIS301B | VB_SIS302B)) &&
  2400.           ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
  2401.     (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
  2402.          PhasePoint = SiS_Pr->SiS_PALPhase2;
  2403.       }
  2404.     } else {
  2405.         temp |= 0x10;
  2406. TimingPoint = SiS_Pr->SiS_NTSCTiming;
  2407. PhasePoint  = SiS_Pr->SiS_NTSCPhase;
  2408.         if( (SiS_Pr->SiS_VBType & (VB_SIS301B | VB_SIS302B)) &&
  2409.     ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
  2410.       (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
  2411.          PhasePoint = SiS_Pr->SiS_NTSCPhase2;
  2412.         }
  2413.     }
  2414. #ifdef oldHV
  2415.   }
  2416. #endif
  2417.   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x00,temp);
  2418.   temp = 0;
  2419.   if((HwDeviceExtension->jChipType == SIS_630)||
  2420.      (HwDeviceExtension->jChipType == SIS_730)) {
  2421.      temp = 0x35;
  2422.   }
  2423.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  2424.      temp = 0x38;
  2425.   }
  2426.   if(temp) {
  2427.     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
  2428.       if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
  2429.           temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,temp);
  2430.           if(temp1 & 0x40) {
  2431.                PhasePoint = SiS_Pr->SiS_PALMPhase;
  2432. if( (SiS_Pr->SiS_VBType & (VB_SIS301B | VB_SIS302B)) &&
  2433.     ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
  2434.       (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
  2435.            PhasePoint = SiS_Pr->SiS_PALMPhase2;
  2436. }
  2437.   }
  2438.           if(temp1 & 0x80) {
  2439.                 PhasePoint = SiS_Pr->SiS_PALNPhase;
  2440. if( (SiS_Pr->SiS_VBType & (VB_SIS301B | VB_SIS302B)) &&
  2441.     ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
  2442.       (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
  2443.            PhasePoint = SiS_Pr->SiS_PALNPhase2;
  2444. }
  2445.   }
  2446.       }
  2447.     }
  2448.   }
  2449. #ifdef SIS315H
  2450.   /* TW: Inserted from 650/301LV BIOS */
  2451.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  2452.      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {  /* 650/301LV : 301LV | 302LV */
  2453.         if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
  2454.            if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
  2455.               if((ModeNo == 0x4a) || (ModeNo == 0x38)) {
  2456.          PhasePoint = SiS_Pr->SiS_SpecialPhase;
  2457.       }
  2458.            }
  2459.         }
  2460.      }
  2461.   }
  2462. #endif
  2463.   for(i=0x31, j=0; i<=0x34; i++, j++){
  2464.      SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,PhasePoint[j]);
  2465.   }
  2466.   for(i=0x01, j=0; i<=0x2D; i++, j++){
  2467.      SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,TimingPoint[j]);
  2468.   }
  2469.   for(i=0x39; i<=0x45; i++, j++){
  2470.      SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,TimingPoint[j]);
  2471.   }
  2472.   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
  2473.     if(HwDeviceExtension->jChipType >= SIS_315H) {
  2474.       if(!(SiS_Pr->SiS_ModeType & 0x07))
  2475.         SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x3A,0x1F);
  2476.     } else {
  2477.       SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x3A,0x1F);
  2478.     }
  2479.   }
  2480.   SiS_SetRegOR(SiS_Pr->SiS_Part2Port,0x0A,SiS_Pr->SiS_NewFlickerMode);
  2481.   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x35,SiS_Pr->SiS_RY1COE);
  2482.   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x36,SiS_Pr->SiS_RY2COE);
  2483.   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x37,SiS_Pr->SiS_RY3COE);
  2484.   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x38,SiS_Pr->SiS_RY4COE);
  2485. #ifdef oldHV
  2486.   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) tempax = 950;
  2487.   else {
  2488. #endif
  2489.     if(SiS_Pr->SiS_VBInfo & SetPALTV) tempax = 520;
  2490.     else tempax = 440;
  2491. #ifdef oldHV
  2492.   }
  2493. #endif
  2494.   if( ( ( (!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) || (SiS_Pr->SiS_HiVision == 3) ) && (SiS_Pr->SiS_VDE <= tempax) ) ||
  2495.       ( (SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (SiS_Pr->SiS_HiVision != 3) &&
  2496.         ( (SiS_Pr->SiS_VGAHDE == 1024) || ((SiS_Pr->SiS_VGAHDE != 1024) && (SiS_Pr->SiS_VDE <= tempax)) ) ) ) {
  2497.      tempax -= SiS_Pr->SiS_VDE;
  2498.      tempax >>= 2;
  2499.      tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
  2500.      temp = (tempax & 0xFF00) >> 8;
  2501.      temp += (USHORT)TimingPoint[0];
  2502.      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,temp);
  2503.      temp = (tempax & 0xFF00) >> 8;
  2504.      temp += (USHORT)TimingPoint[1];
  2505.      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,temp);
  2506.      if( (SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) &&
  2507.         (SiS_Pr->SiS_HiVision != 3) &&
  2508.         (SiS_Pr->SiS_VGAHDE >= 1024) ) {
  2509.         if(SiS_Pr->SiS_VBInfo & SetPALTV) {
  2510.            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x19);
  2511.            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x52);
  2512.         } else {
  2513.            if(HwDeviceExtension->jChipType >= SIS_315H) {
  2514.              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x17);
  2515.              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x1d);
  2516.    } else {
  2517.              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x0b);
  2518.              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x11);
  2519.    }
  2520.         }
  2521.      }
  2522.   }
  2523.   tempcx = SiS_Pr->SiS_HT;
  2524.   /* TW: Inserted from 650/301LVx 1.10.6s */
  2525.   if(HwDeviceExtension->jChipType >= SIS_315H) {
  2526.       if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) {
  2527.           tempcx >>= 1;
  2528.       }
  2529.   }
  2530.   tempcx--;
  2531.   if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
  2532.         tempcx--;
  2533.   }
  2534.   temp = tempcx & 0x00FF;
  2535.   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1B,temp);
  2536.   temp = (tempcx & 0xFF00) >> 8;
  2537.   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1D,0xF0,temp);
  2538.   tempcx++;
  2539.   if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
  2540.         tempcx++;
  2541.   }
  2542.   tempcx >>= 1;
  2543.   push1 = tempcx;
  2544.   tempcx += 7;
  2545. #ifdef oldHV
  2546.   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)  tempcx -= 4;
  2547. #endif
  2548.   temp = (tempcx & 0x00FF) << 4;
  2549.   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x22,0x0F,temp);
  2550.   tempbx = TimingPoint[j] | ((TimingPoint[j+1]) << 8);
  2551.   tempbx += tempcx;
  2552.   push2 = tempbx;
  2553.   temp = tempbx & 0x00FF;
  2554.   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x24,temp);
  2555.   temp = ((tempbx & 0xFF00) >> 8) << 4;
  2556.   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0x0F,temp);
  2557.   tempbx = push2;
  2558.   tempbx += 8;
  2559. #ifdef oldHV
  2560.   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
  2561.     tempbx -= 4;
  2562.     tempcx = tempbx;
  2563.   }
  2564. #endif
  2565.   temp = (tempbx & 0x00FF) << 4;
  2566.   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x29,0x0F,temp);
  2567.   j += 2;
  2568.   tempcx += ((TimingPoint[j] | ((TimingPoint[j+1]) << 8)));
  2569.   temp = tempcx & 0x00FF;
  2570.   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x27,temp);
  2571.   temp = ((tempcx & 0xFF00) >> 8) << 4;
  2572.   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x28,0x0F,temp);
  2573.   tempcx += 8;
  2574. #ifdef oldHV
  2575.   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)  tempcx -= 4; 
  2576. #endif
  2577.   temp = (tempcx & 0xFF) << 4;
  2578.   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2A,0x0F,temp);
  2579.   tempcx = push1;
  2580.   j += 2;
  2581.   tempcx -= (TimingPoint[j] | ((TimingPoint[j+1]) << 8));
  2582.   temp = (tempcx & 0x00FF) << 4;
  2583.   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2D,0x0F,temp);
  2584.   tempcx -= 11;
  2585.   if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
  2586.     tempax = SiS_GetVGAHT2(SiS_Pr) - 1;
  2587.     tempcx = tempax;
  2588.   }
  2589.   temp = tempcx & 0x00FF;
  2590.   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2E,temp);
  2591.   tempbx = SiS_Pr->SiS_VDE;
  2592.   if(SiS_Pr->SiS_VGAVDE == 360) tempbx = 746;
  2593.   if(SiS_Pr->SiS_VGAVDE == 375) tempbx = 746;
  2594.   if(SiS_Pr->SiS_VGAVDE == 405) tempbx = 853;
  2595.   if(HwDeviceExtension->jChipType < SIS_315H) {
  2596.    if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) tempbx >>= 1;
  2597.   } else {
  2598. if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
  2599.    tempbx >>= 1;
  2600.    if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
  2601.       if(ModeNo <= 0x13) {
  2602.          if(crt2crtc == 1) {
  2603.             tempbx++;
  2604.                  }
  2605.       }
  2606.    } else {
  2607.               if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
  2608.          if(crt2crtc == 4)   /* TW: BIOS calls GetRatePtrCRT2 here - does not make sense */
  2609.                     if(SiS_Pr->SiS_ModeType <= 3) tempbx++;
  2610.       }
  2611.    }
  2612.         }
  2613.   }
  2614.   tempbx -= 2;
  2615.   temp = tempbx & 0x00FF;
  2616. #ifdef oldHV
  2617.   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
  2618.     if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
  2619.       if(ModeNo == 0x2f) temp++;
  2620.     }
  2621.   }
  2622. #endif
  2623.   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2F,temp);
  2624.   tempax = (tempcx & 0xFF00) | (tempax & 0x00FF);
  2625.   tempbx = ((tempbx & 0xFF00) << 6) | (tempbx & 0x00FF);
  2626.   tempax |= (tempbx & 0xFF00);
  2627. #ifdef oldHV
  2628.   if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)) {
  2629. #endif
  2630.     if(HwDeviceExtension->jChipType < SIS_315H) {
  2631.       if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSCART)) { /* TW: New from 630/301B (II) BIOS */
  2632.          tempax |= 0x1000;
  2633.          if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSVIDEO))  tempax |= 0x2000;
  2634.       }
  2635.     } else {
  2636.       tempax |= 0x1000;
  2637.       if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSVIDEO))  tempax |= 0x2000;
  2638.     }
  2639. #ifdef oldHV
  2640.   }
  2641. #endif
  2642.   temp = (tempax & 0xFF00) >> 8;
  2643.   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,temp);
  2644.   /* TW: Inserted from 650/301LVx 1.10.6s */
  2645.   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
  2646.      if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
  2647.          (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) ) {
  2648.          SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x10,0x60);
  2649.      }
  2650.   }
  2651.   if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {      /* tv gatingno */
  2652.     tempbx = SiS_Pr->SiS_VDE;
  2653.     if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
  2654.          tempbx >>= 1;
  2655.     }
  2656.     tempbx -= 3;
  2657.     tempbx &= 0x03ff;
  2658.     temp = ((tempbx & 0xFF00) >> 8) << 5;
  2659.     temp |= 0x18;
  2660.     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x46,temp);
  2661.     temp = tempbx & 0x00FF;
  2662.     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x47,temp);
  2663.     if(HwDeviceExtension->jChipType >= SIS_315H) { /* TW: Inserted from 650/301LVx 1.10.6s */
  2664.        tempax = 0;
  2665.        if(SiS_Pr->SiS_HiVision & 0x07) {
  2666.           if(SiS_Pr->SiS_HiVision & 0x04) tempax = 0x1000;
  2667.           else if(SiS_Pr->SiS_HiVision & 0x01) tempax = 0x3000;
  2668.   else tempax = 0x5000;
  2669.        }
  2670.        temp = (tempax & 0xFF00) >> 8;
  2671.        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4d,temp);
  2672.     }
  2673.   }
  2674.   tempbx &= 0x00FF;
  2675.   if(!(modeflag & HalfDCLK)) {
  2676.     tempcx = SiS_Pr->SiS_VGAHDE;
  2677.     if(tempcx >= SiS_Pr->SiS_HDE){
  2678.       tempbx |= 0x2000;
  2679.       tempax &= 0x00FF;
  2680.     }
  2681.   }
  2682.   tempcx = 0x0101;
  2683.   if(SiS_Pr->SiS_VBInfo & (SetPALTV | SetCRT2ToTV)) {   /*301b- TW: BIOS BUG? */
  2684.     if(!(SiS_Pr->SiS_HiVision & 0x03)) {
  2685.       if(SiS_Pr->SiS_VGAHDE >= 1024) {
  2686.         if(!(modeflag & HalfDCLK)) {   /* TW: This check not in 630/301B */
  2687.           tempcx = 0x1920;
  2688.           if(SiS_Pr->SiS_VGAHDE >= 1280) {
  2689.             tempcx = 0x1420;
  2690.             tempbx &= 0xDFFF;
  2691.           }
  2692.         }
  2693.       }
  2694.     }
  2695.   }
  2696.   if(!(tempbx & 0x2000)){
  2697.     if(modeflag & HalfDCLK) {
  2698.          tempcx = (tempcx & 0xFF00) | (((tempcx & 0x00FF) << 1) & 0xff);
  2699.     }
  2700.     push1 = tempbx;
  2701.     tempeax = SiS_Pr->SiS_VGAHDE;
  2702.     tempebx = (tempcx & 0xFF00) >> 8;
  2703.     longtemp = tempeax * tempebx;
  2704.     tempecx = tempcx & 0x00FF;
  2705.     longtemp /= tempecx;
  2706.     longtemp <<= 0x0d;
  2707.     if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
  2708.       longtemp <<= 3;
  2709.     }
  2710.     tempecx = SiS_Pr->SiS_HDE;
  2711.     temp2 = longtemp % tempecx;
  2712.     tempeax = longtemp / tempecx;
  2713.     if(temp2 != 0) tempeax++;
  2714.     tempax = (USHORT)tempeax;
  2715.     tempbx = push1;
  2716.     tempcx = (tempcx & 0xff00) | (((tempax & 0xFF00) >> 8) >> 5);
  2717.     tempbx |= (tempax & 0x1F00);
  2718.     tempax = ((tempax & 0x00FF) << 8) | (tempax & 0x00FF);
  2719.   }
  2720.   temp = (tempax & 0xFF00) >> 8;
  2721.   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x44,temp);
  2722.   temp = (tempbx & 0xFF00) >> 8;
  2723.   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x45,0xC0,temp);
  2724.   if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
  2725.        temp = tempcx & 0x00FF;
  2726.        if(tempbx & 0x2000) temp = 0;
  2727.        temp |= 0x18;
  2728.        SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x46,0xE0,temp);
  2729.        if(SiS_Pr->SiS_VBInfo & SetPALTV) {
  2730.              tempbx = 0x0382;    /* TW: BIOS; Was 0x0364; */
  2731.              tempcx = 0x007e;    /* TW: BIOS; Was 0x009c; */
  2732.        } else {
  2733.              tempbx = 0x0369;    /* TW: BIOS; Was 0x0346; */