init.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:100k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* Function: Support NT X.0  MM function  */
  2. /* Version : V 0.80      [ynlai] 04/12/98 */
  3. #include "init.h"
  4. #ifdef CONFIG_FB_SIS_300
  5. #include "300vtbl.h"
  6. #endif
  7. #ifdef CONFIG_FB_SIS_315
  8. #include "310vtbl.h"
  9. #endif
  10. BOOLEAN SiSInit (PSIS_HW_DEVICE_INFO HwDeviceExtension);
  11. BOOLEAN SiSSetMode (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo);
  12. #if defined(ALLOC_PRAGMA)
  13. #pragma alloc_text(PAGE,SiSSetMode)
  14. #pragma alloc_text(PAGE,SiSInit)
  15. #endif
  16. void SiS_SetReg1 (USHORT, USHORT, USHORT);
  17. void SiS_SetReg2 (USHORT, USHORT, USHORT);
  18. void SiS_SetReg3 (USHORT, USHORT);
  19. void SiS_SetReg4 (USHORT, ULONG);
  20. UCHAR SiS_GetReg1 (USHORT, USHORT);
  21. UCHAR SiS_GetReg2 (USHORT);
  22. ULONG SiS_GetReg3 (USHORT);
  23. void SiS_ClearDAC (ULONG);
  24. #ifdef CONFIG_FB_SIS_300
  25. void
  26. InitTo300Pointer (void)
  27. {
  28. SiS_SModeIDTable = (SiS_StStruct *) SiS300_SModeIDTable;
  29. SiS_VBModeIDTable = (SiS_VBModeStruct *) SiS300_VBModeIDTable; /*add for 300 oem util */
  30. SiS_StandTable = (SiS_StandTableStruct *) SiS300_StandTable;
  31. SiS_EModeIDTable = (SiS_ExtStruct *) SiS300_EModeIDTable;
  32. SiS_RefIndex = (SiS_Ext2Struct *) SiS300_RefIndex;
  33. SiS_CRT1Table = (SiS_CRT1TableStruct *) SiS300_CRT1Table;
  34. SiS_MCLKData = (SiS_MCLKDataStruct *) SiS300_MCLKData;
  35. SiS_ECLKData = (SiS_ECLKDataStruct *) SiS300_ECLKData;
  36. SiS_VCLKData = (SiS_VCLKDataStruct *) SiS300_VCLKData;
  37. SiS_VBVCLKData = (SiS_VBVCLKDataStruct *) SiS300_VCLKData;
  38. SiS_ScreenOffset = SiS300_ScreenOffset;
  39. SiS_StResInfo = (SiS_StResInfoStruct *) SiS300_StResInfo;
  40. SiS_ModeResInfo = (SiS_ModeResInfoStruct *) SiS300_ModeResInfo;
  41. pSiS_OutputSelect = &SiS300_OutputSelect;
  42. pSiS_SoftSetting = &SiS300_SoftSetting;
  43. pSiS_SR07 = &SiS300_SR07;
  44. SiS_SR15 = SiS300_SR15;
  45. SiS_CR40 = SiS300_CR40;
  46. SiS_CR49 = SiS300_CR49;
  47. pSiS_SR1F = &SiS300_SR1F;
  48. pSiS_SR21 = &SiS300_SR21;
  49. pSiS_SR22 = &SiS300_SR22;
  50. pSiS_SR23 = &SiS300_SR23;
  51. pSiS_SR24 = &SiS300_SR24;
  52. SiS_SR25 = SiS300_SR25;
  53. pSiS_SR31 = &SiS300_SR31;
  54. pSiS_SR32 = &SiS300_SR32;
  55. pSiS_SR33 = &SiS300_SR33;
  56. pSiS_CRT2Data_1_2 = &SiS300_CRT2Data_1_2;
  57. pSiS_CRT2Data_4_D = &SiS300_CRT2Data_4_D;
  58. pSiS_CRT2Data_4_E = &SiS300_CRT2Data_4_E;
  59. pSiS_CRT2Data_4_10 = &SiS300_CRT2Data_4_10;
  60. pSiS_RGBSenseData = &SiS300_RGBSenseData;
  61. pSiS_VideoSenseData = &SiS300_VideoSenseData;
  62. pSiS_YCSenseData = &SiS300_YCSenseData;
  63. pSiS_RGBSenseData2 = &SiS300_RGBSenseData2;
  64. pSiS_VideoSenseData2 = &SiS300_VideoSenseData2;
  65. pSiS_YCSenseData2 = &SiS300_YCSenseData2;
  66. SiS_NTSCPhase = SiS300_NTSCPhase;
  67. SiS_PALPhase = SiS300_PALPhase;
  68. SiS_NTSCPhase2 = SiS300_NTSCPhase2;
  69. SiS_PALPhase2 = SiS300_PALPhase2;
  70. SiS_PALMPhase = SiS300_PALMPhase; /*add for PALMN */
  71. SiS_PALNPhase = SiS300_PALNPhase;
  72. SiS_StLCD1024x768Data = (SiS_LCDDataStruct *) SiS300_StLCD1024x768Data;
  73. SiS_ExtLCD1024x768Data =
  74.     (SiS_LCDDataStruct *) SiS300_ExtLCD1024x768Data;
  75. SiS_St2LCD1024x768Data =
  76.     (SiS_LCDDataStruct *) SiS300_St2LCD1024x768Data;
  77. SiS_StLCD1280x1024Data =
  78.     (SiS_LCDDataStruct *) SiS300_StLCD1280x1024Data;
  79. SiS_ExtLCD1280x1024Data =
  80.     (SiS_LCDDataStruct *) SiS300_ExtLCD1280x1024Data;
  81. SiS_St2LCD1280x1024Data =
  82.     (SiS_LCDDataStruct *) SiS300_St2LCD1280x1024Data;
  83. SiS_NoScaleData = (SiS_LCDDataStruct *) SiS300_NoScaleData;
  84. SiS_LCD1280x960Data = (SiS_LCDDataStruct *) SiS300_LCD1280x960Data;
  85. SiS_StPALData = (SiS_TVDataStruct *) SiS300_StPALData;
  86. SiS_ExtPALData = (SiS_TVDataStruct *) SiS300_ExtPALData;
  87. SiS_StNTSCData = (SiS_TVDataStruct *) SiS300_StNTSCData;
  88. SiS_ExtNTSCData = (SiS_TVDataStruct *) SiS300_ExtNTSCData;
  89. SiS_St1HiTVData = (SiS_TVDataStruct *) SiS300_St1HiTVData;
  90. SiS_St2HiTVData = (SiS_TVDataStruct *) SiS300_St2HiTVData;
  91. SiS_ExtHiTVData = (SiS_TVDataStruct *) SiS300_ExtHiTVData;
  92. SiS_NTSCTiming = SiS300_NTSCTiming;
  93. SiS_PALTiming = SiS300_PALTiming;
  94. SiS_HiTVSt1Timing = SiS300_HiTVSt1Timing;
  95. SiS_HiTVSt2Timing = SiS300_HiTVSt2Timing;
  96. SiS_HiTVTextTiming = SiS300_HiTVTextTiming;
  97. SiS_HiTVGroup3Data = SiS300_HiTVGroup3Data;
  98. SiS_HiTVGroup3Simu = SiS300_HiTVGroup3Simu;
  99. SiS_HiTVGroup3Text = SiS300_HiTVGroup3Text;
  100. SiS_PanelDelayTbl = (SiS_PanelDelayTblStruct *) SiS300_PanelDelayTbl;
  101. SiS_LVDS800x600Data_1 = (SiS_LVDSDataStruct *) SiS300_LVDS800x600Data_1;
  102. SiS_LVDS800x600Data_2 = (SiS_LVDSDataStruct *) SiS300_LVDS800x600Data_2;
  103. SiS_LVDS1024x768Data_1 =
  104.     (SiS_LVDSDataStruct *) SiS300_LVDS1024x768Data_1;
  105. SiS_LVDS1024x768Data_2 =
  106.     (SiS_LVDSDataStruct *) SiS300_LVDS1024x768Data_2;
  107. SiS_LVDS1280x1024Data_1 =
  108.     (SiS_LVDSDataStruct *) SiS300_LVDS1280x1024Data_1;
  109. SiS_LVDS1280x1024Data_2 =
  110.     (SiS_LVDSDataStruct *) SiS300_LVDS1280x1024Data_2;
  111. SiS_LVDS640x480Data_1 = (SiS_LVDSDataStruct *) SiS300_LVDS640x480Data_1;
  112. SiS_CHTVUNTSCData = (SiS_LVDSDataStruct *) SiS300_CHTVUNTSCData;
  113. SiS_CHTVONTSCData = (SiS_LVDSDataStruct *) SiS300_CHTVONTSCData;
  114. SiS_CHTVUPALData = (SiS_LVDSDataStruct *) SiS300_CHTVUPALData;
  115. SiS_CHTVOPALData = (SiS_LVDSDataStruct *) SiS300_CHTVOPALData;
  116. SiS_PanelType00_1 = (SiS_LVDSDesStruct *) SiS300_PanelType00_1;
  117. SiS_PanelType01_1 = (SiS_LVDSDesStruct *) SiS300_PanelType01_1;
  118. SiS_PanelType02_1 = (SiS_LVDSDesStruct *) SiS300_PanelType02_1;
  119. SiS_PanelType03_1 = (SiS_LVDSDesStruct *) SiS300_PanelType03_1;
  120. SiS_PanelType04_1 = (SiS_LVDSDesStruct *) SiS300_PanelType04_1;
  121. SiS_PanelType05_1 = (SiS_LVDSDesStruct *) SiS300_PanelType05_1;
  122. SiS_PanelType06_1 = (SiS_LVDSDesStruct *) SiS300_PanelType06_1;
  123. SiS_PanelType07_1 = (SiS_LVDSDesStruct *) SiS300_PanelType07_1;
  124. SiS_PanelType08_1 = (SiS_LVDSDesStruct *) SiS300_PanelType08_1;
  125. SiS_PanelType09_1 = (SiS_LVDSDesStruct *) SiS300_PanelType09_1;
  126. SiS_PanelType0a_1 = (SiS_LVDSDesStruct *) SiS300_PanelType0a_1;
  127. SiS_PanelType0b_1 = (SiS_LVDSDesStruct *) SiS300_PanelType0b_1;
  128. SiS_PanelType0c_1 = (SiS_LVDSDesStruct *) SiS300_PanelType0c_1;
  129. SiS_PanelType0d_1 = (SiS_LVDSDesStruct *) SiS300_PanelType0d_1;
  130. SiS_PanelType0e_1 = (SiS_LVDSDesStruct *) SiS300_PanelType0e_1;
  131. SiS_PanelType0f_1 = (SiS_LVDSDesStruct *) SiS300_PanelType0f_1;
  132. SiS_PanelType00_2 = (SiS_LVDSDesStruct *) SiS300_PanelType00_2;
  133. SiS_PanelType01_2 = (SiS_LVDSDesStruct *) SiS300_PanelType01_2;
  134. SiS_PanelType02_2 = (SiS_LVDSDesStruct *) SiS300_PanelType02_2;
  135. SiS_PanelType03_2 = (SiS_LVDSDesStruct *) SiS300_PanelType03_2;
  136. SiS_PanelType04_2 = (SiS_LVDSDesStruct *) SiS300_PanelType04_2;
  137. SiS_PanelType05_2 = (SiS_LVDSDesStruct *) SiS300_PanelType05_2;
  138. SiS_PanelType06_2 = (SiS_LVDSDesStruct *) SiS300_PanelType06_2;
  139. SiS_PanelType07_2 = (SiS_LVDSDesStruct *) SiS300_PanelType07_2;
  140. SiS_PanelType08_2 = (SiS_LVDSDesStruct *) SiS300_PanelType08_2;
  141. SiS_PanelType09_2 = (SiS_LVDSDesStruct *) SiS300_PanelType09_2;
  142. SiS_PanelType0a_2 = (SiS_LVDSDesStruct *) SiS300_PanelType0a_2;
  143. SiS_PanelType0b_2 = (SiS_LVDSDesStruct *) SiS300_PanelType0b_2;
  144. SiS_PanelType0c_2 = (SiS_LVDSDesStruct *) SiS300_PanelType0c_2;
  145. SiS_PanelType0d_2 = (SiS_LVDSDesStruct *) SiS300_PanelType0d_2;
  146. SiS_PanelType0e_2 = (SiS_LVDSDesStruct *) SiS300_PanelType0e_2;
  147. SiS_PanelType0f_2 = (SiS_LVDSDesStruct *) SiS300_PanelType0f_2;
  148. SiS_CHTVUNTSCDesData = (SiS_LVDSDesStruct *) SiS300_CHTVUNTSCDesData;
  149. SiS_CHTVONTSCDesData = (SiS_LVDSDesStruct *) SiS300_CHTVONTSCDesData;
  150. SiS_CHTVUPALDesData = (SiS_LVDSDesStruct *) SiS300_CHTVUPALDesData;
  151. SiS_CHTVOPALDesData = (SiS_LVDSDesStruct *) SiS300_CHTVOPALDesData;
  152. SiS_LVDSCRT1800x600_1 =
  153.     (SiS_LVDSCRT1DataStruct *) SiS300_LVDSCRT1800x600_1;
  154. SiS_LVDSCRT11024x768_1 =
  155.     (SiS_LVDSCRT1DataStruct *) SiS300_LVDSCRT11024x768_1;
  156. SiS_LVDSCRT11280x1024_1 =
  157.     (SiS_LVDSCRT1DataStruct *) SiS300_LVDSCRT11280x1024_1;
  158. SiS_LVDSCRT1800x600_1_H =
  159.     (SiS_LVDSCRT1DataStruct *) SiS300_LVDSCRT1800x600_1_H;
  160. SiS_LVDSCRT11024x768_1_H =
  161.     (SiS_LVDSCRT1DataStruct *) SiS300_LVDSCRT11024x768_1_H;
  162. SiS_LVDSCRT11280x1024_1_H =
  163.     (SiS_LVDSCRT1DataStruct *) SiS300_LVDSCRT11280x1024_1_H;
  164. SiS_LVDSCRT1800x600_2 =
  165.     (SiS_LVDSCRT1DataStruct *) SiS300_LVDSCRT1800x600_2;
  166. SiS_LVDSCRT11024x768_2 =
  167.     (SiS_LVDSCRT1DataStruct *) SiS300_LVDSCRT11024x768_2;
  168. SiS_LVDSCRT11280x1024_2 =
  169.     (SiS_LVDSCRT1DataStruct *) SiS300_LVDSCRT11280x1024_2;
  170. SiS_LVDSCRT1800x600_2_H =
  171.     (SiS_LVDSCRT1DataStruct *) SiS300_LVDSCRT1800x600_2_H;
  172. SiS_LVDSCRT11024x768_2_H =
  173.     (SiS_LVDSCRT1DataStruct *) SiS300_LVDSCRT11024x768_2_H;
  174. SiS_LVDSCRT11280x1024_2_H =
  175.     (SiS_LVDSCRT1DataStruct *) SiS300_LVDSCRT11280x1024_2_H;
  176. SiS_CHTVCRT1UNTSC = (SiS_LVDSCRT1DataStruct *) SiS300_CHTVCRT1UNTSC;
  177. SiS_CHTVCRT1ONTSC = (SiS_LVDSCRT1DataStruct *) SiS300_CHTVCRT1ONTSC;
  178. SiS_CHTVCRT1UPAL = (SiS_LVDSCRT1DataStruct *) SiS300_CHTVCRT1UPAL;
  179. SiS_CHTVCRT1OPAL = (SiS_LVDSCRT1DataStruct *) SiS300_CHTVCRT1OPAL;
  180. SiS_CHTVReg_UNTSC = (SiS_CHTVRegDataStruct *) SiS300_CHTVReg_UNTSC;
  181. SiS_CHTVReg_ONTSC = (SiS_CHTVRegDataStruct *) SiS300_CHTVReg_ONTSC;
  182. SiS_CHTVReg_UPAL = (SiS_CHTVRegDataStruct *) SiS300_CHTVReg_UPAL;
  183. SiS_CHTVReg_OPAL = (SiS_CHTVRegDataStruct *) SiS300_CHTVReg_OPAL;
  184. SiS_CHTVVCLKUNTSC = SiS300_CHTVVCLKUNTSC;
  185. SiS_CHTVVCLKONTSC = SiS300_CHTVVCLKONTSC;
  186. SiS_CHTVVCLKUPAL = SiS300_CHTVVCLKUPAL;
  187. SiS_CHTVVCLKOPAL = SiS300_CHTVVCLKOPAL;
  188. /* 300 customization related */
  189. }
  190. #endif
  191. #ifdef CONFIG_FB_SIS_315
  192. void
  193. InitTo310Pointer (void)
  194. {
  195. SiS_SModeIDTable = (SiS_StStruct *) SiS310_SModeIDTable;
  196. SiS_StandTable = (SiS_StandTableStruct *) SiS310_StandTable;
  197. SiS_EModeIDTable = (SiS_ExtStruct *) SiS310_EModeIDTable;
  198. SiS_RefIndex = (SiS_Ext2Struct *) SiS310_RefIndex;
  199. SiS_CRT1Table = (SiS_CRT1TableStruct *) SiS310_CRT1Table;
  200. SiS_MCLKData = (SiS_MCLKDataStruct *) SiS310_MCLKData;
  201. SiS_ECLKData = (SiS_ECLKDataStruct *) SiS310_ECLKData;
  202. SiS_VCLKData = (SiS_VCLKDataStruct *) SiS310_VCLKData;
  203. SiS_VBVCLKData = (SiS_VBVCLKDataStruct *) SiS310_VBVCLKData;
  204. SiS_ScreenOffset = SiS310_ScreenOffset;
  205. SiS_StResInfo = (SiS_StResInfoStruct *) SiS310_StResInfo;
  206. SiS_ModeResInfo = (SiS_ModeResInfoStruct *) SiS310_ModeResInfo;
  207. pSiS_OutputSelect = &SiS310_OutputSelect;
  208. pSiS_SoftSetting = &SiS310_SoftSetting;
  209. pSiS_SR07 = &SiS310_SR07;
  210. SiS_SR15 = SiS310_SR15;
  211. SiS_CR40 = SiS310_CR40;
  212. SiS_CR49 = SiS310_CR49;
  213. pSiS_SR1F = &SiS310_SR1F;
  214. pSiS_SR21 = &SiS310_SR21;
  215. pSiS_SR22 = &SiS310_SR22;
  216. pSiS_SR23 = &SiS310_SR23;
  217. pSiS_SR24 = &SiS310_SR24;
  218. SiS_SR25 = SiS310_SR25;
  219. pSiS_SR31 = &SiS310_SR31;
  220. pSiS_SR32 = &SiS310_SR32;
  221. pSiS_SR33 = &SiS310_SR33;
  222. pSiS_CRT2Data_1_2 = &SiS310_CRT2Data_1_2;
  223. pSiS_CRT2Data_4_D = &SiS310_CRT2Data_4_D;
  224. pSiS_CRT2Data_4_E = &SiS310_CRT2Data_4_E;
  225. pSiS_CRT2Data_4_10 = &SiS310_CRT2Data_4_10;
  226. pSiS_RGBSenseData = &SiS310_RGBSenseData;
  227. pSiS_VideoSenseData = &SiS310_VideoSenseData;
  228. pSiS_YCSenseData = &SiS310_YCSenseData;
  229. pSiS_RGBSenseData2 = &SiS310_RGBSenseData2;
  230. pSiS_VideoSenseData2 = &SiS310_VideoSenseData2;
  231. pSiS_YCSenseData2 = &SiS310_YCSenseData2;
  232. SiS_NTSCPhase = SiS310_NTSCPhase;
  233. SiS_PALPhase = SiS310_PALPhase;
  234. SiS_NTSCPhase2 = SiS310_NTSCPhase2;
  235. SiS_PALPhase2 = SiS310_PALPhase2;
  236. SiS_PALMPhase = SiS310_PALMPhase; /*add for PALMN */
  237. SiS_PALNPhase = SiS310_PALNPhase;
  238. SiS_StLCD1024x768Data = (SiS_LCDDataStruct *) SiS310_StLCD1024x768Data;
  239. SiS_ExtLCD1024x768Data =
  240.     (SiS_LCDDataStruct *) SiS310_ExtLCD1024x768Data;
  241. SiS_St2LCD1024x768Data =
  242.     (SiS_LCDDataStruct *) SiS310_St2LCD1024x768Data;
  243. SiS_StLCD1280x1024Data =
  244.     (SiS_LCDDataStruct *) SiS310_StLCD1280x1024Data;
  245. SiS_ExtLCD1280x1024Data =
  246.     (SiS_LCDDataStruct *) SiS310_ExtLCD1280x1024Data;
  247. SiS_St2LCD1280x1024Data =
  248.     (SiS_LCDDataStruct *) SiS310_St2LCD1280x1024Data;
  249. SiS_NoScaleData = (SiS_LCDDataStruct *) SiS310_NoScaleData;
  250. SiS_LCD1280x960Data = (SiS_LCDDataStruct *) SiS310_LCD1280x960Data;
  251. SiS_StPALData = (SiS_TVDataStruct *) SiS310_StPALData;
  252. SiS_ExtPALData = (SiS_TVDataStruct *) SiS310_ExtPALData;
  253. SiS_StNTSCData = (SiS_TVDataStruct *) SiS310_StNTSCData;
  254. SiS_ExtNTSCData = (SiS_TVDataStruct *) SiS310_ExtNTSCData;
  255. SiS_St1HiTVData = (SiS_TVDataStruct *) SiS310_St1HiTVData;
  256. SiS_St2HiTVData = (SiS_TVDataStruct *) SiS310_St2HiTVData;
  257. SiS_ExtHiTVData = (SiS_TVDataStruct *) SiS310_ExtHiTVData;
  258. SiS_NTSCTiming = SiS310_NTSCTiming;
  259. SiS_PALTiming = SiS310_PALTiming;
  260. SiS_HiTVSt1Timing = SiS310_HiTVSt1Timing;
  261. SiS_HiTVSt2Timing = SiS310_HiTVSt2Timing;
  262. SiS_HiTVTextTiming = SiS310_HiTVTextTiming;
  263. SiS_HiTVGroup3Data = SiS310_HiTVGroup3Data;
  264. SiS_HiTVGroup3Simu = SiS310_HiTVGroup3Simu;
  265. SiS_HiTVGroup3Text = SiS310_HiTVGroup3Text;
  266. SiS_PanelDelayTbl = (SiS_PanelDelayTblStruct *) SiS310_PanelDelayTbl;
  267. SiS_LVDS800x600Data_1 = (SiS_LVDSDataStruct *) SiS310_LVDS800x600Data_1;
  268. SiS_LVDS800x600Data_2 = (SiS_LVDSDataStruct *) SiS310_LVDS800x600Data_2;
  269. SiS_LVDS1024x768Data_1 =
  270.     (SiS_LVDSDataStruct *) SiS310_LVDS1024x768Data_1;
  271. SiS_LVDS1024x768Data_2 =
  272.     (SiS_LVDSDataStruct *) SiS310_LVDS1024x768Data_2;
  273. SiS_LVDS1280x1024Data_1 =
  274.     (SiS_LVDSDataStruct *) SiS310_LVDS1280x1024Data_1;
  275. SiS_LVDS1280x1024Data_2 =
  276.     (SiS_LVDSDataStruct *) SiS310_LVDS1280x1024Data_2;
  277. SiS_LVDS640x480Data_1 = (SiS_LVDSDataStruct *) SiS310_LVDS640x480Data_1;
  278. SiS_CHTVUNTSCData = (SiS_LVDSDataStruct *) SiS310_CHTVUNTSCData;
  279. SiS_CHTVONTSCData = (SiS_LVDSDataStruct *) SiS310_CHTVONTSCData;
  280. SiS_CHTVUPALData = (SiS_LVDSDataStruct *) SiS310_CHTVUPALData;
  281. SiS_CHTVOPALData = (SiS_LVDSDataStruct *) SiS310_CHTVOPALData;
  282. SiS_PanelType00_1 = (SiS_LVDSDesStruct *) SiS310_PanelType00_1;
  283. SiS_PanelType01_1 = (SiS_LVDSDesStruct *) SiS310_PanelType01_1;
  284. SiS_PanelType02_1 = (SiS_LVDSDesStruct *) SiS310_PanelType02_1;
  285. SiS_PanelType03_1 = (SiS_LVDSDesStruct *) SiS310_PanelType03_1;
  286. SiS_PanelType04_1 = (SiS_LVDSDesStruct *) SiS310_PanelType04_1;
  287. SiS_PanelType05_1 = (SiS_LVDSDesStruct *) SiS310_PanelType05_1;
  288. SiS_PanelType06_1 = (SiS_LVDSDesStruct *) SiS310_PanelType06_1;
  289. SiS_PanelType07_1 = (SiS_LVDSDesStruct *) SiS310_PanelType07_1;
  290. SiS_PanelType08_1 = (SiS_LVDSDesStruct *) SiS310_PanelType08_1;
  291. SiS_PanelType09_1 = (SiS_LVDSDesStruct *) SiS310_PanelType09_1;
  292. SiS_PanelType0a_1 = (SiS_LVDSDesStruct *) SiS310_PanelType0a_1;
  293. SiS_PanelType0b_1 = (SiS_LVDSDesStruct *) SiS310_PanelType0b_1;
  294. SiS_PanelType0c_1 = (SiS_LVDSDesStruct *) SiS310_PanelType0c_1;
  295. SiS_PanelType0d_1 = (SiS_LVDSDesStruct *) SiS310_PanelType0d_1;
  296. SiS_PanelType0e_1 = (SiS_LVDSDesStruct *) SiS310_PanelType0e_1;
  297. SiS_PanelType0f_1 = (SiS_LVDSDesStruct *) SiS310_PanelType0f_1;
  298. SiS_PanelType00_2 = (SiS_LVDSDesStruct *) SiS310_PanelType00_2;
  299. SiS_PanelType01_2 = (SiS_LVDSDesStruct *) SiS310_PanelType01_2;
  300. SiS_PanelType02_2 = (SiS_LVDSDesStruct *) SiS310_PanelType02_2;
  301. SiS_PanelType03_2 = (SiS_LVDSDesStruct *) SiS310_PanelType03_2;
  302. SiS_PanelType04_2 = (SiS_LVDSDesStruct *) SiS310_PanelType04_2;
  303. SiS_PanelType05_2 = (SiS_LVDSDesStruct *) SiS310_PanelType05_2;
  304. SiS_PanelType06_2 = (SiS_LVDSDesStruct *) SiS310_PanelType06_2;
  305. SiS_PanelType07_2 = (SiS_LVDSDesStruct *) SiS310_PanelType07_2;
  306. SiS_PanelType08_2 = (SiS_LVDSDesStruct *) SiS310_PanelType08_2;
  307. SiS_PanelType09_2 = (SiS_LVDSDesStruct *) SiS310_PanelType09_2;
  308. SiS_PanelType0a_2 = (SiS_LVDSDesStruct *) SiS310_PanelType0a_2;
  309. SiS_PanelType0b_2 = (SiS_LVDSDesStruct *) SiS310_PanelType0b_2;
  310. SiS_PanelType0c_2 = (SiS_LVDSDesStruct *) SiS310_PanelType0c_2;
  311. SiS_PanelType0d_2 = (SiS_LVDSDesStruct *) SiS310_PanelType0d_2;
  312. SiS_PanelType0e_2 = (SiS_LVDSDesStruct *) SiS310_PanelType0e_2;
  313. SiS_PanelType0f_2 = (SiS_LVDSDesStruct *) SiS310_PanelType0f_2;
  314. /*301b */
  315. LVDS1024x768Des_1 = (SiS_LVDSDesStruct *) SiS310_PanelType1076_1;
  316. LVDS1280x1024Des_1 = (SiS_LVDSDesStruct *) SiS310_PanelType1210_1;
  317. LVDS1280x960Des_1 = (SiS_LVDSDesStruct *) SiS310_PanelType1296_1;
  318. LVDS1024x768Des_2 = (SiS_LVDSDesStruct *) SiS310_PanelType1076_2;
  319. LVDS1280x1024Des_2 = (SiS_LVDSDesStruct *) SiS310_PanelType1210_2;
  320. LVDS1280x960Des_2 = (SiS_LVDSDesStruct *) SiS310_PanelType1296_2;
  321. /*end 301b */
  322. SiS_CHTVUNTSCDesData = (SiS_LVDSDesStruct *) SiS310_CHTVUNTSCDesData;
  323. SiS_CHTVONTSCDesData = (SiS_LVDSDesStruct *) SiS310_CHTVONTSCDesData;
  324. SiS_CHTVUPALDesData = (SiS_LVDSDesStruct *) SiS310_CHTVUPALDesData;
  325. SiS_CHTVOPALDesData = (SiS_LVDSDesStruct *) SiS310_CHTVOPALDesData;
  326. SiS_LVDSCRT1800x600_1 =
  327.     (SiS_LVDSCRT1DataStruct *) SiS310_LVDSCRT1800x600_1;
  328. SiS_LVDSCRT11024x768_1 =
  329.     (SiS_LVDSCRT1DataStruct *) SiS310_LVDSCRT11024x768_1;
  330. SiS_LVDSCRT11280x1024_1 =
  331.     (SiS_LVDSCRT1DataStruct *) SiS310_LVDSCRT11280x1024_1;
  332. SiS_LVDSCRT1800x600_1_H =
  333.     (SiS_LVDSCRT1DataStruct *) SiS310_LVDSCRT1800x600_1_H;
  334. SiS_LVDSCRT11024x768_1_H =
  335.     (SiS_LVDSCRT1DataStruct *) SiS310_LVDSCRT11024x768_1_H;
  336. SiS_LVDSCRT11280x1024_1_H =
  337.     (SiS_LVDSCRT1DataStruct *) SiS310_LVDSCRT11280x1024_1_H;
  338. SiS_LVDSCRT1800x600_2 =
  339.     (SiS_LVDSCRT1DataStruct *) SiS310_LVDSCRT1800x600_2;
  340. SiS_LVDSCRT11024x768_2 =
  341.     (SiS_LVDSCRT1DataStruct *) SiS310_LVDSCRT11024x768_2;
  342. SiS_LVDSCRT11280x1024_2 =
  343.     (SiS_LVDSCRT1DataStruct *) SiS310_LVDSCRT11280x1024_2;
  344. SiS_LVDSCRT1800x600_2_H =
  345.     (SiS_LVDSCRT1DataStruct *) SiS310_LVDSCRT1800x600_2_H;
  346. SiS_LVDSCRT11024x768_2_H =
  347.     (SiS_LVDSCRT1DataStruct *) SiS310_LVDSCRT11024x768_2_H;
  348. SiS_LVDSCRT11280x1024_2_H =
  349.     (SiS_LVDSCRT1DataStruct *) SiS310_LVDSCRT11280x1024_2_H;
  350. SiS_CHTVCRT1UNTSC = (SiS_LVDSCRT1DataStruct *) SiS310_CHTVCRT1UNTSC;
  351. SiS_CHTVCRT1ONTSC = (SiS_LVDSCRT1DataStruct *) SiS310_CHTVCRT1ONTSC;
  352. SiS_CHTVCRT1UPAL = (SiS_LVDSCRT1DataStruct *) SiS310_CHTVCRT1UPAL;
  353. SiS_CHTVCRT1OPAL = (SiS_LVDSCRT1DataStruct *) SiS310_CHTVCRT1OPAL;
  354. SiS_CHTVReg_UNTSC = (SiS_CHTVRegDataStruct *) SiS310_CHTVReg_UNTSC;
  355. SiS_CHTVReg_ONTSC = (SiS_CHTVRegDataStruct *) SiS310_CHTVReg_ONTSC;
  356. SiS_CHTVReg_UPAL = (SiS_CHTVRegDataStruct *) SiS310_CHTVReg_UPAL;
  357. SiS_CHTVReg_OPAL = (SiS_CHTVRegDataStruct *) SiS310_CHTVReg_OPAL;
  358. /*add for LCDA */
  359. SiS_LCDACRT1800x600_1 =
  360.     (SiS_LCDACRT1DataStruct *) SiS310_LCDACRT1800x600_1;
  361. SiS_LCDACRT11024x768_1 =
  362.     (SiS_LCDACRT1DataStruct *) SiS310_LCDACRT11024x768_1;
  363. SiS_LCDACRT11280x1024_1 =
  364.     (SiS_LCDACRT1DataStruct *) SiS310_LCDACRT11280x1024_1;
  365. SiS_LCDACRT1800x600_1_H =
  366.     (SiS_LCDACRT1DataStruct *) SiS310_LCDACRT1800x600_1_H;
  367. SiS_LCDACRT11024x768_1_H =
  368.     (SiS_LCDACRT1DataStruct *) SiS310_LCDACRT11024x768_1_H;
  369. SiS_LCDACRT11280x1024_1_H =
  370.     (SiS_LCDACRT1DataStruct *) SiS310_LCDACRT11280x1024_1_H;
  371. SiS_LCDACRT1800x600_2 =
  372.     (SiS_LCDACRT1DataStruct *) SiS310_LCDACRT1800x600_2;
  373. SiS_LCDACRT11024x768_2 =
  374.     (SiS_LCDACRT1DataStruct *) SiS310_LCDACRT11024x768_2;
  375. SiS_LCDACRT11280x1024_2 =
  376.     (SiS_LCDACRT1DataStruct *) SiS310_LCDACRT11280x1024_2;
  377. SiS_LCDACRT1800x600_2_H =
  378.     (SiS_LCDACRT1DataStruct *) SiS310_LCDACRT1800x600_2_H;
  379. SiS_LCDACRT11024x768_2_H =
  380.     (SiS_LCDACRT1DataStruct *) SiS310_LCDACRT11024x768_2_H;
  381. SiS_LCDACRT11280x1024_2_H =
  382.     (SiS_LCDACRT1DataStruct *) SiS310_LCDACRT11280x1024_2_H;
  383. /*end for 301b */
  384. SiS_CHTVVCLKUNTSC = SiS310_CHTVVCLKUNTSC;
  385. SiS_CHTVVCLKONTSC = SiS310_CHTVVCLKONTSC;
  386. SiS_CHTVVCLKUPAL = SiS310_CHTVVCLKUPAL;
  387. SiS_CHTVVCLKOPAL = SiS310_CHTVVCLKOPAL;
  388. /* 310 customization related */
  389. }
  390. #endif
  391. BOOLEAN
  392. SiSInit (PSIS_HW_DEVICE_INFO HwDeviceExtension)
  393. {
  394. ULONG ROMAddr = (ULONG) HwDeviceExtension->pjVirtualRomBase;
  395. ULONG FBAddr = (ULONG) HwDeviceExtension->pjVideoMemoryAddress;
  396. USHORT BaseAddr = (USHORT) HwDeviceExtension->ulIOAddress;
  397. UCHAR i, temp = 0;
  398. UCHAR SR11, temp1;
  399. ULONG base;
  400. UCHAR SR12 = 0, SR13 = 0, SR14 = 0, SR16 = 0, SR17 = 0, SR18 = 0, SR19 =
  401.     0, SR1A = 0;
  402. #ifdef CONFIG_FB_SIS_315
  403. /* ULONG   j, k;   */
  404. UCHAR CR39 = 0, CR3A = 0, CR3B = 0, CR3C = 0, CR3D = 0, CR3E = 0, CR3F =
  405.     0;
  406. UCHAR CR79 = 0, CR7A = 0, CR7B = 0, CR7C = 0;
  407. PSIS_DSReg pSR;
  408. ULONG Temp;
  409. #endif
  410. UCHAR VBIOSVersion[5];
  411. /* if(ROMAddr==0)   return (FALSE);*/
  412. if (FBAddr == 0)
  413. return (FALSE);
  414. if (BaseAddr == 0)
  415. return (FALSE);
  416. SiS_SetReg3 ((USHORT) (BaseAddr + 0x12), 0x67); /* 3c2 <- 67 ,ynlai */
  417. #ifdef CONFIG_FB_SIS_315
  418. /*if(HwDeviceExtension->jChipType > SIS_315H) */
  419. if (HwDeviceExtension->jChipType > SIS_315PRO) {
  420. if (!HwDeviceExtension->bIntegratedMMEnabled)
  421. return (FALSE); /* alan  */
  422. }
  423. #endif
  424. SiS_MemoryCopy (VBIOSVersion, HwDeviceExtension->szVBIOSVer, 4);
  425. VBIOSVersion[4] = 0x0;
  426. /* 09/07/99 modify by domao */
  427. #ifdef CONFIG_FB_SIS_315
  428. if ((HwDeviceExtension->jChipType == SIS_315H) ||
  429.     (HwDeviceExtension->jChipType == SIS_315PRO) ||
  430.     (HwDeviceExtension->jChipType == SIS_550) || /* 05/02/01 ynlai for 550 */
  431.     (HwDeviceExtension->jChipType == SIS_640) || /* 08/20/01 chiawen for 640/740 */
  432.     (HwDeviceExtension->jChipType == SIS_740)) /* 09/03/01 chiawen for 650 */
  433. InitTo310Pointer ();
  434. #endif
  435. #ifdef CONFIG_FB_SIS_300
  436. if ((HwDeviceExtension->jChipType == SIS_540) ||
  437.     (HwDeviceExtension->jChipType == SIS_630) ||
  438.     (HwDeviceExtension->jChipType == SIS_730) ||
  439.     (HwDeviceExtension->jChipType == SIS_300))
  440. InitTo300Pointer ();
  441. #endif
  442. SiS_P3c4 = BaseAddr + 0x14;
  443. SiS_P3d4 = BaseAddr + 0x24;
  444. SiS_P3c0 = BaseAddr + 0x10;
  445. SiS_P3ce = BaseAddr + 0x1e;
  446. SiS_P3c2 = BaseAddr + 0x12;
  447. SiS_P3ca = BaseAddr + 0x1a;
  448. SiS_P3c6 = BaseAddr + 0x16;
  449. SiS_P3c7 = BaseAddr + 0x17;
  450. SiS_P3c8 = BaseAddr + 0x18;
  451. SiS_P3c9 = BaseAddr + 0x19;
  452. SiS_P3da = BaseAddr + 0x2A;
  453. SiS_Part1Port = BaseAddr + SIS_CRT2_PORT_04;
  454. SiS_Part2Port = BaseAddr + SIS_CRT2_PORT_10;
  455. SiS_Part3Port = BaseAddr + SIS_CRT2_PORT_12;
  456. SiS_Part4Port = BaseAddr + SIS_CRT2_PORT_14;
  457. SiS_Part5Port = BaseAddr + SIS_CRT2_PORT_14 + 2;
  458. SiS_Set_LVDS_TRUMPION (HwDeviceExtension); /*2/29/00 by Mars Wen for LVDS and Trumpion  */
  459. SiS_SetReg1 (SiS_P3c4, 0x05, 0x86); /* 1.Openkey  */
  460. #ifdef LINUX_KERNEL
  461. #ifdef CONFIG_FB_SIS_300 /* add to set SR14 */
  462. if ((HwDeviceExtension->jChipType == SIS_540) ||
  463.     (HwDeviceExtension->jChipType == SIS_630) ||
  464.     (HwDeviceExtension->jChipType == SIS_730)) {
  465. base = 0x80000060;
  466. OutPortLong (base, 0xcf8);
  467. temp1 = InPortLong (0xcfc);
  468. temp1 = temp1 >> (16 + 8 + 4);
  469. temp1 = temp1 & (0x07);
  470. temp1 = temp1 + 1;
  471. temp1 = 1 << temp1;
  472. SR14 = temp1 - 1;
  473. base = 0x80000064;
  474. OutPortLong (base, 0xcf8);
  475. temp1 = InPortLong (0xcfc);
  476. temp1 = temp1 & (0x00000020);
  477. if (temp1)
  478. SR14 = (0x10000000) | SR14;
  479. else
  480. SR14 = (0x01000000) | SR14;
  481. }
  482. #endif
  483. #ifdef CONFIG_FB_SIS_315 /* add to set SR14 */
  484. if ((HwDeviceExtension->jChipType == SIS_550)) {
  485. base = 0x80000060;
  486. OutPortLong (base, 0xcf8);
  487. temp1 = InPortLong (0xcfc);
  488. temp1 = temp1 >> (16 + 8 + 4);
  489. temp1 = temp1 & (0x07);
  490. temp1 = temp1 + 1;
  491. temp1 = 1 << temp1;
  492. SR14 = temp1 - 1;
  493. base = 0x80000064;
  494. OutPortLong (base, 0xcf8);
  495. temp1 = InPortLong (0xcfc);
  496. temp1 = temp1 & (0x00000020);
  497. if (temp1)
  498. SR14 = (0x10000000) | SR14;
  499. else
  500. SR14 = (0x01000000) | SR14;
  501. }
  502. if ((HwDeviceExtension->jChipType == SIS_640)
  503.     || (HwDeviceExtension->jChipType == SIS_740)) {
  504. base = 0x80000064;
  505. OutPortLong (base, 0xcf8);
  506. temp1 = InPortLong (0xcfc);
  507. temp1 = temp >> 4;
  508. temp1 = temp1 & (0x07);
  509. if (temp1 > 2) {
  510. temp = temp1;
  511. switch (temp) {
  512. case 3:
  513. temp1 = 0x07;
  514. break;
  515. case 4:
  516. temp1 = 0x0F;
  517. break;
  518. case 5:
  519. temp1 = 0x1F;
  520. break;
  521. case 6:
  522. temp1 = 0x05;
  523. break;
  524. case 7:
  525. temp1 = 0x17;
  526. break;
  527. case 8:
  528. break;
  529. case 9:
  530. break;
  531. }
  532. }
  533. SR14 = temp1;
  534. base = 0x8000007C;
  535. OutPortLong (base, 0xcf8);
  536. temp1 = InPortLong (0xcfc);
  537. temp1 = temp1 & (0x00000020);
  538. if (temp1)
  539. SR14 = (0x10000000) | SR14;
  540. }
  541. #endif
  542. #endif
  543. #ifdef CONFIG_FB_SIS_300
  544. if ((HwDeviceExtension->jChipType == SIS_540) ||
  545.     (HwDeviceExtension->jChipType == SIS_630) ||
  546.     (HwDeviceExtension->jChipType == SIS_730)) {
  547. SR12 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x12);
  548. SR13 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x13);
  549. SR14 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x14);
  550. SR16 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x16);
  551. SR17 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x17);
  552. SR18 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x18);
  553. SR19 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x19);
  554. SR1A = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x1A);
  555. } else {
  556. SR13 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x13);
  557. SR14 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x14);
  558. }
  559. #endif
  560. #ifdef CONFIG_FB_SIS_315
  561. if ((HwDeviceExtension->jChipType == SIS_550)) {
  562. CR39 = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x39);
  563. CR3A = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x3A);
  564. CR3B = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x3B);
  565. CR3C = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x3C);
  566. CR3D = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x3D);
  567. CR3E = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x3E);
  568. CR3F = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x3F);
  569. CR79 = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x79);
  570. CR7A = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x7A);
  571. CR7B = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x7B);
  572. CR7C = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x7C);
  573. } else if ((HwDeviceExtension->jChipType == SIS_640) || /* 08/20/01 chiawen for 640/740 */
  574.    (HwDeviceExtension->jChipType == SIS_740)) {
  575. SR12 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x12);
  576. SR13 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x13);
  577. SR14 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x14);
  578. SR16 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x16);
  579. SR17 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x17);
  580. SR18 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x18);
  581. SR19 = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x19);
  582. SR1A = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x1A);
  583. }
  584. #endif
  585. /* ResetExtReg begin */
  586. for (i = 0x06; i < 0x20; i++)
  587. SiS_SetReg1 (SiS_P3c4, i, 0); /* 2.Reset Extended register */
  588. for (i = 0x21; i <= 0x27; i++)
  589. SiS_SetReg1 (SiS_P3c4, i, 0); /*   Reset Extended register */
  590. for (i = 0x31; i <= 0x3D; i++)
  591. SiS_SetReg1 (SiS_P3c4, i, 0);
  592. #ifdef CONFIG_FB_SIS_300H
  593. for (i = 0x38; i <= 0x3F; i++)
  594. SiS_SetReg1 (SiS_P3d4, i, 0);
  595. #endif
  596. #ifdef CONFIG_FB_SIS_315
  597. for (i = 0x37; i <= 0x3F; i++)
  598. SiS_SetReg1 (SiS_P3d4, i, 0);
  599. for (i = 0x79; i <= 0x7C; i++)
  600. SiS_SetReg1 (SiS_P3d4, i, 0);
  601. #endif
  602. /* ResetExtReg end */
  603. #ifdef CONFIG_FB_SIS_300
  604. if ((HwDeviceExtension->jChipType == SIS_540) ||
  605.     (HwDeviceExtension->jChipType == SIS_630) ||
  606.     (HwDeviceExtension->jChipType == SIS_730)) {
  607. SiS_SetReg1 (SiS_P3c4, 0x12, SR12);
  608. SiS_SetReg1 (SiS_P3c4, 0x13, SR13);
  609. SiS_SetReg1 (SiS_P3c4, 0x14, SR14);
  610. SiS_SetReg1 (SiS_P3c4, 0x16, SR16);
  611. SiS_SetReg1 (SiS_P3c4, 0x17, SR17);
  612. SiS_SetReg1 (SiS_P3c4, 0x18, SR18);
  613. SiS_SetReg1 (SiS_P3c4, 0x19, SR19);
  614. SiS_SetReg1 (SiS_P3c4, 0x1A, SR1A);
  615. }
  616. #endif
  617. #ifdef CONFIG_FB_SIS_315
  618. if ((HwDeviceExtension->jChipType == SIS_550)) {
  619. SiS_SetReg1 (SiS_P3d4, 0x39, CR39);
  620. SiS_SetReg1 (SiS_P3d4, 0x3A, CR3A);
  621. SiS_SetReg1 (SiS_P3d4, 0x3B, CR3B);
  622. SiS_SetReg1 (SiS_P3d4, 0x3C, CR3C);
  623. SiS_SetReg1 (SiS_P3d4, 0x3D, CR3D);
  624. SiS_SetReg1 (SiS_P3d4, 0x3E, CR3E);
  625. SiS_SetReg1 (SiS_P3d4, 0x3F, CR3F);
  626. SiS_SetReg1 (SiS_P3d4, 0x79, CR79);
  627. SiS_SetReg1 (SiS_P3d4, 0x7A, CR7A);
  628. SiS_SetReg1 (SiS_P3d4, 0x7B, CR7B);
  629. SiS_SetReg1 (SiS_P3d4, 0x7C, CR7C);
  630. } else if ((HwDeviceExtension->jChipType == SIS_640) || /* 08/20/01 chiawen for 640/740 */
  631.    (HwDeviceExtension->jChipType == SIS_740)) {
  632. SiS_SetReg1 (SiS_P3c4, 0x12, SR12);
  633. SiS_SetReg1 (SiS_P3c4, 0x13, SR13);
  634. SiS_SetReg1 (SiS_P3c4, 0x14, SR14);
  635. SiS_SetReg1 (SiS_P3c4, 0x16, SR16);
  636. SiS_SetReg1 (SiS_P3c4, 0x17, SR17);
  637. SiS_SetReg1 (SiS_P3c4, 0x18, SR18);
  638. SiS_SetReg1 (SiS_P3c4, 0x19, SR19);
  639. SiS_SetReg1 (SiS_P3c4, 0x1A, SR1A);
  640. }
  641. #endif
  642. /* detect ExtChip Type */
  643. SiS_Set_LVDS_TRUMPION (HwDeviceExtension); /*2/29/00 by Mars Wen for LVDS and Trumpion  */
  644. #ifdef CONFIG_FB_SIS_300
  645. if ((HwDeviceExtension->jChipType == SIS_540) ||
  646.     (HwDeviceExtension->jChipType == SIS_630) ||
  647.     (HwDeviceExtension->jChipType == SIS_730)) {
  648. temp = (UCHAR) SR1A;
  649. } else
  650. #endif
  651. {
  652. if ((*pSiS_SoftSetting & SoftDRAMType) == 0) {
  653. temp = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x3A);
  654. }
  655. }
  656. SiS_RAMType = temp & 0x03;
  657. SiS_SetMemoryClock (ROMAddr);
  658. /* SetDefExt1Regs  begin */
  659. SiS_SetReg1 (SiS_P3c4, 0x07, *pSiS_SR07);
  660. if ((HwDeviceExtension->jChipType != SIS_540) &&
  661.     (HwDeviceExtension->jChipType != SIS_630) &&
  662.     (HwDeviceExtension->jChipType != SIS_730)) {
  663. for (i = 0x15; i < 0x1C; i++) {
  664. SiS_SetReg1 (SiS_P3c4, i,
  665.      SiS_SR15[i - 0x15][SiS_RAMType]);
  666. }
  667. }
  668. #ifdef CONFIG_FB_SIS_315
  669. if ((HwDeviceExtension->jChipType == SIS_315H) ||
  670.     (HwDeviceExtension->jChipType == SIS_315PRO)) {
  671. for (i = 0x40; i <= 0x44; i++) {
  672. SiS_SetReg1 (SiS_P3d4, i,
  673.      SiS_CR40[i - 0x40][SiS_RAMType]);
  674. }
  675. SiS_SetReg1 (SiS_P3d4, 0x48, 0x23);
  676. SiS_SetReg1 (SiS_P3d4, 0x49, SiS_CR49[0]);
  677. /* /SiS_SetReg1(SiS_P3c4,0x25,SiS_SR25[0]);  */
  678. }
  679. #endif
  680. SiS_SetReg1 (SiS_P3c4, 0x1F, *pSiS_SR1F);
  681. /*SiS_SetReg1(SiS_P3c4,0x20,0x20); */
  682. SiS_SetReg1 (SiS_P3c4, 0x20, 0xA0); /* alan, 2001/6/26 Frame buffer can read/write */
  683. SiS_SetReg1 (SiS_P3c4, 0x23, *pSiS_SR23);
  684. SiS_SetReg1 (SiS_P3c4, 0x24, *pSiS_SR24);
  685. SiS_SetReg1 (SiS_P3c4, 0x25, SiS_SR25[0]);
  686. #ifdef CONFIG_FB_SIS_300
  687. if (HwDeviceExtension->jChipType == SIS_300) {
  688. SiS_SetReg1 (SiS_P3c4, 0x21, 0x84);
  689. SiS_SetReg1 (SiS_P3c4, 0x22, 0x00);
  690. }
  691. #endif
  692. SR11 = 0x0F;
  693. SiS_SetReg1 (SiS_P3c4, 0x11, SR11);
  694. SiS_UnLockCRT2 (HwDeviceExtension, BaseAddr);
  695. SiS_SetReg1 (SiS_Part1Port, 0x00, 0x00);
  696. SiS_SetReg1 (SiS_Part1Port, 0x02, *pSiS_CRT2Data_1_2);
  697. #ifdef CONFIG_FB_SIS_315 /* 05/02/01 ynlai  for sis550 */
  698. if ((HwDeviceExtension->jChipType == SIS_315H) ||
  699.     (HwDeviceExtension->jChipType == SIS_315PRO) ||
  700.     (HwDeviceExtension->jChipType == SIS_550) ||
  701.     (HwDeviceExtension->jChipType == SIS_640) || /* 08/20/01 chiawen for 640/740 */
  702.     (HwDeviceExtension->jChipType == SIS_740))
  703. /* 09/03/01 chiawen for 650 */
  704. SiS_SetReg1 (SiS_Part1Port, 0x2E, 0x08); /* use VB */
  705. #endif
  706. temp = *pSiS_SR32;
  707. if (SiS_BridgeIsOn (BaseAddr)) {
  708. temp = temp & 0xEF;
  709. }
  710. SiS_SetReg1 (SiS_P3c4, 0x32, temp);
  711. #ifdef CONFIG_FB_SIS_315
  712. if ((HwDeviceExtension->jChipType == SIS_315H) ||
  713.     (HwDeviceExtension->jChipType == SIS_315PRO)) {
  714. HwDeviceExtension->pQueryVGAConfigSpace (HwDeviceExtension,
  715.  0x50, 0, &Temp); /* Get */
  716. Temp >>= 20;
  717. Temp &= 0xF;
  718. if (Temp != 1) {
  719. SiS_SetReg1 (SiS_P3c4, 0x25, SiS_SR25[1]);
  720. SiS_SetReg1 (SiS_P3d4, 0x49, SiS_CR49[1]);
  721. }
  722. SiS_SetReg1 (SiS_P3c4, 0x27, 0x1F);
  723. SiS_SetReg1 (SiS_P3c4, 0x31, *pSiS_SR31);
  724. SiS_SetReg1 (SiS_P3c4, 0x32, *pSiS_SR32);
  725. SiS_SetReg1 (SiS_P3c4, 0x33, *pSiS_SR33);
  726. }
  727. #endif
  728. if (SiS_BridgeIsOn (BaseAddr) == 1) {
  729. if (SiS_IF_DEF_LVDS == 0) {
  730. SiS_SetReg1 (SiS_Part2Port, 0x00, 0x1C);
  731. SiS_SetReg1 (SiS_Part4Port, 0x0D, *pSiS_CRT2Data_4_D);
  732. SiS_SetReg1 (SiS_Part4Port, 0x0E, *pSiS_CRT2Data_4_E);
  733. SiS_SetReg1 (SiS_Part4Port, 0x10, *pSiS_CRT2Data_4_10);
  734. SiS_SetReg1 (SiS_Part4Port, 0x0F, 0x3F);
  735. }
  736. SiS_LockCRT2 (HwDeviceExtension, BaseAddr);
  737. }
  738. SiS_SetReg1 (SiS_P3d4, 0x83, 0x00);
  739. /*   SetDefExt1Regs end */
  740. #ifdef CONFIG_FB_SIS_315
  741. if ((HwDeviceExtension->jChipType == SIS_315H) ||
  742.     (HwDeviceExtension->jChipType == SIS_315PRO)
  743.     ) { /* 05/02/01 ynlai */
  744. /* For SiS 300,310 Chip  */
  745. if (HwDeviceExtension->bSkipDramSizing == TRUE) {
  746. SiS_SetDRAMModeRegister (ROMAddr);
  747. pSR = HwDeviceExtension->pSR;
  748. if (pSR != NULL) {
  749. while (pSR->jIdx != 0xFF) {
  750. SiS_SetReg1 (SiS_P3c4, pSR->jIdx,
  751.      pSR->jVal);
  752. pSR++;
  753. }
  754. }
  755. } else
  756. SiS_SetDRAMSize_310 (HwDeviceExtension);
  757. }
  758. #endif
  759. #ifdef CONFIG_FB_SIS_315
  760. if ((HwDeviceExtension->jChipType == SIS_550)) { /* 05/02/01 ynlai For SiS 550 */
  761. /* SetDRAMConfig begin */
  762. /*     SiS_SetReg1(SiS_P3c4,0x12,SR12);
  763.        SiS_SetReg1(SiS_P3c4,0x13,SR13);
  764.        SiS_SetReg1(SiS_P3c4,0x14,SR14);
  765.        SiS_SetReg1(SiS_P3c4,0x16,SR16);
  766.        SiS_SetReg1(SiS_P3c4,0x17,SR17);
  767.        SiS_SetReg1(SiS_P3c4,0x18,SR18);
  768.        SiS_SetReg1(SiS_P3c4,0x19,SR19);
  769.        SiS_SetReg1(SiS_P3c4,0x1A,SR1A);   */
  770. /* SetDRAMConfig end */
  771. }
  772. #endif
  773. #ifdef CONFIG_FB_SIS_300
  774. if (HwDeviceExtension->jChipType == SIS_300) { /* For SiS 300 Chip  */
  775. if (HwDeviceExtension->bSkipDramSizing == TRUE) {
  776. /*       SiS_SetDRAMModeRegister(ROMAddr);
  777.          temp = (HwDeviceExtension->pSR)->jVal;
  778.          SiS_SetReg1(SiS_P3c4,0x13,temp);
  779.          temp = (HwDeviceExtension->pSR)->jVal;
  780.          SiS_SetReg1(SiS_P3c4,0x14,temp);   */
  781. } else {
  782. #ifdef TC
  783. SiS_SetReg1 (SiS_P3c4, 0x13, SR13);
  784. SiS_SetReg1 (SiS_P3c4, 0x14, SR14);
  785. SiS_SetRegANDOR (SiS_P3c4, 0x15, 0xFF, 0x04);
  786. #else
  787. SiS_SetDRAMSize_300 (HwDeviceExtension);
  788. SiS_SetDRAMSize_300 (HwDeviceExtension);
  789. #endif
  790. }
  791. }
  792. if ((HwDeviceExtension->jChipType == SIS_540) || /* For SiS 630/540/730 Chip  */
  793.     (HwDeviceExtension->jChipType == SIS_630) ||
  794.     (HwDeviceExtension->jChipType == SIS_730)) {
  795. /* SetDRAMConfig begin */
  796. /*     SiS_SetReg1(SiS_P3c4,0x12,SR12);
  797.        SiS_SetReg1(SiS_P3c4,0x13,SR13);
  798.        SiS_SetReg1(SiS_P3c4,0x14,SR14);
  799.        SiS_SetReg1(SiS_P3c4,0x16,SR16);
  800.        SiS_SetReg1(SiS_P3c4,0x17,SR17);
  801.        SiS_SetReg1(SiS_P3c4,0x18,SR18);
  802.        SiS_SetReg1(SiS_P3c4,0x19,SR19);
  803.        SiS_SetReg1(SiS_P3c4,0x1A,SR1A);    */
  804. /* SetDRAMConfig end */
  805. }
  806. /* SetDRAMSize end */
  807. #endif
  808. /*   SetDefExt2Regs begin  */
  809. /* AGP=1;
  810.    temp=(UCHAR)SiS_GetReg1(SiS_P3c4,0x3A);
  811.    temp=temp&0x30;
  812.    if(temp==0x30) AGP=0;
  813.    if(AGP==0) *pSiS_SR21=*pSiS_SR21&0xEF;
  814.    SiS_SetReg1(SiS_P3c4,0x21,*pSiS_SR21);
  815.    if(AGP==1) *pSiS_SR22=*pSiS_SR22&0x20;
  816.    SiS_SetReg1(SiS_P3c4,0x22,*pSiS_SR22);  */
  817. SiS_SetReg1 (SiS_P3c4, 0x21, *pSiS_SR21);
  818. SiS_SetReg1 (SiS_P3c4, 0x22, *pSiS_SR22);
  819. /*   SetDefExt2Regs end  */
  820. /* SiS_SetReg3(SiS_P3c6,0xff);
  821.    SiS_ClearDAC(SiS_P3c8);        [ynlai] 05/22/01            */
  822. SiS_DetectMonitor (HwDeviceExtension, BaseAddr);
  823. SiS_GetSenseStatus (HwDeviceExtension, ROMAddr); /* sense CRT2 */
  824. return (TRUE);
  825. }
  826. void
  827. SiS_Set_LVDS_TRUMPION (PSIS_HW_DEVICE_INFO HwDeviceExtension)
  828. {
  829. USHORT temp;
  830. #ifdef CONFIG_FB_SIS_300
  831. if ((HwDeviceExtension->jChipType == SIS_540) ||
  832.     (HwDeviceExtension->jChipType == SIS_630) ||
  833.     (HwDeviceExtension->jChipType == SIS_730)) {
  834. temp = (UCHAR) SiS_GetReg1 (SiS_P3c4, 0x1A);
  835. temp = (temp & 0xE0) >> 4;
  836. SiS_SetRegANDOR (SiS_P3d4, 0x37, 0xF1, temp);
  837. temp = temp >> 1;
  838. if ((temp == 0) || (temp == 1)) { /* for 301 */
  839. SiS_IF_DEF_LVDS = 0;
  840. SiS_IF_DEF_CH7005 = 0;
  841. SiS_IF_DEF_TRUMPION = 0;
  842. }
  843. if ((temp >= 2) && (temp <= 5)) {
  844. SiS_IF_DEF_LVDS = 1;
  845. }
  846. if (temp == 3)
  847. SiS_IF_DEF_TRUMPION = 1;
  848. if ((temp == 4) || (temp == 5))
  849. SiS_IF_DEF_CH7005 = 1;
  850. } else {
  851. SiS_IF_DEF_LVDS = 0;
  852. SiS_IF_DEF_TRUMPION = 0;
  853. SiS_IF_DEF_CH7005 = 0;
  854. }
  855. #else
  856. if ((HwDeviceExtension->jChipType == SIS_550) ||
  857.     (HwDeviceExtension->jChipType == SIS_640) || /* 08/20/01 chiawen for 640/740 */
  858.     (HwDeviceExtension->jChipType == SIS_740))
  859.  { /* 09/03/01 chiawen for 650 */
  860. SiS_IF_DEF_LVDS = 0;
  861. SiS_IF_DEF_TRUMPION = 0;
  862. SiS_IF_DEF_CH7005 = 0;
  863. }
  864. #endif
  865. }
  866. /* ===============  for 300 dram sizing begin  =============== */
  867. #ifdef CONFIG_FB_SIS_300
  868. void
  869. SiS_SetDRAMSize_300 (PSIS_HW_DEVICE_INFO HwDeviceExtension)
  870. {
  871. /*ULONG   ROMAddr  = (ULONG)HwDeviceExtension->pjVirtualRomBase; */
  872. ULONG FBAddr = (ULONG) HwDeviceExtension->pjVideoMemoryAddress;
  873. /*USHORT  BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress; */
  874. USHORT SR13, SR14 = 0, buswidth, Done;
  875. SHORT i, j, k;
  876. USHORT data, TotalCapacity, PhysicalAdrOtherPage = 0;
  877. ULONG Addr;
  878. UCHAR temp;
  879. int PseudoRankCapacity, PseudoTotalCapacity, PseudoAdrPinCount;
  880. int RankCapacity, AdrPinCount, BankNumHigh, BankNumMid, MB2Bank;
  881. /*int PageCapacity,PhysicalAdrHigh,PhysicalAdrHalfPage,PhysicalAdrAnotherPage; */
  882. int PageCapacity, PhysicalAdrHigh, PhysicalAdrHalfPage;
  883. SiSSetMode (HwDeviceExtension, 0x2e);
  884. data = SiS_GetReg1 (SiS_P3c4, 0x1);
  885. data = data | 0x20;
  886. SiS_SetReg1 (SiS_P3c4, 0x01, data); /* Turn OFF Display  */
  887. SiS_SetReg1 (SiS_P3c4, 0x13, 0x00);
  888. SiS_SetReg1 (SiS_P3c4, 0x14, 0xBF);
  889. buswidth = SiS_ChkBUSWidth_300 (FBAddr);
  890. MB2Bank = 16;
  891. Done = 0;
  892. for (i = 6; i >= 0; i--) {
  893. if (Done == 1)
  894. break;
  895. PseudoRankCapacity = 1 << i;
  896. for (j = 4; j >= 1; j--) {
  897. if (Done == 1)
  898. break;
  899. PseudoTotalCapacity = PseudoRankCapacity * j;
  900. PseudoAdrPinCount = 15 - j;
  901. if (PseudoTotalCapacity <= 64) {
  902. for (k = 0; k <= 16; k++) {
  903. if (Done == 1)
  904. break;
  905. RankCapacity =
  906.     buswidth * SiS_DRAMType[k][3];
  907. AdrPinCount =
  908.     SiS_DRAMType[k][2] +
  909.     SiS_DRAMType[k][0];
  910. if (RankCapacity == PseudoRankCapacity)
  911. if (AdrPinCount <=
  912.     PseudoAdrPinCount) {
  913. if (j == 3) { /* Rank No */
  914. BankNumHigh =
  915.     RankCapacity
  916.     * MB2Bank *
  917.     3 - 1;
  918. BankNumMid =
  919.     RankCapacity
  920.     * MB2Bank *
  921.     1 - 1;
  922. } else {
  923. BankNumHigh =
  924.     RankCapacity
  925.     * MB2Bank *
  926.     j - 1;
  927. BankNumMid =
  928.     RankCapacity
  929.     * MB2Bank *
  930.     j / 2 - 1;
  931. }
  932. PageCapacity =
  933.     (1 <<
  934.      SiS_DRAMType[k][1])
  935.     * buswidth * 4;
  936. PhysicalAdrHigh =
  937.     BankNumHigh;
  938. PhysicalAdrHalfPage =
  939.     (PageCapacity / 2 +
  940.      PhysicalAdrHigh) %
  941.     PageCapacity;
  942. PhysicalAdrOtherPage =
  943.     PageCapacity *
  944.     SiS_DRAMType[k][2] +
  945.     PhysicalAdrHigh;
  946. /* Write data */
  947. /*Test */
  948. temp =
  949.     (UCHAR)
  950.     SiS_GetReg1
  951.     (SiS_P3c4, 0x15);
  952. SiS_SetReg1 (SiS_P3c4,
  953.      0x15,
  954.      (USHORT)
  955.      (temp &
  956.       0xFB));
  957. temp =
  958.     (UCHAR)
  959.     SiS_GetReg1
  960.     (SiS_P3c4, 0x15);
  961. SiS_SetReg1 (SiS_P3c4,
  962.      0x15,
  963.      (USHORT)
  964.      (temp |
  965.       0x04));
  966. /*Test */
  967. TotalCapacity =
  968.     SiS_DRAMType[k][3] *
  969.     buswidth;
  970. SR13 =
  971.     SiS_DRAMType[k][4];
  972. if (buswidth == 4)
  973. SR14 =
  974.     (TotalCapacity
  975.      -
  976.      1) | 0x80;
  977. if (buswidth == 2)
  978. SR14 =
  979.     (TotalCapacity
  980.      -
  981.      1) | 0x40;
  982. if (buswidth == 1)
  983. SR14 =
  984.     (TotalCapacity
  985.      -
  986.      1) | 0x00;
  987. SiS_SetReg1 (SiS_P3c4,
  988.      0x13,
  989.      SR13);
  990. SiS_SetReg1 (SiS_P3c4,
  991.      0x14,
  992.      SR14);
  993. Addr =
  994.     FBAddr +
  995.     (BankNumHigh) * 64 *
  996.     1024 +
  997.     PhysicalAdrHigh;
  998. *((USHORT *) (Addr)) =
  999.     (USHORT)
  1000.     PhysicalAdrHigh;
  1001. Addr =
  1002.     FBAddr +
  1003.     (BankNumMid) * 64 *
  1004.     1024 +
  1005.     PhysicalAdrHigh;
  1006. *((USHORT *) (Addr)) =
  1007.     (USHORT) BankNumMid;
  1008. Addr =
  1009.     FBAddr +
  1010.     (BankNumHigh) * 64 *
  1011.     1024 +
  1012.     PhysicalAdrHalfPage;
  1013. *((USHORT *) (Addr)) =
  1014.     (USHORT)
  1015.     PhysicalAdrHalfPage;
  1016. Addr =
  1017.     FBAddr +
  1018.     (BankNumHigh) * 64 *
  1019.     1024 +
  1020.     PhysicalAdrOtherPage;
  1021. *((USHORT *) (Addr)) =
  1022.     PhysicalAdrOtherPage;
  1023. /* Read data */
  1024. Addr =
  1025.     FBAddr +
  1026.     (BankNumHigh) * 64 *
  1027.     1024 +
  1028.     PhysicalAdrHigh;
  1029. data =
  1030.     *((USHORT *)
  1031.       (Addr));
  1032. if (data ==
  1033.     PhysicalAdrHigh)
  1034.     Done = 1;
  1035. } /* if struct */
  1036. } /* for loop (k) */
  1037. } /* if struct */
  1038. } /* for loop (j) */
  1039. } /* for loop (i) */
  1040. }
  1041. USHORT
  1042. SiS_ChkBUSWidth_300 (ULONG FBAddress)
  1043. {
  1044. /*USHORT  data; */
  1045. PULONG pVideoMemory;
  1046. pVideoMemory = (PULONG) FBAddress;
  1047. pVideoMemory[0] = 0x01234567L;
  1048. pVideoMemory[1] = 0x456789ABL;
  1049. pVideoMemory[2] = 0x89ABCDEFL;
  1050. pVideoMemory[3] = 0xCDEF0123L;
  1051. if (pVideoMemory[3] == 0xCDEF0123L) { /*ChannelA128Bit */
  1052. return (4);
  1053. }
  1054. if (pVideoMemory[1] == 0x456789ABL) { /*ChannelB64Bit */
  1055. return (2);
  1056. }
  1057. return (1);
  1058. }
  1059. #endif
  1060. /* ===============  for 300 dram sizing end    =============== */
  1061. /* ============== alan ====================== */
  1062. #ifdef CONFIG_FB_SIS_315
  1063. UCHAR
  1064. SiS_Get310DRAMType (ULONG ROMAddr)
  1065. {
  1066. UCHAR data;
  1067. /* 
  1068.    index=SiS_GetReg1(SiS_P3c4,0x1A);
  1069.    index=index&07;
  1070.  */
  1071. if (*pSiS_SoftSetting & SoftDRAMType)
  1072. data = *pSiS_SoftSetting & 0x03;
  1073. else
  1074. data = SiS_GetReg1 (SiS_P3c4, 0x3a) & 0x03;
  1075. return data;
  1076. }
  1077. void
  1078. SiS_Delay15us (ULONG ulMicrsoSec)
  1079. {
  1080. }
  1081. void
  1082. SiS_SDR_MRS (void)
  1083. {
  1084. USHORT data;
  1085. data = SiS_GetReg1 (SiS_P3c4, 0x16);
  1086. data = data & 0x3F; /*/ SR16 D7=0,D6=0 */
  1087. SiS_SetReg1 (SiS_P3c4, 0x16, data); /*/ enable mode register set(MRS) low */
  1088. SiS_Delay15us (0x100);
  1089. data = data | 0x80; /*/ SR16 D7=1,D6=0 */
  1090. SiS_SetReg1 (SiS_P3c4, 0x16, data); /*/ enable mode register set(MRS) high */
  1091. SiS_Delay15us (0x100);
  1092. }
  1093. void
  1094. SiS_DDR_MRS (void)
  1095. {
  1096. USHORT data;
  1097. /* SR16 <- 1F,DF,2F,AF */
  1098. /* enable DLL of DDR SD/SGRAM , SR16 D4=1 */
  1099. data = SiS_GetReg1 (SiS_P3c4, 0x16);
  1100. data &= 0x0F;
  1101. data |= 0x10;
  1102. SiS_SetReg1 (SiS_P3c4, 0x16, data);
  1103. if (!(SiS_SR15[1][SiS_RAMType] & 0x10)) {
  1104. data &= 0x0F;
  1105. }
  1106. /* SR16 D7=1,D6=1 */
  1107. data |= 0xC0;
  1108. SiS_SetReg1 (SiS_P3c4, 0x16, data);
  1109. /* SR16 D7=1,D6=0,D5=1,D4=0 */
  1110. data &= 0x0F;
  1111. data |= 0x20;
  1112. SiS_SetReg1 (SiS_P3c4, 0x16, data);
  1113. if (!(SiS_SR15[1][SiS_RAMType] & 0x10)) {
  1114. data &= 0x0F;
  1115. }
  1116. /* SR16 D7=1 */
  1117. data |= 0x80;
  1118. SiS_SetReg1 (SiS_P3c4, 0x16, data);
  1119. }
  1120. void
  1121. SiS_SetDRAMModeRegister (ULONG ROMAddr)
  1122. {
  1123. if (SiS_Get310DRAMType (ROMAddr) < 2) {
  1124. SiS_SDR_MRS ();
  1125. } else {
  1126. /* SR16 <- 0F,CF,0F,8F */
  1127. SiS_DDR_MRS ();
  1128. }
  1129. }
  1130. void
  1131. SiS_DisableRefresh (void)
  1132. {
  1133. USHORT data;
  1134. data = SiS_GetReg1 (SiS_P3c4, 0x17);
  1135. data &= 0xF8;
  1136. SiS_SetReg1 (SiS_P3c4, 0x17, data);
  1137. data = SiS_GetReg1 (SiS_P3c4, 0x19);
  1138. data |= 0x03;
  1139. SiS_SetReg1 (SiS_P3c4, 0x19, data);
  1140. }
  1141. void
  1142. SiS_EnableRefresh (ULONG ROMAddr)
  1143. {
  1144. SiS_SetReg1 (SiS_P3c4, 0x17, SiS_SR15[2][SiS_RAMType]); /* SR17 */
  1145. SiS_SetReg1 (SiS_P3c4, 0x19, SiS_SR15[4][SiS_RAMType]); /* SR19 */
  1146. }
  1147. void
  1148. SiS_DisableChannelInterleaving (int index, USHORT SiS_DDRDRAM_TYPE[][5])
  1149. {
  1150. USHORT data;
  1151. data = SiS_GetReg1 (SiS_P3c4, 0x15);
  1152. data &= 0x1F;
  1153. switch (SiS_DDRDRAM_TYPE[index][3]) {
  1154. case 64:
  1155. data |= 0;
  1156. break;
  1157. case 32:
  1158. data |= 0x20;
  1159. break;
  1160. case 16:
  1161. data |= 0x40;
  1162. break;
  1163. case 4:
  1164. data |= 0x60;
  1165. break;
  1166. }
  1167. SiS_SetReg1 (SiS_P3c4, 0x15, data);
  1168. }
  1169. void
  1170. SiS_SetDRAMSizingType (int index, USHORT DRAMTYPE_TABLE[][5])
  1171. {
  1172. USHORT data;
  1173. data = DRAMTYPE_TABLE[index][4];
  1174. SiS_SetReg1 (SiS_P3c4, 0x13, data);
  1175. /* should delay 50 ns */
  1176. }
  1177. void
  1178. SiS_CheckBusWidth_310 (ULONG ROMAddress, ULONG FBAddress)
  1179. {
  1180. USHORT data;
  1181. PULONG volatile pVideoMemory;
  1182. pVideoMemory = (PULONG) FBAddress;
  1183. if (SiS_Get310DRAMType (ROMAddress) < 2) {
  1184. SiS_SetReg1 (SiS_P3c4, 0x13, 0x00);
  1185. SiS_SetReg1 (SiS_P3c4, 0x14, 0x12);
  1186. /* should delay */
  1187. SiS_SDR_MRS ();
  1188. SiS_ChannelAB = 0;
  1189. SiS_DataBusWidth = 128;
  1190. pVideoMemory[0] = 0x01234567L;
  1191. pVideoMemory[1] = 0x456789ABL;
  1192. pVideoMemory[2] = 0x89ABCDEFL;
  1193. pVideoMemory[3] = 0xCDEF0123L;
  1194. pVideoMemory[4] = 0x55555555L;
  1195. pVideoMemory[5] = 0x55555555L;
  1196. pVideoMemory[6] = 0xFFFFFFFFL;
  1197. pVideoMemory[7] = 0xFFFFFFFFL;
  1198. if ((pVideoMemory[3] != 0xCDEF0123L)
  1199.     || (pVideoMemory[2] != 0x89ABCDEFL)) {
  1200. /*ChannelA64Bit */
  1201. SiS_DataBusWidth = 64;
  1202. SiS_ChannelAB = 0;
  1203. data = SiS_GetReg1 (SiS_P3c4, 0x14);
  1204. SiS_SetReg1 (SiS_P3c4, 0x14, (USHORT) (data & 0xFD));
  1205. }
  1206. if ((pVideoMemory[1] != 0x456789ABL)
  1207.     || (pVideoMemory[0] != 0x01234567L)) {
  1208. /*ChannelB64Bit */
  1209. SiS_DataBusWidth = 64;
  1210. SiS_ChannelAB = 1;
  1211. data = SiS_GetReg1 (SiS_P3c4, 0x14);
  1212. SiS_SetReg1 (SiS_P3c4, 0x14,
  1213.      (USHORT) ((data & 0xFD) | 0x01));
  1214. }
  1215. return;
  1216. } else {
  1217. /* DDR Dual channel */
  1218. SiS_SetReg1 (SiS_P3c4, 0x13, 0x00);
  1219. SiS_SetReg1 (SiS_P3c4, 0x14, 0x02); /* Channel A, 64bit */
  1220. /* should delay */
  1221. SiS_DDR_MRS ();
  1222. SiS_ChannelAB = 0;
  1223. SiS_DataBusWidth = 64;
  1224. pVideoMemory[0] = 0x01234567L;
  1225. pVideoMemory[1] = 0x456789ABL;
  1226. pVideoMemory[2] = 0x89ABCDEFL;
  1227. pVideoMemory[3] = 0xCDEF0123L;
  1228. pVideoMemory[4] = 0x55555555L;
  1229. pVideoMemory[5] = 0x55555555L;
  1230. pVideoMemory[6] = 0xAAAAAAAAL;
  1231. pVideoMemory[7] = 0xAAAAAAAAL;
  1232. if (pVideoMemory[1] == 0x456789ABL) {
  1233. if (pVideoMemory[0] == 0x01234567L) {
  1234. /* Channel A 64bit */
  1235. return;
  1236. }
  1237. } else {
  1238. if (pVideoMemory[0] == 0x01234567L) {
  1239. /* Channel A 32bit */
  1240. SiS_DataBusWidth = 32;
  1241. SiS_SetReg1 (SiS_P3c4, 0x14, 0x00);
  1242. return;
  1243. }
  1244. }
  1245. SiS_SetReg1 (SiS_P3c4, 0x14, 0x03); /* Channel B, 64bit */
  1246. SiS_DDR_MRS ();
  1247. SiS_ChannelAB = 1;
  1248. SiS_DataBusWidth = 64;
  1249. pVideoMemory[0] = 0x01234567L;
  1250. pVideoMemory[1] = 0x456789ABL;
  1251. pVideoMemory[2] = 0x89ABCDEFL;
  1252. pVideoMemory[3] = 0xCDEF0123L;
  1253. pVideoMemory[4] = 0x55555555L;
  1254. pVideoMemory[5] = 0x55555555L;
  1255. pVideoMemory[6] = 0xAAAAAAAAL;
  1256. pVideoMemory[7] = 0xAAAAAAAAL;
  1257. if (pVideoMemory[1] == 0x456789ABL) {
  1258. /* Channel B 64 */
  1259. if (pVideoMemory[0] == 0x01234567L) {
  1260. /* Channel B 64bit */
  1261. return;
  1262. } else {
  1263. /* error */
  1264. }
  1265. } else {
  1266. if (pVideoMemory[0] == 0x01234567L) {
  1267. /* Channel B 32 */
  1268. SiS_DataBusWidth = 32;
  1269. SiS_SetReg1 (SiS_P3c4, 0x14, 0x01);
  1270. } else {
  1271. /* error */
  1272. }
  1273. }
  1274. }
  1275. }
  1276. int
  1277. SiS_SetRank (int index, UCHAR RankNo, UCHAR SiS_ChannelAB,
  1278.      USHORT DRAMTYPE_TABLE[][5])
  1279. {
  1280. USHORT data;
  1281. int RankSize;
  1282. if ((RankNo == 2) && (DRAMTYPE_TABLE[index][0] == 2))
  1283. return 0;
  1284. RankSize = DRAMTYPE_TABLE[index][3] / 2 * SiS_DataBusWidth / 32;
  1285. if (RankNo * RankSize <= 128) {
  1286. data = 0;
  1287. while ((RankSize >>= 1) > 0) {
  1288. data += 0x10;
  1289. }
  1290. data |= (RankNo - 1) << 2;
  1291. data |= (SiS_DataBusWidth / 64) & 2;
  1292. data |= SiS_ChannelAB;
  1293. SiS_SetReg1 (SiS_P3c4, 0x14, data);
  1294. /* should delay */
  1295. SiS_SDR_MRS ();
  1296. return 1;
  1297. } else
  1298. return 0;
  1299. }
  1300. int
  1301. SiS_SetDDRChannel (int index, UCHAR ChannelNo, UCHAR SiS_ChannelAB,
  1302.    USHORT DRAMTYPE_TABLE[][5])
  1303. {
  1304. USHORT data;
  1305. int RankSize;
  1306. RankSize = DRAMTYPE_TABLE[index][3] / 2 * SiS_DataBusWidth / 32;
  1307. /* RankSize = DRAMTYPE_TABLE[index][3]; */
  1308. if (ChannelNo * RankSize <= 128) {
  1309. data = 0;
  1310. while ((RankSize >>= 1) > 0) {
  1311. data += 0x10;
  1312. }
  1313. if (ChannelNo == 2)
  1314. data |= 0x0C;
  1315. data |= (SiS_DataBusWidth / 32) & 2;
  1316. data |= SiS_ChannelAB;
  1317. SiS_SetReg1 (SiS_P3c4, 0x14, data);
  1318. /* should delay */
  1319. SiS_DDR_MRS ();
  1320. return 1;
  1321. } else
  1322. return 0;
  1323. }
  1324. int
  1325. SiS_CheckColumn (int index, USHORT DRAMTYPE_TABLE[][5], ULONG FBAddress)
  1326. {
  1327. int i;
  1328. ULONG Increment, Position;
  1329. /*Increment = 1<<(DRAMTYPE_TABLE[index][2] + SiS_DataBusWidth / 64 + 1); */
  1330. Increment = 1 << (10 + SiS_DataBusWidth / 64);
  1331. for (i = 0, Position = 0; i < 2; i++) {
  1332. *((PULONG) (FBAddress + Position)) = Position;
  1333. Position += Increment;
  1334. }
  1335. for (i = 0, Position = 0; i < 2; i++) {
  1336. /*    if (FBAddress[Position]!=Position) */
  1337. if ((*(PULONG) (FBAddress + Position)) != Position)
  1338. return 0;
  1339. Position += Increment;
  1340. }
  1341. return 1;
  1342. }
  1343. int
  1344. SiS_CheckBanks (int index, USHORT DRAMTYPE_TABLE[][5], ULONG FBAddress)
  1345. {
  1346. int i;
  1347. ULONG Increment, Position;
  1348. Increment = 1 << (DRAMTYPE_TABLE[index][2] + SiS_DataBusWidth / 64 + 2);
  1349. for (i = 0, Position = 0; i < 4; i++) {
  1350. /*    FBAddress[Position]=Position; */
  1351. *((PULONG) (FBAddress + Position)) = Position;
  1352. Position += Increment;
  1353. }
  1354. for (i = 0, Position = 0; i < 4; i++) {
  1355. /*    if (FBAddress[Position]!=Position) */
  1356. if ((*(PULONG) (FBAddress + Position)) != Position)
  1357. return 0;
  1358. Position += Increment;
  1359. }
  1360. return 1;
  1361. }
  1362. int
  1363. SiS_CheckRank (int RankNo, int index, USHORT DRAMTYPE_TABLE[][5],
  1364.        ULONG FBAddress)
  1365. {
  1366. int i;
  1367. ULONG Increment, Position;
  1368. Increment = 1 << (DRAMTYPE_TABLE[index][2] + DRAMTYPE_TABLE[index][1] +
  1369.   DRAMTYPE_TABLE[index][0] + SiS_DataBusWidth / 64 +
  1370.   RankNo);
  1371. for (i = 0, Position = 0; i < 2; i++) {
  1372. /*    FBAddress[Position]=Position; */
  1373. *((PULONG) (FBAddress + Position)) = Position;
  1374. /* *((PULONG)(FBAddress))=Position; */
  1375. Position += Increment;
  1376. }
  1377. for (i = 0, Position = 0; i < 2; i++) {
  1378. /*    if (FBAddress[Position]!=Position) */
  1379. if ((*(PULONG) (FBAddress + Position)) != Position)
  1380. /*if ( (*(PULONG) (FBAddress )) !=Position) */
  1381. return 0;
  1382. Position += Increment;
  1383. }
  1384. return 1;
  1385. }
  1386. int
  1387. SiS_CheckDDRRank (int RankNo, int index, USHORT DRAMTYPE_TABLE[][5],
  1388.   ULONG FBAddress)
  1389. {
  1390. ULONG Increment, Position;
  1391. USHORT data;
  1392. Increment = 1 << (DRAMTYPE_TABLE[index][2] + DRAMTYPE_TABLE[index][1] +
  1393.   DRAMTYPE_TABLE[index][0] + SiS_DataBusWidth / 64 +
  1394.   RankNo);
  1395. Increment += Increment / 2;
  1396. Position = 0;
  1397. *((PULONG) (FBAddress + Position + 0)) = 0x01234567;
  1398. *((PULONG) (FBAddress + Position + 1)) = 0x456789AB;
  1399. *((PULONG) (FBAddress + Position + 2)) = 0x55555555;
  1400. *((PULONG) (FBAddress + Position + 3)) = 0x55555555;
  1401. *((PULONG) (FBAddress + Position + 4)) = 0xAAAAAAAA;
  1402. *((PULONG) (FBAddress + Position + 5)) = 0xAAAAAAAA;
  1403. if ((*(PULONG) (FBAddress + 1)) == 0x456789AB)
  1404. return 1;
  1405. if ((*(PULONG) (FBAddress + 0)) == 0x01234567)
  1406. return 0;
  1407. data = SiS_GetReg1 (SiS_P3c4, 0x14);
  1408. data &= 0xF3;
  1409. data |= 0x08;
  1410. SiS_SetReg1 (SiS_P3c4, 0x14, data);
  1411. data = SiS_GetReg1 (SiS_P3c4, 0x15);
  1412. data += 0x20;
  1413. SiS_SetReg1 (SiS_P3c4, 0x15, data);
  1414. return 1;
  1415. }
  1416. int
  1417. SiS_CheckRanks (int RankNo, int index, USHORT DRAMTYPE_TABLE[][5],
  1418. ULONG FBAddress)
  1419. {
  1420. int r;
  1421. for (r = RankNo; r >= 1; r--) {
  1422. if (!SiS_CheckRank (r, index, DRAMTYPE_TABLE, FBAddress))
  1423. return 0;
  1424. }
  1425. if (!SiS_CheckBanks (index, DRAMTYPE_TABLE, FBAddress))
  1426. return 0;
  1427. if (!SiS_CheckColumn (index, DRAMTYPE_TABLE, FBAddress))
  1428. return 0;
  1429. return 1;
  1430. }
  1431. int
  1432. SiS_CheckDDRRanks (int RankNo, int index, USHORT DRAMTYPE_TABLE[][5],
  1433.    ULONG FBAddress)
  1434. {
  1435. int r;
  1436. for (r = RankNo; r >= 1; r--) {
  1437. if (!SiS_CheckDDRRank (r, index, DRAMTYPE_TABLE, FBAddress))
  1438. return 0;
  1439. }
  1440. if (!SiS_CheckBanks (index, DRAMTYPE_TABLE, FBAddress))
  1441. return 0;
  1442. if (!SiS_CheckColumn (index, DRAMTYPE_TABLE, FBAddress))
  1443. return 0;
  1444. return 1;
  1445. }
  1446. int
  1447. SiS_SDRSizing (ULONG FBAddress)
  1448. {
  1449. int i;
  1450. UCHAR j;
  1451. for (i = 0; i < 13; i++) {
  1452. SiS_SetDRAMSizingType (i, SiS_SDRDRAM_TYPE);
  1453. for (j = 2; j > 0; j--) {
  1454. if (!SiS_SetRank
  1455.     (i, (UCHAR) j, SiS_ChannelAB,
  1456.      SiS_SDRDRAM_TYPE)) continue;
  1457. else {
  1458. if (SiS_CheckRanks
  1459.     (j, i, SiS_SDRDRAM_TYPE,
  1460.      FBAddress)) return 1;
  1461. }
  1462. }
  1463. }
  1464. return 0;
  1465. }
  1466. int
  1467. SiS_DDRSizing (ULONG FBAddress)
  1468. {
  1469. int i;
  1470. UCHAR j;
  1471. for (i = 0; i < 4; i++) {
  1472. SiS_SetDRAMSizingType (i, SiS_DDRDRAM_TYPE);
  1473. SiS_DisableChannelInterleaving (i, SiS_DDRDRAM_TYPE);
  1474. for (j = 2; j > 0; j--) {
  1475. SiS_SetDDRChannel (i, j, SiS_ChannelAB,
  1476.    SiS_DDRDRAM_TYPE);
  1477. if (!SiS_SetRank
  1478.     (i, (UCHAR) j, SiS_ChannelAB,
  1479.      SiS_DDRDRAM_TYPE)) continue;
  1480. else {
  1481. if (SiS_CheckDDRRanks
  1482.     (j, i, SiS_DDRDRAM_TYPE,
  1483.      FBAddress)) return 1;
  1484. }
  1485. }
  1486. }
  1487. return 0;
  1488. }
  1489. /*
  1490.  check if read cache pointer is correct
  1491. */
  1492. void
  1493. SiS_VerifyMclk (ULONG FBAddr)
  1494. {
  1495. PUCHAR pVideoMemory = (PUCHAR) FBAddr;
  1496. UCHAR i, j;
  1497. USHORT Temp, SR21;
  1498. pVideoMemory[0] = 0xaa; /* alan */
  1499. pVideoMemory[16] = 0x55; /* note: PCI read cache is off */
  1500. if ((pVideoMemory[0] != 0xaa) || (pVideoMemory[16] != 0x55)) {
  1501. for (i = 0, j = 16; i < 2; i++, j += 16) {
  1502. SR21 = SiS_GetReg1 (SiS_P3c4, 0x21);
  1503. Temp = SR21 & 0xFB; /* disable PCI post write buffer empty gating */
  1504. SiS_SetReg1 (SiS_P3c4, 0x21, Temp);
  1505. Temp = SiS_GetReg1 (SiS_P3c4, 0x3C);
  1506. Temp = Temp | 0x01; /*MCLK reset */
  1507. SiS_SetReg1 (SiS_P3c4, 0x3C, Temp);
  1508. Temp = SiS_GetReg1 (SiS_P3c4, 0x3C);
  1509. Temp = Temp & 0xFE; /* MCLK normal operation */
  1510. SiS_SetReg1 (SiS_P3c4, 0x3C, Temp);
  1511. SiS_SetReg1 (SiS_P3c4, 0x21, SR21);
  1512. pVideoMemory[16 + j] = j;
  1513. if (pVideoMemory[16 + j] == j) {
  1514. pVideoMemory[j] = j;
  1515. break;
  1516. }
  1517. }
  1518. }
  1519. }
  1520. int
  1521. Is315E (void)
  1522. {
  1523. USHORT data;
  1524. data = SiS_GetReg1 (SiS_P3d4, 0x5F);
  1525. if (data & 0x10)
  1526. return 1;
  1527. else
  1528. return 0;
  1529. }
  1530. void
  1531. SiS_SetDRAMSize_310 (PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1532. {
  1533. ULONG ROMAddr = (ULONG) HwDeviceExtension->pjVirtualRomBase;
  1534. ULONG FBAddr = (ULONG) HwDeviceExtension->pjVideoMemoryAddress;
  1535. /*USHORT  BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress; */
  1536. USHORT data;
  1537. #ifdef SIS301
  1538. /*SiS_SetReg1(SiS_P3d4,0x30,0x40);   */
  1539. #endif
  1540. #ifdef SIS302
  1541. SiS_SetReg1 (SiS_P3d4, 0x30, 0x4D); /* alan,should change value */
  1542. SiS_SetReg1 (SiS_P3d4, 0x31, 0xc0); /* alan,should change value */
  1543. SiS_SetReg1 (SiS_P3d4, 0x34, 0x3F); /* alan,should change value */
  1544. #endif
  1545. SiSSetMode (HwDeviceExtension, 0x2e);
  1546. data = SiS_GetReg1 (SiS_P3c4, 0x21);
  1547. SiS_SetReg1 (SiS_P3c4, 0x21, (USHORT) (data & 0xDF)); /* disable read cache */
  1548. data = SiS_GetReg1 (SiS_P3c4, 0x1);
  1549. data = data | 0x20;
  1550. SiS_SetReg1 (SiS_P3c4, 0x01, data); /* Turn OFF Display */
  1551. data = SiS_GetReg1 (SiS_P3c4, 0x16);
  1552. SiS_SetReg1 (SiS_P3c4, 0x16, (USHORT) (data | 0x0F)); /* assume lowest speed DRAM */
  1553. SiS_SetDRAMModeRegister (ROMAddr);
  1554. SiS_DisableRefresh ();
  1555. SiS_CheckBusWidth_310 (ROMAddr, FBAddr);
  1556. SiS_VerifyMclk (FBAddr); /* alan 2000/7/3 */
  1557. if (SiS_Get310DRAMType (ROMAddr) < 2) {
  1558. SiS_SDRSizing (FBAddr);
  1559. } else {
  1560. SiS_DDRSizing (FBAddr);
  1561. }
  1562. if (Is315E ()) {
  1563. data = SiS_GetReg1 (SiS_P3c4, 0x14);
  1564. if ((data & 0x0C) == 0x0C) { /* dual channel */
  1565. if ((data & 0xF0) > 0x40)
  1566. data = (data & 0x0F) | 0x40;
  1567. } else { /* single channel */
  1568. if ((data & 0xF0) > 0x50)
  1569. data = (data & 0x0F) | 0x50;
  1570. }
  1571. }
  1572. SiS_SetReg1 (SiS_P3c4, 0x16, SiS_SR15[1][SiS_RAMType]); /* restore SR16 */
  1573. SiS_EnableRefresh (ROMAddr);
  1574. data = SiS_GetReg1 (SiS_P3c4, 0x21);
  1575. SiS_SetReg1 (SiS_P3c4, 0x21, (USHORT) (data | 0x20)); /* enable read cache */
  1576. }
  1577. #endif
  1578. void
  1579. SiS_SetMemoryClock (ULONG ROMAddr)
  1580. {
  1581. SiS_SetReg1 (SiS_P3c4, 0x28, SiS_MCLKData[SiS_RAMType].SR28);
  1582. SiS_SetReg1 (SiS_P3c4, 0x29, SiS_MCLKData[SiS_RAMType].SR29);
  1583. SiS_SetReg1 (SiS_P3c4, 0x2A, SiS_MCLKData[SiS_RAMType].SR2A);
  1584. SiS_SetReg1 (SiS_P3c4, 0x2E, SiS_ECLKData[SiS_RAMType].SR2E);
  1585. SiS_SetReg1 (SiS_P3c4, 0x2F, SiS_ECLKData[SiS_RAMType].SR2F);
  1586. SiS_SetReg1 (SiS_P3c4, 0x30, SiS_ECLKData[SiS_RAMType].SR30);
  1587. #ifdef CONFIG_FB_SIS_315
  1588. if (Is315E ()) {
  1589. SiS_SetReg1 (SiS_P3c4, 0x28, 0x3B); /* 143 */
  1590. SiS_SetReg1 (SiS_P3c4, 0x29, 0x22);
  1591. SiS_SetReg1 (SiS_P3c4, 0x2E, 0x3B); /* 143 */
  1592. SiS_SetReg1 (SiS_P3c4, 0x2F, 0x22);
  1593. }
  1594. #endif
  1595. }
  1596. /*
  1597. =========================================
  1598.  ======== SiS SetMode Function  ==========
  1599. =========================================
  1600. */
  1601. BOOLEAN
  1602. SiSSetMode (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo)
  1603. {
  1604. ULONG temp;
  1605. USHORT ModeIdIndex, KeepLockReg;
  1606. ULONG ROMAddr = (ULONG) HwDeviceExtension->pjVirtualRomBase;
  1607. /*ULONG   FBAddr   = (ULONG)HwDeviceExtension->pjVideoMemoryAddress; */
  1608. USHORT BaseAddr = (USHORT) HwDeviceExtension->ulIOAddress;
  1609. #ifdef CONFIG_FB_SIS_315
  1610. if ((HwDeviceExtension->jChipType == SIS_315H) || /* 05/02/01 ynlai for sis550 */
  1611.     (HwDeviceExtension->jChipType == SIS_315PRO) ||
  1612.     (HwDeviceExtension->jChipType == SIS_550) ||
  1613.     (HwDeviceExtension->jChipType == SIS_640) || /* 08/20/01 chiawen for 640/740 */
  1614.     (HwDeviceExtension->jChipType == SIS_740)) /* 09/03/01 chiawen for 650 */
  1615. InitTo310Pointer ();
  1616. #endif
  1617. #ifdef CONFIG_FB_SIS_300
  1618. if ((HwDeviceExtension->jChipType == SIS_540) ||
  1619.     (HwDeviceExtension->jChipType == SIS_630) ||
  1620.     (HwDeviceExtension->jChipType == SIS_730) ||
  1621.     (HwDeviceExtension->jChipType == SIS_300))
  1622. InitTo300Pointer ();
  1623. #endif
  1624. SiS_P3c4 = BaseAddr + 0x14;
  1625. SiS_P3d4 = BaseAddr + 0x24;
  1626. SiS_P3c0 = BaseAddr + 0x10;
  1627. SiS_P3ce = BaseAddr + 0x1e;
  1628. SiS_P3c2 = BaseAddr + 0x12;
  1629. SiS_P3ca = BaseAddr + 0x1a;
  1630. SiS_P3c6 = BaseAddr + 0x16;
  1631. SiS_P3c7 = BaseAddr + 0x17;
  1632. SiS_P3c8 = BaseAddr + 0x18;
  1633. SiS_P3c9 = BaseAddr + 0x19;
  1634. SiS_P3da = BaseAddr + 0x2A;
  1635. SiS_Part1Port = BaseAddr + SIS_CRT2_PORT_04;
  1636. SiS_Part2Port = BaseAddr + SIS_CRT2_PORT_10;
  1637. SiS_Part3Port = BaseAddr + SIS_CRT2_PORT_12;
  1638. SiS_Part4Port = BaseAddr + SIS_CRT2_PORT_14;
  1639. SiS_Part5Port = BaseAddr + SIS_CRT2_PORT_14 + 2;
  1640. SiS_IF_DEF_LVDS = 0;
  1641. SiS_IF_DEF_CH7005 = 0;
  1642. SiS_IF_DEF_HiVision = 0;
  1643. SiS_IF_DEF_DSTN = 0; /*for 550 dstn */
  1644. if ((HwDeviceExtension->jChipType == SIS_540) ||
  1645.     (HwDeviceExtension->jChipType == SIS_630) ||
  1646.     (HwDeviceExtension->jChipType == SIS_730) ||
  1647.     (HwDeviceExtension->jChipType == SIS_550) ||
  1648.     (HwDeviceExtension->jChipType == SIS_640) || /* 08/20/01 chiawen for 640/740 */
  1649.     (HwDeviceExtension->jChipType == SIS_740)) { /* 09/03/01 chiawen for 650 */
  1650. temp = SiS_GetReg1 (SiS_P3d4, 0x37);
  1651. temp = (temp & 0x0E) >> 1;
  1652. if ((temp == 0) || (temp == 1)) { /* for 301 */
  1653. SiS_IF_DEF_LVDS = 0;
  1654. SiS_IF_DEF_CH7005 = 0;
  1655. SiS_IF_DEF_TRUMPION = 0;
  1656. }
  1657. if ((temp >= 2) && (temp <= 5)) {
  1658. SiS_IF_DEF_LVDS = 1;
  1659. }
  1660. if (temp == 3)
  1661. SiS_IF_DEF_TRUMPION = 1;
  1662. if ((temp == 4) || (temp == 5))
  1663. SiS_IF_DEF_CH7005 = 1;
  1664. } else {
  1665. SiS_IF_DEF_LVDS = 0;
  1666. SiS_IF_DEF_TRUMPION = 0;
  1667. SiS_IF_DEF_CH7005 = 0;
  1668. }
  1669. if (ModeNo & 0x80) {
  1670. ModeNo = ModeNo & 0x7F;
  1671. flag_clearbuffer = 0;
  1672. } else {
  1673. flag_clearbuffer = 1;
  1674. }
  1675. SiS_PresetScratchregister (SiS_P3d4, HwDeviceExtension); /*add for CRT2  */
  1676. KeepLockReg = SiS_GetReg1 (SiS_P3c4, 0x05);
  1677. SiS_SetReg1 (SiS_P3c4, 0x05, 0x86); /* 1.Openkey */
  1678. temp = SiS_SearchModeID (ROMAddr, ModeNo, &ModeIdIndex); /* 2.Get ModeID Table  */
  1679. if (temp == 0)
  1680. return (0);
  1681. /*301b */
  1682. SiS_GetVBType (BaseAddr);
  1683. /*end 301b */
  1684. SiS_GetVBInfo301 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex, HwDeviceExtension); /*add for CRT2 */
  1685. SiS_GetLCDResInfo301 (ROMAddr, SiS_P3d4, ModeNo, ModeIdIndex); /*add for CRT2 */
  1686. temp = SiS_CheckMemorySize (ROMAddr, HwDeviceExtension, ModeNo, ModeIdIndex); /*3.Check memory size */
  1687. if (temp == 0)
  1688. return (0);
  1689. if (SiS_VBInfo & (SetSimuScanMode | SetCRT2ToLCDA)) { /*301b */
  1690. SiS_SetCRT1Group (ROMAddr, HwDeviceExtension, ModeNo,
  1691.   ModeIdIndex);
  1692. } else {
  1693. if (!(SiS_VBInfo & SwitchToCRT2)) {
  1694. SiS_SetCRT1Group (ROMAddr, HwDeviceExtension, ModeNo,
  1695.   ModeIdIndex);
  1696. }
  1697. }
  1698. if (SiS_VBInfo & (SetSimuScanMode | SwitchToCRT2 | SetCRT2ToLCDA)) { /*301b */
  1699. switch (HwDeviceExtension->ujVBChipID) {
  1700. /*karl*/
  1701. case VB_CHIP_301:
  1702. case VB_CHIP_301B:
  1703. SiS_SetCRT2Group301 (BaseAddr, ROMAddr, ModeNo, HwDeviceExtension); /*add for CRT2 */
  1704. break;
  1705. case VB_CHIP_302:
  1706. SiS_SetCRT2Group301 (BaseAddr, ROMAddr, ModeNo,
  1707.      HwDeviceExtension);
  1708. break;
  1709. case VB_CHIP_303:
  1710. /*        SetCRT2Group302(BaseAddr,ROMAddr,ModeNo, HwDeviceExtension);                       add for CRT2   */
  1711. break;
  1712. case VB_CHIP_UNKNOWN: /*add for lvds ch7005 */
  1713. temp = SiS_GetReg1 (SiS_P3d4, 0x37);
  1714. if (temp &
  1715.     (ExtChipLVDS | ExtChipTrumpion | ExtChipCH7005)) {
  1716. SiS_SetCRT2Group301 (BaseAddr, ROMAddr, ModeNo,
  1717.      HwDeviceExtension);
  1718. }
  1719. break;
  1720. }
  1721. }
  1722. if (KeepLockReg == 0xA1)
  1723. SiS_SetReg1 (SiS_P3c4, 0x05, 0x86); /* 05/02/01 ynlai */
  1724. else
  1725. SiS_SetReg1 (SiS_P3c4, 0x05, 0x00);
  1726. return TRUE;
  1727. }
  1728. void
  1729. SiS_SetCRT1Group (ULONG ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
  1730.   USHORT ModeNo, USHORT ModeIdIndex)
  1731. {
  1732. USHORT StandTableIndex, RefreshRateTableIndex;
  1733. USHORT temp;
  1734. /*SiS_SetReg1(SiS_P3d4,0x34,ModeNo); */
  1735. SiS_CRT1Mode = ModeNo;
  1736. /* set CR34->CRT1 ModeNofor CRT2 FIFO */
  1737. StandTableIndex = SiS_GetModePtr (ROMAddr, ModeNo, ModeIdIndex); /* 4.GetModePtr  */
  1738. SiS_SetSeqRegs (ROMAddr, StandTableIndex); /* 5.SetSeqRegs  */
  1739. SiS_SetMiscRegs (ROMAddr, StandTableIndex); /* 6.SetMiscRegs */
  1740. SiS_SetCRTCRegs (ROMAddr, HwDeviceExtension, StandTableIndex); /* 7.SetCRTCRegs */
  1741. SiS_SetATTRegs (ROMAddr, StandTableIndex); /* 8.SetATTRegs  */
  1742. SiS_SetGRCRegs (ROMAddr, StandTableIndex); /* 9.SetGRCRegs  */
  1743. SiS_ClearExt1Regs (); /* 10.Clear Ext1Regs */
  1744. temp = ~ProgrammingCRT2; /*       11.GetRatePtr  */
  1745. SiS_SetFlag = SiS_SetFlag & temp;
  1746. SiS_SelectCRT2Rate = 0;
  1747. /*301b */
  1748. if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
  1749. if (SiS_VBInfo & SetCRT2ToLCDA) {
  1750. SiS_SetFlag = SiS_SetFlag | ProgrammingCRT2;
  1751. /*   SiS_SelectCRT2Rate=4; */
  1752. }
  1753. }
  1754. /*end 301b */
  1755. RefreshRateTableIndex = SiS_GetRatePtrCRT2 (ROMAddr, ModeNo, ModeIdIndex); /* 11.GetRatePtr */
  1756. /*301b */
  1757. if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
  1758. if (!(SiS_VBInfo & SetCRT2ToLCDA)) {
  1759. SiS_SetFlag = SiS_SetFlag & (~ProgrammingCRT2);
  1760. }
  1761. }
  1762. /*end 301b */
  1763. if (RefreshRateTableIndex != 0xFFFF) {
  1764. SiS_SetSync (ROMAddr, RefreshRateTableIndex); /* 12.SetSync */
  1765. SiS_SetCRT1CRTC (ROMAddr, ModeNo, ModeIdIndex, RefreshRateTableIndex); /* 13.SetCRT1CRTC  */
  1766. SiS_SetCRT1Offset (ROMAddr, ModeNo, ModeIdIndex,
  1767.    RefreshRateTableIndex, HwDeviceExtension); /* 14.SetCRT1Offset */
  1768. SiS_SetCRT1VCLK (ROMAddr, ModeNo, ModeIdIndex,
  1769.  HwDeviceExtension, RefreshRateTableIndex); /* 15.SetCRT1VCLK  */
  1770. }
  1771. #ifdef CONFIG_FB_SIS_300
  1772. if ((HwDeviceExtension->jChipType == SIS_630) ||
  1773.     (HwDeviceExtension->jChipType == SIS_540)) {
  1774. SiS_SetCRT1FIFO2 (ROMAddr, ModeNo, HwDeviceExtension,
  1775.   RefreshRateTableIndex);
  1776. }
  1777. #endif
  1778. #ifdef CONFIG_FB_SIS_315
  1779. if (HwDeviceExtension->jChipType >= SIS_315H) {
  1780. SiS_SetCRT1FIFO (ROMAddr, ModeNo, HwDeviceExtension);
  1781. }
  1782. #endif
  1783. SiS_SetCRT1ModeRegs (ROMAddr, HwDeviceExtension, ModeNo, ModeIdIndex,
  1784.      RefreshRateTableIndex);
  1785. SiS_SetVCLKState (ROMAddr, HwDeviceExtension, ModeNo,
  1786.   RefreshRateTableIndex);
  1787. #ifdef CONFIG_FB_SIS_315
  1788. if (HwDeviceExtension->jChipType > SIS_315H)
  1789. SiS_SetInterlace (ROMAddr, ModeNo, RefreshRateTableIndex);
  1790. #endif
  1791. SiS_LoadDAC (ROMAddr, ModeNo, ModeIdIndex);
  1792. if (flag_clearbuffer)
  1793. SiS_ClearBuffer (HwDeviceExtension, ModeNo);
  1794. if (!(SiS_VBInfo & (SetSimuScanMode | SwitchToCRT2 | SetCRT2ToLCDA))) { /*301b */
  1795. SiS_LongWait ();
  1796. SiS_DisplayOn ();
  1797. }
  1798. }
  1799. void
  1800. SiS_GetVBType (USHORT BaseAddr)
  1801. {
  1802. USHORT flag;
  1803. flag = SiS_GetReg1 (SiS_Part4Port, 0x00);
  1804. if (flag >= 2)
  1805. SiS_VBType = VB_SIS302B;
  1806. else {
  1807. flag = SiS_GetReg1 (SiS_Part4Port, 0x01);
  1808. if (flag >= 0xB0)
  1809. SiS_VBType = VB_SIS301B;
  1810. else
  1811. SiS_VBType = VB_SIS301;
  1812. flag = SiS_GetReg1 (SiS_Part4Port, 0x23); /*301dlvds */
  1813. if (!(flag & 0x02))
  1814. SiS_VBType = SiS_VBType | VB_NoLCD;
  1815. }
  1816. }
  1817. /* win2000 MM adapter not support standard mode  */
  1818. BOOLEAN
  1819. SiS_SearchModeID (ULONG ROMAddr, USHORT ModeNo, USHORT * ModeIdIndex)
  1820. {
  1821. PUCHAR VGA_INFO = "x11";
  1822. if (ModeNo <= 5)
  1823. ModeNo |= 1;
  1824. if (ModeNo <= 0x13) {
  1825. /* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(SiS_SModeIDTable)/sizeof(SiS_StStruct);(*ModeIdIndex)++) */
  1826. for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
  1827. if (SiS_SModeIDTable[*ModeIdIndex].St_ModeID == ModeNo)
  1828. break;
  1829. if (SiS_SModeIDTable[*ModeIdIndex].St_ModeID == 0xFF)
  1830. return FALSE;
  1831. }
  1832. #ifdef TC
  1833. VGA_INFO = (PUCHAR) MK_FP (0, 0x489);
  1834. #endif
  1835. if (ModeNo == 0x07) {
  1836. if ((*VGA_INFO & 0x10) != 0)
  1837. (*ModeIdIndex)++; /* 400 lines */
  1838. /* else 350 lines */
  1839. }
  1840. if (ModeNo <= 3) {
  1841. if ((*VGA_INFO & 0x80) == 0) {
  1842. (*ModeIdIndex)++;
  1843. if ((*VGA_INFO & 0x10) != 0)
  1844. (*ModeIdIndex)++;; /* 400 lines  */
  1845. /* else 350 lines  */
  1846. }
  1847. /* else 200 lines  */
  1848. }
  1849. } else {
  1850. /* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(SiS_EModeIDTable)/sizeof(SiS_ExtStruct);(*ModeIdIndex)++) */
  1851. for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
  1852. if (SiS_EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
  1853. break;
  1854. if (SiS_EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
  1855. return FALSE;
  1856. }
  1857. }
  1858. return TRUE;
  1859. }
  1860. /*add for 300 oem util for search VBModeID*/
  1861. BOOLEAN
  1862. SiS_SearchVBModeID (ULONG ROMAddr, USHORT ModeNo)
  1863. {
  1864. USHORT ModeIdIndex;
  1865. // PUCHAR VGA_INFO;
  1866. if (ModeNo <= 5)
  1867. ModeNo |= 1;
  1868. /* for (ModeIdIndex=0;ModeIdIndex<sizeof(SiS_SModeIDTable)/sizeof(SiS_StStruct);(*ModeIdIndex)++) */
  1869. for (ModeIdIndex = 0;; (ModeIdIndex)++) {
  1870. if (SiS_VBModeIDTable[ModeIdIndex].ModeID == ModeNo)
  1871. break;
  1872. if (SiS_VBModeIDTable[ModeIdIndex].ModeID == 0xFF)
  1873. return FALSE;
  1874. }
  1875. #ifdef TC
  1876. VGA_INFO = (PUCHAR) MK_FP (0, 0x489);
  1877. if (ModeNo == 0x07) {
  1878. if ((*VGA_INFO & 0x10) != 0)
  1879. (ModeIdIndex)++; /* 400 lines */
  1880. /* else 350 lines */
  1881. }
  1882. if (ModeNo <= 3) {
  1883. if ((*VGA_INFO & 0x80) == 0) {
  1884. (ModeIdIndex)++;
  1885. if ((*VGA_INFO & 0x10) != 0)
  1886. (ModeIdIndex)++;; /* 400 lines  */
  1887. /* else 350 lines  */
  1888. }
  1889. /* else 200 lines  */
  1890. }
  1891. #endif
  1892. return ((BOOLEAN) ModeIdIndex);
  1893. }
  1894. /*end*/
  1895. /* win2000 MM adapter not support standard mode!  */
  1896. BOOLEAN
  1897. SiS_CheckMemorySize (ULONG ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
  1898.      USHORT ModeNo, USHORT ModeIdIndex)
  1899. {
  1900. USHORT memorysize;
  1901. USHORT modeflag;
  1902. USHORT temp;
  1903. if (ModeNo <= 0x13) {
  1904. modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  1905. } else {
  1906. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  1907. }
  1908. /*  ModeType=modeflag&ModeInfoFlag;                           Get mode type  */
  1909. memorysize = modeflag & MemoryInfoFlag;
  1910. memorysize = memorysize > MemorySizeShift;
  1911. memorysize++; /* Get memory size */
  1912. temp = SiS_GetReg1 (SiS_P3c4, 0x14); /* Get DRAM Size    */
  1913. if ((HwDeviceExtension->jChipType == SIS_315H) ||
  1914.     (HwDeviceExtension->jChipType == SIS_315PRO)) {
  1915. temp = 1 << ((temp & 0x0F0) >> 4);
  1916. if ((temp & 0x0c) == 0x08) { /* DDR asymetric */
  1917. temp += temp / 2;
  1918. } else {
  1919. if ((temp & 0x0c) != 0) {
  1920. temp <<= 1;
  1921. }
  1922. }
  1923. } else { /* 300, 540 , 630 */
  1924. temp = temp & 0x3F;
  1925. temp++;
  1926. /*  temp=1 << ((temp&0x0F0)>>4); */
  1927. }
  1928. if ((HwDeviceExtension->jChipType == SIS_550) || /* 05/02/01 ynlai for sis550 */
  1929.     (HwDeviceExtension->jChipType == SIS_640) || /* 08/20/01 chiawen for 640/740 */
  1930.     (HwDeviceExtension->jChipType == SIS_740)) { /* 09/03/01 chiawen for 650 */
  1931. return (TRUE);
  1932. }
  1933. if (temp < memorysize)
  1934. return (FALSE);
  1935. else
  1936. return (TRUE);
  1937. }
  1938. UCHAR
  1939. SiS_GetModePtr (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
  1940. {
  1941. UCHAR index;
  1942. if (ModeNo <= 0x13) {
  1943. index = SiS_SModeIDTable[ModeIdIndex].St_StTableIndex;
  1944. } else {
  1945. if (SiS_ModeType <= 0x02)
  1946. index = 0x1B; /* 02 -> ModeEGA  */
  1947. else
  1948. index = 0x0F;
  1949. }
  1950. return index; /* Get SiS_StandTable index  */
  1951. }
  1952. void
  1953. SiS_SetSeqRegs (ULONG ROMAddr, USHORT StandTableIndex)
  1954. {
  1955. UCHAR SRdata;
  1956. USHORT i;
  1957. SiS_SetReg1 (SiS_P3c4, 0x00, 0x03); /* Set SR0  */
  1958. SRdata = SiS_StandTable[StandTableIndex].SR[0];
  1959. /*301b */
  1960. if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
  1961. if (SiS_VBInfo & SetCRT2ToLCDA) {
  1962. SRdata = SRdata | 0x01;
  1963. }
  1964. }
  1965. /*end 301b */
  1966. if (SiS_IF_DEF_LVDS == 1) {
  1967. if (SiS_IF_DEF_CH7005 == 1) {
  1968. if (SiS_VBInfo & SetCRT2ToTV) {
  1969. if (SiS_VBInfo & SetInSlaveMode) {
  1970. SRdata = SRdata | 0x01; /* 8 dot clock  */
  1971. }
  1972. }
  1973. }
  1974. if (SiS_VBInfo & SetCRT2ToLCD) {
  1975. if (SiS_VBInfo & SetInSlaveMode) {
  1976. SRdata = SRdata | 0x01; /* 8 dot clock  */
  1977. }
  1978. }
  1979. }
  1980. SRdata = SRdata | 0x20; /* screen off  */
  1981. SiS_SetReg1 (SiS_P3c4, 0x01, SRdata); /* Set SR1 */
  1982. for (i = 02; i <= 04; i++) {
  1983. SRdata = SiS_StandTable[StandTableIndex].SR[i - 1]; /* Get SR2,3,4 from file */
  1984. SiS_SetReg1 (SiS_P3c4, i, SRdata); /* Set SR2 3 4 */
  1985. }
  1986. }
  1987. void
  1988. SiS_SetMiscRegs (ULONG ROMAddr, USHORT StandTableIndex)
  1989. {
  1990. UCHAR Miscdata;
  1991. Miscdata = SiS_StandTable[StandTableIndex].MISC; /* Get Misc from file */
  1992. /*301b */
  1993. if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
  1994. if (SiS_VBInfo & SetCRT2ToLCDA) {
  1995. Miscdata = Miscdata | 0x0C;
  1996. }
  1997. }
  1998. /*end 301b */
  1999. SiS_SetReg3 (SiS_P3c2, Miscdata); /* Set Misc(3c2) */
  2000. }
  2001. void
  2002. SiS_SetCRTCRegs (ULONG ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
  2003.  USHORT StandTableIndex)
  2004. {
  2005. UCHAR CRTCdata;
  2006. USHORT i;
  2007. CRTCdata = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x11);
  2008. CRTCdata = CRTCdata & 0x7f;
  2009. SiS_SetReg1 (SiS_P3d4, 0x11, CRTCdata); /* Unlock CRTC */
  2010. for (i = 0; i <= 0x18; i++) {
  2011. CRTCdata = SiS_StandTable[StandTableIndex].CRTC[i]; /* Get CRTC from file */
  2012. SiS_SetReg1 (SiS_P3d4, i, CRTCdata); /* Set CRTC(3d4) */
  2013. }
  2014. if ((HwDeviceExtension->jChipType == SIS_630) &&
  2015.     (HwDeviceExtension->jChipRevision == 0x30)) { /* for 630S0 */
  2016. if (SiS_VBInfo & SetInSlaveMode) {
  2017. if (SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
  2018. SiS_SetReg1 (SiS_P3d4, 0x18, 0xFE);
  2019. }
  2020. }
  2021. }
  2022. }
  2023. void
  2024. SiS_SetATTRegs (ULONG ROMAddr, USHORT StandTableIndex)
  2025. {
  2026. UCHAR ARdata;
  2027. USHORT i;
  2028. for (i = 0; i <= 0x13; i++) {
  2029. ARdata = SiS_StandTable[StandTableIndex].ATTR[i]; /* Get AR for file  */
  2030. /*301b */
  2031. if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
  2032. if (SiS_VBInfo & SetCRT2ToLCDA) {
  2033. if (i == 0x13) {
  2034. ARdata = 0;
  2035. }
  2036. }
  2037. }
  2038. /*end 301b */
  2039. if (SiS_IF_DEF_LVDS == 1) { /*for LVDS  */
  2040. if (SiS_IF_DEF_CH7005 == 1) {
  2041. if (SiS_VBInfo & SetCRT2ToTV) {
  2042. if (SiS_VBInfo & SetInSlaveMode) {
  2043. if (i == 0x13) {
  2044. ARdata = 0;
  2045. }
  2046. }
  2047. }
  2048. }
  2049. if (SiS_VBInfo & SetCRT2ToLCD) {
  2050. if (SiS_VBInfo & SetInSlaveMode) {
  2051. if (SiS_LCDInfo & LCDNonExpanding) {
  2052. if (i == 0x13) {
  2053. ARdata = 0;
  2054. }
  2055. }
  2056. }
  2057. }
  2058. }
  2059. SiS_GetReg2 (SiS_P3da); /* reset 3da  */
  2060. SiS_SetReg3 (SiS_P3c0, i); /* set index  */
  2061. SiS_SetReg3 (SiS_P3c0, ARdata); /* set data   */
  2062. }
  2063. SiS_GetReg2 (SiS_P3da); /* reset 3da  */
  2064. SiS_SetReg3 (SiS_P3c0, 0x14); /* set index  */
  2065. SiS_SetReg3 (SiS_P3c0, 0x00); /* set data   */
  2066. SiS_GetReg2 (SiS_P3da); /* Enable Attribute  */
  2067. SiS_SetReg3 (SiS_P3c0, 0x20);
  2068. }
  2069. void
  2070. SiS_SetGRCRegs (ULONG ROMAddr, USHORT StandTableIndex)
  2071. {
  2072. UCHAR GRdata;
  2073. USHORT i;
  2074. for (i = 0; i <= 0x08; i++) {
  2075. GRdata = SiS_StandTable[StandTableIndex].GRC[i]; /* Get GR from file */
  2076. SiS_SetReg1 (SiS_P3ce, i, GRdata); /* Set GR(3ce) */
  2077. }
  2078. if (SiS_ModeType > ModeVGA) {
  2079. GRdata = (UCHAR) SiS_GetReg1 (SiS_P3ce, 0x05);
  2080. GRdata = GRdata & 0xBF; /* 256 color disable */
  2081. SiS_SetReg1 (SiS_P3ce, 0x05, GRdata);
  2082. }
  2083. }
  2084. void
  2085. SiS_ClearExt1Regs ()
  2086. {
  2087. USHORT i;
  2088. for (i = 0x0A; i <= 0x0E; i++)
  2089. SiS_SetReg1 (SiS_P3c4, i, 0x00); /* Clear SR0A-SR0E */
  2090. }
  2091. void
  2092. SiS_SetSync (ULONG ROMAddr, USHORT RefreshRateTableIndex)
  2093. {
  2094. USHORT sync;
  2095. USHORT temp;
  2096. sync = SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8; /* di+0x00 */
  2097. sync = sync & 0xC0;
  2098. temp = 0x2F;
  2099. temp = temp | sync;
  2100. SiS_SetReg3 (SiS_P3c2, temp); /* Set Misc(3c2) */
  2101. }
  2102. void
  2103. SiS_SetCRT1CRTC (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  2104.  USHORT RefreshRateTableIndex)
  2105. {
  2106. UCHAR index;
  2107. UCHAR data;
  2108. USHORT temp, tempah, i, modeflag, j;
  2109. USHORT ResInfo, DisplayType;
  2110. SiS_LCDACRT1DataStruct *LCDACRT1Ptr = NULL;
  2111. if ((SiS_VBType & VB_SIS302B) && (SiS_VBInfo & SetCRT2ToLCDA)) {
  2112. /*add crt1ptr */
  2113. if (ModeNo <= 0x13) {
  2114. modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
  2115. } else {
  2116. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
  2117. }
  2118. temp =
  2119.     SiS_GetLCDACRT1Ptr (ROMAddr, ModeNo, ModeIdIndex,
  2120. RefreshRateTableIndex, &ResInfo,
  2121. &DisplayType);
  2122. switch (DisplayType) {
  2123. case 0:
  2124. LCDACRT1Ptr = SiS_LCDACRT1800x600_1;
  2125. break;
  2126. case 1:
  2127. LCDACRT1Ptr = SiS_LCDACRT11024x768_1;
  2128. break;
  2129. case 2:
  2130. LCDACRT1Ptr = SiS_LCDACRT11280x1024_1;
  2131. break;
  2132. case 3:
  2133. LCDACRT1Ptr = SiS_LCDACRT1800x600_1_H;
  2134. break;
  2135. case 4:
  2136. LCDACRT1Ptr = SiS_LCDACRT11024x768_1_H;
  2137. break;
  2138. case 5:
  2139. LCDACRT1Ptr = SiS_LCDACRT11280x1024_1_H;
  2140. break;
  2141. case 6:
  2142. LCDACRT1Ptr = SiS_LCDACRT1800x600_2;
  2143. break;
  2144. case 7:
  2145. LCDACRT1Ptr = SiS_LCDACRT11024x768_2;
  2146. break;
  2147. case 8:
  2148. LCDACRT1Ptr = SiS_LCDACRT11280x1024_2;
  2149. break;
  2150. case 9:
  2151. LCDACRT1Ptr = SiS_LCDACRT1800x600_2_H;
  2152. break;
  2153. case 10:
  2154. LCDACRT1Ptr = SiS_LCDACRT11024x768_2_H;
  2155. break;
  2156. case 11:
  2157. LCDACRT1Ptr = SiS_LCDACRT11280x1024_2_H;
  2158. break;
  2159. /*case 12: LCDACRT1Ptr = SiS_CHTVCRT1UNTSC;               break;
  2160.    case 13: LCDACRT1Ptr = SiS_CHTVCRT1ONTSC;               break;
  2161.    case 14: LCDACRT1Ptr = SiS_CHTVCRT1UPAL;                break;
  2162.    case 15: LCDACRT1Ptr = SiS_CHTVCRT1OPAL;                break; */
  2163. }
  2164. tempah = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x11); /*unlock cr0-7  */
  2165. tempah = tempah & 0x7F;
  2166. SiS_SetReg1 (SiS_P3d4, 0x11, tempah);
  2167. tempah = (LCDACRT1Ptr + ResInfo)->CR[0];
  2168. SiS_SetReg1 (SiS_P3d4, 0x0, tempah);
  2169. for (i = 0x01, j = 1; i <= 0x07; i++, j++) {
  2170. tempah = (LCDACRT1Ptr + ResInfo)->CR[j];
  2171. SiS_SetReg1 (SiS_P3d4, i, tempah);
  2172. }
  2173. /* for(i=0x06,j=5;i<=0x07;i++,j++){
  2174.    tempah = (LCDACRT1Ptr+ResInfo)->CR[j];
  2175.     SiS_SetReg1(SiS_P3d4,i,tempah);
  2176.   }*/
  2177. for (i = 0x10, j = 8; i <= 0x12; i++, j++) {
  2178. tempah = (LCDACRT1Ptr + ResInfo)->CR[j];
  2179. SiS_SetReg1 (SiS_P3d4, i, tempah);
  2180. }
  2181. for (i = 0x15, j = 11; i <= 0x16; i++, j++) {
  2182. tempah = (LCDACRT1Ptr + ResInfo)->CR[j];
  2183. SiS_SetReg1 (SiS_P3d4, i, tempah);
  2184. }
  2185. for (i = 0x0A, j = 13; i <= 0x0C; i++, j++) {
  2186. tempah = (LCDACRT1Ptr + ResInfo)->CR[j];
  2187. SiS_SetReg1 (SiS_P3c4, i, tempah);
  2188. }
  2189. tempah = (LCDACRT1Ptr + ResInfo)->CR[16];
  2190. tempah = tempah & 0x0E0;
  2191. SiS_SetReg1 (SiS_P3c4, 0x0E, tempah);
  2192. tempah = (LCDACRT1Ptr + ResInfo)->CR[16];
  2193. tempah = tempah & 0x01;
  2194. tempah = tempah << 5;
  2195. if (modeflag & DoubleScanMode) {
  2196. tempah = tempah | 0x080;
  2197. }
  2198. SiS_SetRegANDOR (SiS_P3d4, 0x09, ~0x020, tempah);
  2199. if (SiS_ModeType > 0x03)
  2200. SiS_SetReg1 (SiS_P3d4, 0x14, 0x4F);
  2201. /*end 301b*/
  2202. } else {
  2203. index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; /* Get index */
  2204. index = index & 0x3F;
  2205. data = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x11);
  2206. data = data & 0x7F;
  2207. SiS_SetReg1 (SiS_P3d4, 0x11, data); /* Unlock CRTC */
  2208. for (i = 0, j = 0; i <= 07; i++, j++) {
  2209. data = SiS_CRT1Table[index].CR[i];
  2210. SiS_SetReg1 (SiS_P3d4, j, data);
  2211. }
  2212. for (j = 0x10; i <= 10; i++, j++) {
  2213. data = SiS_CRT1Table[index].CR[i];
  2214. SiS_SetReg1 (SiS_P3d4, j, data);
  2215. }
  2216. for (j = 0x15; i <= 12; i++, j++) {
  2217. data = SiS_CRT1Table[index].CR[i];
  2218. SiS_SetReg1 (SiS_P3d4, j, data);
  2219. }
  2220. for (j = 0x0A; i <= 15; i++, j++) {
  2221. data = SiS_CRT1Table[index].CR[i];
  2222. SiS_SetReg1 (SiS_P3c4, j, data);
  2223. }
  2224. data = SiS_CRT1Table[index].CR[16];
  2225. data = data & 0xE0;
  2226. SiS_SetReg1 (SiS_P3c4, 0x0E, data);
  2227. data = (UCHAR) SiS_GetReg1 (SiS_P3d4, 0x09);
  2228. data = data & 0xDF; /* clear CR9 D[5] */
  2229. i = SiS_CRT1Table[index].CR[16];
  2230. i = i & 0x01;
  2231. i = i << 5;
  2232. data = data | i;
  2233. if (ModeNo <= 0x13)
  2234. i = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  2235. else
  2236. i = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  2237. i = i & DoubleScanMode;
  2238. if (i)
  2239. data = data | 0x80;
  2240. SiS_SetReg1 (SiS_P3d4, 0x09, data);
  2241. if (SiS_ModeType > 0x03)
  2242. SiS_SetReg1 (SiS_P3d4, 0x14, 0x4F);
  2243. }
  2244. }
  2245. void
  2246. SiS_SetCRT1Offset (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  2247.    USHORT RefreshRateTableIndex,
  2248.    PSIS_HW_DEVICE_INFO HwDeviceExtension)
  2249. {
  2250. USHORT temp, ah, al;
  2251. USHORT temp2, i;
  2252. USHORT DisplayUnit;
  2253. /* Alan */
  2254. temp = SiS_EModeIDTable[ModeIdIndex].Ext_ModeInfo;
  2255. if (HwDeviceExtension->jChipType >= SIS_315H) {
  2256. temp = temp >> 8; /* sis310 *//* index */
  2257. } else {
  2258. temp = temp >> 4; /* sis300 *//* index */
  2259. }
  2260. temp = SiS_ScreenOffset[temp];
  2261. if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
  2262. temp = 0x6B;
  2263. temp2 = ModeNo - 0x7C;
  2264. } else {
  2265. temp2 = SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
  2266. temp2 = temp2 & InterlaceMode;
  2267. if (temp2)
  2268. temp = temp << 1;
  2269. temp2 = SiS_ModeType - ModeEGA;
  2270. }
  2271. switch (temp2) {
  2272. case 0:
  2273. temp2 = 1;
  2274. break;
  2275. case 1:
  2276. temp2 = 2;
  2277. break;
  2278. case 2:
  2279. temp2 = 4;
  2280. break;
  2281. case 3:
  2282. temp2 = 4;
  2283. break;
  2284. case 4:
  2285. temp2 = 6;
  2286. break;
  2287. case 5:
  2288. temp2 = 8;
  2289. break;
  2290. }
  2291. temp = temp * temp2;
  2292. DisplayUnit = temp;
  2293. temp2 = temp;
  2294. temp = temp >> 8; /* ah */
  2295. temp = temp & 0x0F;
  2296. i = SiS_GetReg1 (SiS_P3c4, 0x0E);
  2297. i = i & 0xF0;
  2298. i = i | temp;
  2299. SiS_SetReg1 (SiS_P3c4, 0x0E, i);
  2300. temp = (UCHAR) temp2;
  2301. temp = temp & 0xFF; /* al */
  2302. SiS_SetReg1 (SiS_P3d4, 0x13, temp);
  2303. temp2 = SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
  2304. temp2 = temp2 & InterlaceMode;
  2305. if (temp2)
  2306. DisplayUnit >>= 1;
  2307. DisplayUnit = DisplayUnit << 5;
  2308. ah = (DisplayUnit & 0xff00) >> 8;
  2309. al = DisplayUnit & 0x00ff;
  2310. if (al == 0)
  2311. ah = ah + 1;
  2312. else
  2313. ah = ah + 2;
  2314. SiS_SetReg1 (SiS_P3c4, 0x10, ah);
  2315. }
  2316. void
  2317. SiS_SetCRT1VCLK (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  2318.  PSIS_HW_DEVICE_INFO HwDeviceExtension,
  2319.  USHORT RefreshRateTableIndex)
  2320. {
  2321. UCHAR index, data;
  2322. USHORT vclkindex;
  2323. if (SiS_IF_DEF_LVDS == 1) {
  2324. vclkindex =
  2325.     SiS_GetVCLK2Ptr (ROMAddr, ModeNo, ModeIdIndex,
  2326.      RefreshRateTableIndex, HwDeviceExtension);
  2327. data = SiS_GetReg1 (SiS_P3c4, 0x31) & 0xCF;
  2328. SiS_SetReg1 (SiS_P3c4, 0x31, data);
  2329. data = SiS_VCLKData[vclkindex].SR2B;
  2330. SiS_SetReg1 (SiS_P3c4, 0x2B, data);
  2331. data = SiS_VCLKData[vclkindex].SR2C;
  2332. SiS_SetReg1 (SiS_P3c4, 0x2C, data);
  2333. if (HwDeviceExtension->jChipType < SIS_315H)
  2334. SiS_SetReg1 (SiS_P3c4, 0x2D, 0x80);
  2335. else
  2336. SiS_SetReg1 (SiS_P3c4, 0x2D, 0x01);
  2337. }
  2338. else
  2339.     if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
  2340. && (SiS_VBInfo & SetCRT2ToLCDA) && (SiS_IF_DEF_LVDS == 0)) {
  2341. vclkindex =
  2342.     SiS_GetVCLK2Ptr (ROMAddr, ModeNo, ModeIdIndex,
  2343.      RefreshRateTableIndex, HwDeviceExtension);
  2344. data = SiS_GetReg1 (SiS_P3c4, 0x31) & 0xCF;
  2345. SiS_SetReg1 (SiS_P3c4, 0x31, data);
  2346. data = SiS_VBVCLKData[vclkindex].Part4_A;
  2347. SiS_SetReg1 (SiS_P3c4, 0x2B, data);
  2348. data = SiS_VBVCLKData[vclkindex].Part4_B;
  2349. SiS_SetReg1 (SiS_P3c4, 0x2C, data);
  2350. if (HwDeviceExtension->jChipType < SIS_315H)
  2351. SiS_SetReg1 (SiS_P3c4, 0x2D, 0x80); /* for300 series */
  2352. else
  2353. SiS_SetReg1 (SiS_P3c4, 0x2D, 0x01);
  2354. } else {
  2355. index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
  2356. /*if(HwDeviceExtension->jChipType < SIS_315H) { */
  2357. index = index & 0x3F;
  2358. /*} */
  2359. data = SiS_GetReg1 (SiS_P3c4, 0x31) & 0xCF;
  2360. /*SiS_SetReg1(SiS_P3c4,0x31,0x00); *//* for300 */
  2361. SiS_SetReg1 (SiS_P3c4, 0x31, data);
  2362. SiS_SetReg1 (SiS_P3c4, 0x2B, SiS_VCLKData[index].SR2B);
  2363. SiS_SetReg1 (SiS_P3c4, 0x2C, SiS_VCLKData[index].SR2C);
  2364. if (HwDeviceExtension->jChipType < SIS_315H)
  2365. SiS_SetReg1 (SiS_P3c4, 0x2D, 0x80); /* for300 series */
  2366. else
  2367. SiS_SetReg1 (SiS_P3c4, 0x2D, 0x01); /* for310 series */
  2368. }
  2369. }
  2370. void
  2371. SiS_IsLowResolution (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
  2372. {
  2373. USHORT data;
  2374. USHORT ModeFlag;
  2375. data = SiS_GetReg1 (SiS_P3c4, 0x0F);
  2376. data = data & 0x7F;
  2377. SiS_SetReg1 (SiS_P3c4, 0x0F, data);
  2378. if (ModeNo > 0x13) {
  2379. ModeFlag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  2380. if ((ModeFlag & HalfDCLK) && (ModeFlag & DoubleScanMode)) {
  2381. data = SiS_GetReg1 (SiS_P3c4, 0x0F);
  2382. data = data | 0x80;
  2383. SiS_SetReg1 (SiS_P3c4, 0x0F, data);
  2384. data = SiS_GetReg1 (SiS_P3c4, 0x01);
  2385. data = data & 0xF7;
  2386. SiS_SetReg1 (SiS_P3c4, 0x01, data);
  2387. }
  2388. }
  2389. }
  2390. void
  2391. SiS_SetCRT1ModeRegs (ULONG ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
  2392.      USHORT ModeNo, USHORT ModeIdIndex,
  2393.      USHORT RefreshRateTableIndex)
  2394. {
  2395. USHORT data, data2, data3;
  2396. USHORT infoflag = 0, modeflag;
  2397. USHORT resindex, xres;
  2398. if (ModeNo > 0x13) {
  2399. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  2400. infoflag = SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
  2401. } else {
  2402. modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ModeFlag */
  2403. }
  2404. SiS_SetRegANDOR (SiS_P3c4, 0x1F, 0x3F, 0x00);
  2405. if (ModeNo > 0x13)
  2406. data = infoflag;
  2407. else
  2408. data = 0;
  2409. data2 = 0;
  2410. if (ModeNo > 0x13) {
  2411. if (SiS_ModeType > 0x02) {
  2412. data2 = data2 | 0x02;
  2413. data3 = SiS_ModeType - ModeVGA;
  2414. data3 = data3 << 2;
  2415. data2 = data2 | data3;
  2416. }
  2417. }
  2418. data = data & InterlaceMode;
  2419. if (data)
  2420. data2 = data2 | 0x20;
  2421. SiS_SetReg1 (SiS_P3c4, 0x06, data2);
  2422. if ((HwDeviceExtension->jChipType == SIS_630) ||
  2423.     (HwDeviceExtension->jChipType == SIS_540) ||
  2424.     (HwDeviceExtension->jChipType == SIS_730)) {
  2425. resindex = SiS_GetResInfo (ROMAddr, ModeNo, ModeIdIndex);
  2426. if (ModeNo <= 0x13) {
  2427. xres = SiS_StResInfo[resindex].HTotal;
  2428. } else {
  2429. xres = SiS_ModeResInfo[resindex].HTotal; /* xres->ax */
  2430. }
  2431. data = 0x0000;
  2432. if (infoflag & InterlaceMode) {
  2433. if (xres == 1024)
  2434. data = 0x0035;
  2435. if (xres == 1280)
  2436. data = 0x0048;
  2437. }
  2438. data2 = data & 0x00FF;
  2439. SiS_SetRegANDOR (SiS_P3d4, 0x19, 0xFF, data2);
  2440. data2 = (data & 0xFF00) >> 8;
  2441. SiS_SetRegANDOR (SiS_P3d4, 0x19, 0xFC, data2);
  2442. }
  2443. if (modeflag & HalfDCLK) {
  2444. SiS_SetRegANDOR (SiS_P3c4, 0x01, 0xFF, 0x01);
  2445. }
  2446. if ((HwDeviceExtension->jChipType == SIS_630) ||
  2447.     (HwDeviceExtension->jChipType == SIS_540) ||
  2448.     (HwDeviceExtension->jChipType == SIS_730)) {
  2449. } else {
  2450. if (modeflag & LineCompareOff) {
  2451. SiS_SetRegANDOR (SiS_P3c4, 0x0F, 0xF7, 0x08);
  2452. } else {
  2453. SiS_SetRegANDOR (SiS_P3c4, 0x0F, 0xF7, 0x00);
  2454. }
  2455. }
  2456. data = 0x60;
  2457. if (SiS_ModeType != ModeText) {
  2458. data = data ^ 0x60;
  2459. if (SiS_ModeType != ModeEGA) {
  2460. data = data ^ 0xA0;
  2461. }
  2462. }
  2463. SiS_SetRegANDOR (SiS_P3c4, 0x21, 0x1F, data);
  2464. }
  2465. void
  2466. SiS_SetVCLKState (ULONG ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
  2467.   USHORT ModeNo, USHORT RefreshRateTableIndex)
  2468. {
  2469. USHORT data, data2 = 0;
  2470. USHORT VCLK;
  2471. UCHAR index;
  2472. if (ModeNo <= 0x13)
  2473. VCLK = 0;
  2474. else {
  2475. index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
  2476. /*if(HwDeviceExtension->jChipType < SIS_315H) { */
  2477. index = index & 0x3F;
  2478. /*} */
  2479. VCLK = SiS_VCLKData[index].CLOCK;
  2480. }
  2481. if (HwDeviceExtension->jChipType < SIS_315H) {
  2482. data2 = 0x00;
  2483. if (VCLK > 150)
  2484. data2 = data2 | 0x80;
  2485. SiS_SetRegANDOR (SiS_P3c4, 0x07, 0x7B, data2);
  2486. data2 = 0x00;
  2487. if (VCLK >= 150)
  2488. data2 = data2 | 0x08; /* VCLK > 150 */
  2489. SiS_SetRegANDOR (SiS_P3c4, 0x32, 0xF7, data2);
  2490. } else { /* 310 series */
  2491. data = SiS_GetReg1 (SiS_P3c4, 0x32);
  2492. data = data & 0xf3;
  2493. if (VCLK >= 200)
  2494. data = data | 0x0c; /* VCLK > 200 */
  2495. SiS_SetReg1 (SiS_P3c4, 0x32, data);
  2496. data = SiS_GetReg1 (SiS_P3c4, 0x1F);
  2497. data &= 0xE7;
  2498. if (VCLK < 200)
  2499. data |= 0x10;
  2500. SiS_SetReg1 (SiS_P3c4, 0x1F, data);
  2501. }
  2502. if ((VCLK >= 0) && (VCLK < 135))
  2503. data2 = 0x03;
  2504. if ((VCLK >= 135) && (VCLK < 160))
  2505. data2 = 0x02;
  2506. if ((VCLK >= 160) && (VCLK < 260))
  2507. data2 = 0x01;
  2508. if (VCLK > 260)
  2509. data2 = 0x00;
  2510. /* disable 24bit palette RAM gamma correction  */
  2511. if (HwDeviceExtension->jChipType == SIS_540) {
  2512. if ((VCLK == 203) || (VCLK < 234))
  2513. data2 = 0x02;
  2514. }
  2515. SiS_SetRegANDOR (SiS_P3c4, 0x07, 0xFC, data2);
  2516. }
  2517. void
  2518. SiS_LoadDAC (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
  2519. {
  2520. USHORT data, data2;
  2521. USHORT time, i, j, k;
  2522. USHORT m, n, o;
  2523. USHORT si, di, bx, dl;
  2524. USHORT al, ah, dh;
  2525. USHORT *table = NULL;
  2526. if (ModeNo <= 0x13)
  2527. data = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  2528. else
  2529. data = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  2530. data = data & DACInfoFlag;
  2531. time = 64;
  2532. if (data == 0x00)
  2533. table = SiS_MDA_DAC;
  2534. if (data == 0x08)
  2535. table = SiS_CGA_DAC;
  2536. if (data == 0x10)
  2537. table = SiS_EGA_DAC;
  2538. if (data == 0x18) {
  2539. time = 256;
  2540. table = SiS_VGA_DAC;
  2541. }
  2542. if (time == 256)
  2543. j = 16;
  2544. else
  2545. j = time;
  2546. SiS_SetReg3 (SiS_P3c6, 0xFF);
  2547. SiS_SetReg3 (SiS_P3c8, 0x00);
  2548. for (i = 0; i < j; i++) {
  2549. data = table[i];
  2550. for (k = 0; k < 3; k++) {
  2551. data2 = 0;
  2552. if (data & 0x01)
  2553. data2 = 0x2A;
  2554. if (data & 0x02)
  2555. data2 = data2 + 0x15;
  2556. SiS_SetReg3 (SiS_P3c9, data2);
  2557. data = data >> 2;
  2558. }
  2559. }
  2560. if (time == 256) {
  2561. for (i = 16; i < 32; i++) {
  2562. data = table[i];
  2563. for (k = 0; k < 3; k++)
  2564. SiS_SetReg3 (SiS_P3c9, data);
  2565. }
  2566. si = 32;
  2567. for (m = 0; m < 9; m++) {
  2568. di = si;
  2569. bx = si + 0x04;
  2570. dl = 0;
  2571. for (n = 0; n < 3; n++) {
  2572. for (o = 0; o < 5; o++) {
  2573. dh = table[si];
  2574. ah = table[di];
  2575. al = table[bx];
  2576. si++;
  2577. SiS_WriteDAC (dl, ah, al, dh);
  2578. } /* for 5 */
  2579. si = si - 2;
  2580. for (o = 0; o < 3; o++) {
  2581. dh = table[bx];
  2582. ah = table[di];
  2583. al = table[si];
  2584. si--;
  2585. SiS_WriteDAC (dl, ah, al, dh);
  2586. } /* for 3 */
  2587. dl++;
  2588. } /* for 3 */
  2589. si = si + 5;
  2590. } /* for 9 */
  2591. }
  2592. }
  2593. void
  2594. SiS_WriteDAC (USHORT dl, USHORT ah, USHORT al, USHORT dh)
  2595. {
  2596. USHORT temp;
  2597. USHORT bh, bl;
  2598. bh = ah;
  2599. bl = al;
  2600. if (dl != 0) {
  2601. temp = bh;
  2602. bh = dh;
  2603. dh = temp;
  2604. if (dl == 1) {
  2605. temp = bl;
  2606. bl = dh;
  2607. dh = temp;
  2608. } else {
  2609. temp = bl;
  2610. bl = bh;
  2611. bh = temp;
  2612. }
  2613. }
  2614. SiS_SetReg3 (SiS_P3c9, (USHORT) dh);
  2615. SiS_SetReg3 (SiS_P3c9, (USHORT) bh);
  2616. SiS_SetReg3 (SiS_P3c9, (USHORT) bl);
  2617. }
  2618. void
  2619. SiS_ClearBuffer (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo)
  2620. {
  2621. PVOID VideoMemoryAddress =
  2622.     (PVOID) HwDeviceExtension->pjVideoMemoryAddress;
  2623. ULONG AdapterMemorySize = (ULONG) HwDeviceExtension->ulVideoMemorySize;
  2624. PUSHORT pBuffer;
  2625. int i;
  2626. if (SiS_ModeType >= ModeEGA) {
  2627. if (ModeNo > 0x13) {
  2628. SiS_SetMemory (VideoMemoryAddress, AdapterMemorySize,
  2629.        0);
  2630. } else {
  2631. pBuffer = VideoMemoryAddress;
  2632. for (i = 0; i < 0x4000; i++)
  2633. pBuffer[i] = 0x0000;
  2634. }
  2635. } else {
  2636. pBuffer = VideoMemoryAddress;
  2637. if (SiS_ModeType == ModeCGA) {
  2638. for (i = 0; i < 0x4000; i++)
  2639. pBuffer[i] = 0x0720;
  2640. } else {
  2641. for (i = 0; i < 0x4000; i++)
  2642. pBuffer[i] = 0x0000;
  2643. }
  2644. }
  2645. }
  2646. void
  2647. SiS_DisplayOn (void)
  2648. {
  2649. SiS_SetRegANDOR (SiS_P3c4, 0x01, 0xDF, 0x00);
  2650. }
  2651. void
  2652. SiS_DisplayOff (void)
  2653. {
  2654. SiS_SetRegANDOR (SiS_P3c4, 0x01, 0xDF, 0x20);
  2655. }
  2656. /* ========================================== */
  2657. /*  SR CRTC GR */
  2658. void
  2659. SiS_SetReg1 (USHORT port, USHORT index, USHORT data)
  2660. {
  2661. OutPortByte (port, index);
  2662. OutPortByte (port + 1, data);
  2663. /*
  2664.    _asm
  2665.    {
  2666.    mov      dx, port                      
  2667.    mov      ax, index                     
  2668.    mov      bx, data                      
  2669.    out      dx, al
  2670.    mov      ax, bx
  2671.    inc      dx
  2672.    out      dx, al
  2673.    }
  2674.  */
  2675. }
  2676. /* ========================================== */
  2677. /*  AR(3C0) */
  2678. void
  2679. SiS_SetReg2 (USHORT port, USHORT index, USHORT data)
  2680. {
  2681. InPortByte (port + 0x3da - 0x3c0);
  2682. OutPortByte (SiS_P3c0, index);
  2683. OutPortByte (SiS_P3c0, data);
  2684. OutPortByte (SiS_P3c0, 0x20);
  2685. /*
  2686.    _asm
  2687.    {
  2688.    mov      dx, port                      
  2689.    mov      cx, index                     
  2690.    mov      bx, data                      
  2691.    add      dx, 3dah-3c0h
  2692.    in       al, dx
  2693.    mov      ax, cx
  2694.    mov      dx, 3c0h
  2695.    out      dx, al
  2696.    mov      ax, bx
  2697.    out      dx, al
  2698.    mov      ax, 20h
  2699.    out      dx, al
  2700.    }
  2701.  */
  2702. }
  2703. /* ========================================== */
  2704. void
  2705. SiS_SetReg3 (USHORT port, USHORT data)
  2706. {
  2707. OutPortByte (port, data);
  2708. /*
  2709.    _asm
  2710.    {
  2711.    mov      dx, port                      
  2712.    mov      ax, data                      
  2713.    out      dx, al
  2714.    }
  2715.  */
  2716. }
  2717. /* ========================================== */
  2718. void
  2719. SiS_SetReg4 (USHORT port, ULONG data)
  2720. {
  2721. OutPortLong (port, data);
  2722. /*
  2723.    _asm
  2724.    {
  2725.    mov      dx, port                      ;; port
  2726.    mov      eax, data                      ;; data
  2727.    out      dx, eax
  2728.    }
  2729.  */
  2730. }
  2731. /* ========================================= */
  2732. UCHAR SiS_GetReg1 (USHORT port, USHORT index)
  2733. {
  2734. UCHAR data;
  2735. OutPortByte (port, index);
  2736. data = InPortByte (port + 1);
  2737. /*
  2738.    _asm
  2739.    {
  2740.    mov      dx, port                      ;; port
  2741.    mov      ax, index                     ;; index
  2742.    out      dx, al
  2743.    mov      ax, bx
  2744.    inc      dx
  2745.    xor      eax, eax
  2746.    in       al, dx
  2747.    mov      data, al
  2748.    }
  2749.  */
  2750. return (data);
  2751. }
  2752. /* ========================================== */
  2753. UCHAR SiS_GetReg2 (USHORT port)
  2754. {
  2755. UCHAR data;
  2756. data = InPortByte (port);
  2757. /*
  2758.    _asm
  2759.    {
  2760.    mov      dx, port                      ;; port
  2761.    xor      eax, eax
  2762.    in       al, dx
  2763.    mov      data, al
  2764.    }
  2765.  */
  2766. return (data);
  2767. }
  2768. /* ========================================== */
  2769. ULONG SiS_GetReg3 (USHORT port)
  2770. {
  2771. ULONG data;
  2772. data = InPortLong (port);
  2773. /*
  2774.    _asm
  2775.    {
  2776.    mov      dx, port                      ;; port
  2777.    xor      eax, eax
  2778.    in       eax, dx
  2779.    mov      data, eax
  2780.    }
  2781.  */
  2782. return (data);
  2783. }
  2784. /* ========================================== */
  2785. void
  2786. SiS_ClearDAC (ULONG port)
  2787. {
  2788. int i;
  2789. OutPortByte (port, 0);
  2790. port++;
  2791. for (i = 0; i < 256 * 3; i++) {
  2792. OutPortByte (port, 0);
  2793. }
  2794. }
  2795. /*========================================== */
  2796. void
  2797. SiS_SetInterlace (ULONG ROMAddr, USHORT ModeNo, USHORT RefreshRateTableIndex)
  2798. {
  2799. ULONG Temp;
  2800. USHORT data, Temp2;
  2801. Temp = (ULONG) SiS_GetReg1 (SiS_P3d4, 0x01);
  2802. Temp++;
  2803. Temp = Temp * 8;
  2804. if (Temp == 1024)
  2805. data = 0x0035;
  2806. else if (Temp == 1280)
  2807. data = 0x0048;
  2808. else
  2809. data = 0x0000;
  2810. Temp2 = SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
  2811. Temp2 &= InterlaceMode;
  2812. if (Temp2 == 0)
  2813. data = 0x0000;
  2814. SiS_SetReg1 (SiS_P3d4, 0x19, data);
  2815. Temp = (ULONG) SiS_GetReg1 (SiS_P3d4, 0x1A);
  2816. Temp2 = (USHORT) (Temp & 0xFC);
  2817. SiS_SetReg1 (SiS_P3d4, 0x1A, (USHORT) Temp);
  2818. Temp = (ULONG) SiS_GetReg1 (SiS_P3c4, 0x0f);
  2819. Temp2 = (USHORT) Temp & 0xBF;
  2820. if (ModeNo == 0x37)
  2821. Temp2 = Temp2 | 0x40;
  2822. SiS_SetReg1 (SiS_P3d4, 0x1A, (USHORT) Temp2);
  2823. }
  2824. void
  2825. SiS_SetCRT1FIFO (ULONG ROMAddr, USHORT ModeNo,
  2826.  PSIS_HW_DEVICE_INFO HwDeviceExtension)
  2827. {
  2828. USHORT data;
  2829. data = SiS_GetReg1 (SiS_P3c4, 0x3D);
  2830. data &= 0xfe;
  2831. SiS_SetReg1 (SiS_P3c4, 0x3D, data); /* diable auto-threshold */
  2832. if (ModeNo > 0x13) {
  2833. SiS_SetReg1 (SiS_P3c4, 0x08, 0x34);
  2834. data = SiS_GetReg1 (SiS_P3c4, 0x09);
  2835. data &= 0xF0;
  2836. SiS_SetReg1 (SiS_P3c4, 0x09, data);
  2837. data = SiS_GetReg1 (SiS_P3c4, 0x3D);
  2838. data |= 0x01;
  2839. SiS_SetReg1 (SiS_P3c4, 0x3D, data);
  2840. } else {
  2841. SiS_SetReg1 (SiS_P3c4, 0x08, 0xAE);
  2842. data = SiS_GetReg1 (SiS_P3c4, 0x09);
  2843. data &= 0xF0;
  2844. SiS_SetReg1 (SiS_P3c4, 0x09, data);
  2845. }
  2846. }
  2847. USHORT
  2848. SiS_CalcDelay (ULONG ROMAddr, USHORT key)
  2849. {
  2850. USHORT data, data2, temp0, temp1;
  2851. UCHAR ThLowA[] = { 61, 3, 52, 5, 68, 7, 100, 11,
  2852. 43, 3, 42, 5, 54, 7, 78, 11,
  2853. 34, 3, 37, 5, 47, 7, 67, 11
  2854. };
  2855. UCHAR ThLowB[] = { 81, 4, 72, 6, 88, 8, 120, 12,
  2856. 55, 4, 54, 6, 66, 8, 90, 12,
  2857. 42, 4, 45, 6, 55, 8, 75, 12
  2858. };
  2859. UCHAR ThTiming[] = { 1, 2, 2, 3, 0, 1, 1, 2 };
  2860. data = SiS_GetReg1 (SiS_P3c4, 0x16);
  2861. data = data >> 6;
  2862. data2 = SiS_GetReg1 (SiS_P3c4, 0x14);
  2863. data2 = (data2 >> 4) & 0x0C;
  2864. data = data | data2;
  2865. data = data < 1;
  2866. if (key == 0) {
  2867. temp0 = (USHORT) ThLowA[data];
  2868. temp1 = (USHORT) ThLowA[data + 1];
  2869. } else {
  2870. temp0 = (USHORT) ThLowB[data];
  2871. temp1 = (USHORT) ThLowB[data + 1];
  2872. }
  2873. data2 = 0;
  2874. data = SiS_GetReg1 (SiS_P3c4, 0x18);
  2875. if (data & 0x02)
  2876. data2 = data2 | 0x01;
  2877. if (data & 0x20)
  2878. data2 = data2 | 0x02;
  2879. if (data & 0x40)
  2880. data2 = data2 | 0x04;
  2881. data = temp1 * ThTiming[data2] + temp0;
  2882. return (data);
  2883. }
  2884. void
  2885. SiS_SetCRT1FIFO2 (ULONG ROMAddr, USHORT ModeNo,
  2886.   PSIS_HW_DEVICE_INFO HwDeviceExtension,
  2887.   USHORT RefreshRateTableIndex)
  2888. {
  2889. USHORT i, index, data, VCLK, data2, MCLK, colorth = 0;
  2890. USHORT ah, bl, B;
  2891. ULONG eax;
  2892. USHORT ThresholdLow = 0;
  2893. UCHAR FQBQData[] = { 0x01, 0x21, 0x41, 0x61, 0x81,
  2894. 0x31, 0x51, 0x71, 0x91, 0xb1,
  2895. 0x00, 0x20, 0x40, 0x60, 0x80,
  2896. 0x30, 0x50, 0x70, 0x90, 0xb0, 0xFF
  2897. };
  2898. if (ModeNo >= 0x13) {
  2899. index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
  2900. if (HwDeviceExtension->jChipType < SIS_315H) { /* for300 serial */
  2901. index = index & 0x3F;
  2902. }
  2903. VCLK = SiS_VCLKData[index].CLOCK; /* Get VCLK  */
  2904. index = SiS_GetReg1 (SiS_P3c4, 0x1A);
  2905. index = index & 07;
  2906. MCLK = SiS_MCLKData[index].CLOCK; /* Get MCLK  */
  2907. data2 = SiS_ModeType - 0x02;
  2908. switch (data2) {
  2909. case 0:
  2910. colorth = 1;
  2911. break;
  2912. case 1:
  2913. colorth = 2;
  2914. break;
  2915. case 2:
  2916. colorth = 4;
  2917. break;
  2918. case 3:
  2919. colorth = 4;
  2920. break;
  2921. case 4:
  2922. colorth = 6;
  2923. break;
  2924. case 5:
  2925. colorth = 8;
  2926. break;
  2927. }
  2928. i = 0;
  2929. do {
  2930. B =
  2931.     (SiS_CalcDelay2 (ROMAddr, FQBQData[i]) * VCLK *
  2932.      colorth);
  2933. bl = B / (16 * MCLK);
  2934. if (B == bl * 16 * MCLK) {
  2935. bl = bl + 1;
  2936. } else {
  2937. bl = bl + 1;
  2938. }
  2939. if (bl > 0x13) {
  2940. if (FQBQData[i + 1] == 0xFF) {
  2941. ThresholdLow = 0x13;
  2942. break;
  2943. }
  2944. i++;
  2945. } else {
  2946. ThresholdLow = bl;
  2947. break;
  2948. }
  2949. } while (FQBQData[i] != 0xFF);
  2950. } else {
  2951. ThresholdLow = 0x02;
  2952. }
  2953. data2 = FQBQData[i];
  2954. data2 = (data2 & 0xf0) >> 4;
  2955. data2 = data2 << 24;
  2956. SiS_SetReg4 (0xcf8, 0x80000050);
  2957. eax = SiS_GetReg3 (0xcfc);
  2958. eax = eax & 0x0f0ffffff;
  2959. eax = eax | data2;
  2960. SiS_SetReg4 (0xcfc, eax);
  2961. ah = ThresholdLow;
  2962. ah = ah << 4;
  2963. ah = ah | 0x0f;
  2964. SiS_SetReg1 (SiS_P3c4, 0x08, ah);
  2965. data = ThresholdLow;
  2966. data = data & 0x10;
  2967. data = data << 1;
  2968. SiS_SetRegANDOR (SiS_P3c4, 0x0F, 0xDF, data);
  2969. SiS_SetReg1 (SiS_P3c4, 0x3B, 0x09);
  2970. data = ThresholdLow + 3;
  2971. if (data > 0x0f)
  2972. data = 0x0f;
  2973. SiS_SetRegANDOR (SiS_P3c4, 0x09, 0x80, data);
  2974. }
  2975. USHORT
  2976. SiS_CalcDelay2 (ULONG ROMAddr, UCHAR key)
  2977. {
  2978. USHORT data, index;
  2979. UCHAR LatencyFactor[] = { 97, 88, 86, 79, 77, 00, /*; 64  bit    BQ=2   */
  2980. 00, 87, 85, 78, 76, 54, /*; 64  bit    BQ=1   */
  2981. 97, 88, 86, 79, 77, 00, /*; 128 bit    BQ=2   */
  2982. 00, 79, 77, 70, 68, 48, /*; 128 bit    BQ=1   */
  2983. 80, 72, 69, 63, 61, 00, /*; 64  bit    BQ=2   */
  2984. 00, 70, 68, 61, 59, 37, /*; 64  bit    BQ=1   */
  2985. 86, 77, 75, 68, 66, 00, /*; 128 bit    BQ=2   */
  2986. 00, 68, 66, 59, 57, 37
  2987. }; /*; 128 bit    BQ=1   */
  2988. index = (key & 0xE0) >> 5;
  2989. if (key & 0x10)
  2990. index = index + 6;
  2991. if (!(key & 0x01))
  2992. index = index + 24;
  2993. data = SiS_GetReg1 (SiS_P3c4, 0x14);
  2994. if (data & 0x0080)
  2995. index = index + 12;
  2996. data = LatencyFactor[index];
  2997. return (data);
  2998. }
  2999. void
  3000. SiS_CRT2AutoThreshold (USHORT BaseAddr)
  3001. {
  3002. USHORT temp1;
  3003. USHORT Part1Port;
  3004. Part1Port = BaseAddr + SIS_CRT2_PORT_04;
  3005. temp1 = SiS_GetReg1 (SiS_Part1Port, 0x1);
  3006. temp1 |= 0x40;
  3007. SiS_SetReg1 (SiS_Part1Port, 0x1, temp1);
  3008. }
  3009. /* =============  ynlai ============== */
  3010. void
  3011. SiS_DetectMonitor (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
  3012. {
  3013. UCHAR DAC_TEST_PARMS[] = { 0x0F, 0x0F, 0x0F };
  3014. UCHAR DAC_CLR_PARMS[] = { 0x00, 0x00, 0x00 };
  3015. USHORT SR1F;
  3016. SR1F = SiS_GetReg1 (SiS_P3c4, 0x1F);
  3017. SiS_SetRegANDOR (SiS_P3c4, 0x1F, 0xFF, 0x04);
  3018. if (SiS_IF_DEF_LVDS == 0) {
  3019. if (SiS_BridgeIsOn (BaseAddr)) {
  3020. SiS_SetReg1 (SiS_P3d4, 0x30, 0x41);
  3021. }
  3022. }
  3023. SiSSetMode (HwDeviceExtension, 0x03); /* InitMode */
  3024. SiS_SetReg3 (SiS_P3c6, 0xff);
  3025. SiS_ClearDAC (SiS_P3c8);
  3026. SiS_LongWait ();
  3027. SiS_LongWait ();
  3028. SiS_SetRegANDOR (SiS_P3d4, 0x32, 0xDF, 0x00);
  3029. if (SiS_TestMonitorType
  3030.     (DAC_TEST_PARMS[0], DAC_TEST_PARMS[1], DAC_TEST_PARMS[2])) {
  3031. SiS_SetRegANDOR (SiS_P3d4, 0x32, 0xDF, 0x20);
  3032. }
  3033. if (SiS_TestMonitorType
  3034.     (DAC_TEST_PARMS[0], DAC_TEST_PARMS[1], DAC_TEST_PARMS[2])) {
  3035. SiS_SetRegANDOR (SiS_P3d4, 0x32, 0xDF, 0x20);
  3036. }
  3037. SiS_TestMonitorType (DAC_CLR_PARMS[0], DAC_CLR_PARMS[1],
  3038.      DAC_CLR_PARMS[2]);
  3039. SiS_SetReg1 (SiS_P3c4, 0x1F, SR1F);
  3040. }
  3041. USHORT
  3042. SiS_TestMonitorType (UCHAR R_DAC, UCHAR G_DAC, UCHAR B_DAC)
  3043. {
  3044. USHORT temp, tempbx;
  3045. tempbx = R_DAC * 0x4d + G_DAC * 0x97 + B_DAC * 0x1c;
  3046. if (tempbx > 0x80)
  3047. tempbx = tempbx + 0x100;
  3048. tempbx = (tempbx & 0xFF00) >> 8;
  3049. R_DAC = (UCHAR) tempbx;
  3050. G_DAC = (UCHAR) tempbx;
  3051. B_DAC = (UCHAR) tempbx;
  3052. SiS_SetReg3 (SiS_P3c8, 0x00);
  3053. SiS_SetReg3 (SiS_P3c9, R_DAC);
  3054. SiS_SetReg3 (SiS_P3c9, G_DAC);
  3055. SiS_SetReg3 (SiS_P3c9, B_DAC);
  3056. SiS_LongWait ();
  3057. temp = SiS_GetReg2 (SiS_P3c2);
  3058. if (temp & 0x10)
  3059. return (1);
  3060. else
  3061. return (0);
  3062. }
  3063. /* ---- test ----- */
  3064. void
  3065. SiS_GetSenseStatus (PSIS_HW_DEVICE_INFO HwDeviceExtension, ULONG ROMAddr)
  3066. {
  3067. USHORT tempax = 0, tempbx, tempcx, temp;
  3068. USHORT P2reg0 = 0, SenseModeNo = 0, OutputSelect = *pSiS_OutputSelect;
  3069. USHORT ModeIdIndex, i;
  3070. USHORT BaseAddr = (USHORT) HwDeviceExtension->ulIOAddress;
  3071. if (SiS_IF_DEF_LVDS == 1) {
  3072. SiS_GetPanelID ();
  3073. temp = LCDSense;
  3074. temp = temp | SiS_SenseCHTV ();
  3075. tempbx = ~(LCDSense | AVIDEOSense | SVIDEOSense);
  3076. SiS_SetRegANDOR (SiS_P3d4, 0x32, tempbx, temp);
  3077. } else { /* for 301 */
  3078. if (SiS_IF_DEF_HiVision == 1) { /* for HiVision */
  3079. tempax = SiS_GetReg1 (SiS_P3c4, 0x38);
  3080. temp = tempax & 0x01;
  3081. tempax = SiS_GetReg1 (SiS_P3c4, 0x3A);
  3082. temp = temp | (tempax & 0x02);
  3083. SiS_SetRegANDOR (SiS_P3d4, 0x32, 0xA0, temp);
  3084. } else {
  3085. if (SiS_BridgeIsOn (BaseAddr)) {
  3086. P2reg0 = SiS_GetReg1 (SiS_Part2Port, 0x00);
  3087. if (!SiS_BridgeIsEnable
  3088.     (BaseAddr, HwDeviceExtension)) {
  3089. SenseModeNo = 0x2e;
  3090. temp =
  3091.     SiS_SearchModeID (ROMAddr,
  3092.       SenseModeNo,
  3093.       &ModeIdIndex);
  3094. SiS_SetFlag = 0x00;
  3095. SiS_ModeType = ModeVGA;
  3096. SiS_VBInfo =
  3097.     SetCRT2ToRAMDAC | LoadDACFlag |
  3098.     SetInSlaveMode;
  3099. SiS_SetCRT2Group301 (BaseAddr, ROMAddr,
  3100.      SenseModeNo,
  3101.      HwDeviceExtension);
  3102. for (i = 0; i < 20; i++) {
  3103. SiS_LongWait ();
  3104. }
  3105. }
  3106. SiS_SetReg1 (SiS_Part2Port, 0x00, 0x1c);
  3107. tempax = 0;
  3108. tempbx = *pSiS_RGBSenseData;
  3109. /*301b */
  3110. if (!(SiS_Is301B (BaseAddr))) {
  3111. tempbx = *pSiS_RGBSenseData2;
  3112. }
  3113. /*end 301b */
  3114. tempcx = 0x0E08;
  3115. if (SiS_Sense (SiS_Part4Port, tempbx, tempcx)) {
  3116. if (SiS_Sense
  3117.     (SiS_Part4Port, tempbx, tempcx)) {
  3118. tempax = tempax | Monitor2Sense;
  3119. }
  3120. }
  3121. tempbx = *pSiS_YCSenseData;
  3122. /*301b */
  3123. if (!(SiS_Is301B (BaseAddr))) {
  3124. tempbx = *pSiS_YCSenseData2;
  3125. }
  3126. /*301b */
  3127. tempcx = 0x0604;
  3128. if (SiS_Sense (SiS_Part4Port, tempbx, tempcx)) {
  3129. if (SiS_Sense
  3130.     (SiS_Part4Port, tempbx, tempcx)) {
  3131. tempax = tempax | SVIDEOSense;
  3132. }
  3133. }
  3134. if (OutputSelect & BoardTVType) {
  3135. tempbx = *pSiS_VideoSenseData;
  3136. /*301b */
  3137. if (!(SiS_Is301B (BaseAddr))) {
  3138. tempbx = *pSiS_VideoSenseData2;
  3139. }
  3140. /*end 301b */
  3141. tempcx = 0x0804;
  3142. if (SiS_Sense
  3143.     (SiS_Part4Port, tempbx, tempcx)) {
  3144. if (SiS_Sense
  3145.     (SiS_Part4Port, tempbx,
  3146.      tempcx)) {
  3147. tempax =
  3148.     tempax |
  3149.     AVIDEOSense;
  3150. }
  3151. }
  3152. } else {
  3153. if (!(tempax & SVIDEOSense)) {
  3154. tempbx = *pSiS_VideoSenseData;
  3155. /*301b */
  3156. if (!(SiS_Is301B (BaseAddr))) {
  3157. tempbx =
  3158.     *pSiS_VideoSenseData2;
  3159. }
  3160. /*end 301b */
  3161. tempcx = 0x0804;
  3162. if (SiS_Sense
  3163.     (SiS_Part4Port, tempbx,
  3164.      tempcx)) {
  3165. if (SiS_Sense
  3166.     (SiS_Part4Port,
  3167.      tempbx, tempcx)) {
  3168. tempax =
  3169.     tempax |
  3170.     AVIDEOSense;
  3171. }
  3172. }
  3173. }
  3174. }
  3175. }
  3176. if (SiS_SenseLCD (HwDeviceExtension)) {
  3177. tempax = tempax | LCDSense;
  3178. }
  3179. tempbx = 0;
  3180. tempcx = 0;
  3181. SiS_Sense (SiS_Part4Port, tempbx, tempcx);
  3182. SiS_SetRegANDOR (SiS_P3d4, 0x32, ~0xDF, tempax);
  3183. SiS_SetReg1 (SiS_Part2Port, 0x00, P2reg0);
  3184. if (!(P2reg0 & 0x20)) {
  3185. SiS_VBInfo = DisableCRT2Display;
  3186. SiS_SetCRT2Group301 (BaseAddr, ROMAddr,
  3187.      SenseModeNo,
  3188.      HwDeviceExtension);
  3189. }
  3190. }
  3191. }
  3192. }
  3193. BOOLEAN
  3194. SiS_Sense (USHORT Part4Port, USHORT tempbx, USHORT tempcx)
  3195. {
  3196. USHORT temp, i, tempch;
  3197. temp = tempbx & 0xFF;
  3198. SiS_SetReg1 (SiS_Part4Port, 0x11, temp);
  3199. temp = (tempbx & 0xFF00) >> 8;
  3200. temp = temp | (tempcx & 0x00FF);
  3201. SiS_SetRegANDOR (SiS_Part4Port, 0x10, ~0x1F, temp);
  3202. for (i = 0; i < 10; i++)
  3203. SiS_LongWait ();
  3204. tempch = (tempcx & 0x7F00) >> 8; /*   ynlai [05/22/2001]  */
  3205. temp = SiS_GetReg1 (SiS_Part4Port, 0x03);
  3206. temp = temp ^ (0x0E);
  3207. temp = temp & tempch; /*   ynlai [05/22/2001]  */
  3208. if (temp > 0)
  3209. return 1;
  3210. else
  3211. return 0;
  3212. }
  3213. USHORT
  3214. SiS_SenseLCD (PSIS_HW_DEVICE_INFO HwDeviceExtension)
  3215. {
  3216. /*  USHORT SoftSetting; */
  3217. USHORT temp;
  3218. temp = SiS_GetPanelID ();
  3219. if (!temp)
  3220. temp = SiS_GetLCDDDCInfo (HwDeviceExtension);
  3221. return (temp);
  3222. }
  3223. BOOLEAN
  3224. SiS_GetLCDDDCInfo (PSIS_HW_DEVICE_INFO HwDeviceExtension)
  3225. {
  3226. USHORT temp;
  3227. //add lcd sense
  3228. if (HwDeviceExtension->ulCRT2LCDType == LCD_UNKNOWN)
  3229. return 0;
  3230. else {
  3231. temp = (USHORT) HwDeviceExtension->ulCRT2LCDType;
  3232. SiS_SetReg1 (SiS_P3d4, 0x36, temp);
  3233. return 1;
  3234. }
  3235. }
  3236. BOOLEAN
  3237. SiS_GetPanelID (void)
  3238. {
  3239. USHORT PanelTypeTable[16] =
  3240.     { SyncNN | PanelRGB18Bit | Panel800x600 | _PanelType00,
  3241. SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType01,
  3242. SyncPP | PanelRGB18Bit | Panel800x600 | _PanelType02,
  3243. SyncNN | PanelRGB18Bit | Panel640x480 | _PanelType03,
  3244. SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType04,
  3245. SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType05,
  3246. SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType06,
  3247. SyncNN | PanelRGB24Bit | Panel1024x768 | _PanelType07,
  3248. SyncNN | PanelRGB18Bit | Panel800x600 | _PanelType08,
  3249. SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType09,
  3250. SyncNN | PanelRGB18Bit | Panel800x600 | _PanelType0A,
  3251. SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType0B,
  3252. SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType0C,
  3253. SyncNN | PanelRGB24Bit | Panel1024x768 | _PanelType0D,
  3254. SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType0E,
  3255. SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType0F
  3256. };
  3257. USHORT tempax, tempbx, temp;
  3258. /*  USHORT return_flag; */
  3259. tempax = SiS_GetReg1 (SiS_P3c4, 0x18);
  3260. tempbx = tempax & 0x0F;
  3261. if (!(tempax & 0x10)) {
  3262. if (SiS_IF_DEF_LVDS == 1) {
  3263. tempbx = 0;
  3264. temp = SiS_GetReg1 (SiS_P3c4, 0x38);
  3265. if (temp & 0x40)
  3266. tempbx = tempbx | 0x08;
  3267. if (temp & 0x20)
  3268. tempbx = tempbx | 0x02;
  3269. if (temp & 0x01)
  3270. tempbx = tempbx | 0x01;
  3271. temp = SiS_GetReg1 (SiS_P3c4, 0x39);
  3272. if (temp & 0x80)
  3273. tempbx = tempbx | 0x04;
  3274. } else {
  3275. return 0;
  3276. }
  3277. }
  3278. tempbx = tempbx << 1;
  3279. tempbx = PanelTypeTable[tempbx];
  3280. tempbx = tempbx | LCDSync;
  3281. temp = tempbx & 0x00FF;
  3282. SiS_SetReg1 (SiS_P3d4, 0x36, temp);
  3283. temp = (tempbx & 0xFF00) >> 8;
  3284. SiS_SetRegANDOR (SiS_P3d4, 0x37, ~(LCDSyncBit | LCDRGB18Bit), temp);
  3285. return 1;
  3286. }
  3287. USHORT
  3288. SiS_SenseCHTV (void)
  3289. {
  3290. USHORT temp, push0e, status;
  3291. status = 0;
  3292. push0e = SiS_GetCH7005 (0x0e);
  3293. push0e = (push0e << 8) | 0x0e;
  3294. SiS_SetCH7005 (0x0b0e);
  3295. SiS_SetCH7005 (0x0110);
  3296. SiS_SetCH7005 (0x0010);
  3297. temp = SiS_GetCH7005 (0x10);
  3298. if (temp & 0x08)
  3299. status = status | SVIDEOSense;
  3300. if (temp & 0x02)
  3301. status = status | AVIDEOSense;
  3302. SiS_SetCH7005 (push0e);
  3303. return (status);
  3304. }
  3305. /*  ==========================================  */
  3306. #ifdef TC
  3307. int
  3308. INT1AReturnCode (union REGS regs)
  3309. {
  3310. if (regs.x.cflag) {
  3311. /*printf("Error to find pci device!n"); */
  3312. return 1;
  3313. }
  3314. switch (regs.h.ah) {
  3315. case 0:
  3316. return 0;
  3317. break;
  3318. case 0x81:
  3319. printf ("Function not supportn");
  3320. break;
  3321. case 0x83:
  3322. printf ("bad vendor idn");
  3323. break;
  3324. case 0x86:
  3325. printf ("device not foundn");
  3326. break;
  3327. case 0x87:
  3328. printf ("bad register numbern");
  3329. break;
  3330. case 0x88:
  3331. printf ("set failedn");
  3332. break;
  3333. case 0x89:
  3334. printf ("buffer too small");
  3335. break;
  3336. }
  3337. return 1;
  3338. }
  3339. unsigned
  3340. FindPCIIOBase (unsigned index, unsigned deviceid)
  3341. {
  3342. union REGS regs;
  3343. regs.h.ah = 0xb1; /*PCI_FUNCTION_ID */
  3344. regs.h.al = 0x02; /*FIND_PCI_DEVICE */
  3345. regs.x.cx = deviceid;
  3346. regs.x.dx = 0x1039;
  3347. regs.x.si = index; /* find n-th device */
  3348. int86 (0x1A, &regs, &regs);
  3349. if (INT1AReturnCode (regs) != 0)
  3350. return 0;
  3351. /* regs.h.bh *//* bus number */
  3352. /* regs.h.bl *//* device number */
  3353. regs.h.ah = 0xb1; /*PCI_FUNCTION_ID */
  3354. regs.h.al = 0x09; /*READ_CONFIG_WORD */
  3355. regs.x.cx = deviceid;
  3356. regs.x.dx = 0x1039;
  3357. regs.x.di = 0x18; /* register number */
  3358. int86 (0x1A, &regs, &regs);
  3359. if (INT1AReturnCode (regs) != 0)
  3360. return 0;
  3361. return regs.x.cx;
  3362. }
  3363. void
  3364. main (int argc, char *argv[])
  3365. /* void main() */
  3366. {
  3367. SIS_HW_DEVICE_INFO HwDeviceExtension;
  3368. USHORT temp;
  3369. USHORT ModeNo;
  3370. /*HwDeviceExtension.pjVirtualRomBase =(PUCHAR) MK_FP(0xC000,0); */
  3371. /*HwDeviceExtension.pjVideoMemoryAddress = (PUCHAR)MK_FP(0xA000,0); */
  3372. #ifdef CONFIG_FB_SIS_300
  3373. HwDeviceExtension.ulIOAddress =
  3374.     (FindPCIIOBase (0, 0x6300) & 0xFF80) + 0x30;
  3375. HwDeviceExtension.jChipType = SIS_630;
  3376. #endif
  3377. #ifdef CONFIG_FB_SIS_315
  3378. //  HwDeviceExtension.ulIOAddress = (FindPCIIOBase(0,0x5315)&0xFF80) + 0x30;
  3379. //  HwDeviceExtension.jChipType = SIS_550;
  3380. HwDeviceExtension.ulIOAddress =
  3381.     (FindPCIIOBase (0, 0x325) & 0xFF80) + 0x30;
  3382. HwDeviceExtension.jChipType = SIS_315H;
  3383. #endif
  3384. HwDeviceExtension.ujVBChipID = VB_CHIP_301;
  3385. strcpy (HwDeviceExtension.szVBIOSVer, "0.84");
  3386. HwDeviceExtension.bSkipDramSizing = FALSE;
  3387. HwDeviceExtension.ulVideoMemorySize = 0;
  3388. if (argc == 2) {
  3389. ModeNo = atoi (argv[1]);
  3390. } else {
  3391. ModeNo = 0x2e;
  3392. /*ModeNo=0x37;  1024x768x 4bpp */
  3393. /*ModeNo=0x38;  1024x768x 8bpp */
  3394. /*ModeNo=0x4A;  1024x768x 16bpp */
  3395. /*ModeNo=0x47;  800x600x 16bpp */
  3396. }
  3397. // SiSInit(&HwDeviceExtension);
  3398. SiSSetMode (&HwDeviceExtension, ModeNo);
  3399. }
  3400. #endif