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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.c,v 1.3 2000/12/02 01:16:16 dawes Exp $ */
  2. #include "init301.h"
  3. #ifdef CONFIG_FB_SIS_300
  4. #include "oem300.h"
  5. #endif
  6. #ifdef CONFIG_FB_SIS_315
  7. #include "oem310.h"
  8. #endif
  9. BOOLEAN
  10. SiS_SetCRT2Group301 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
  11.      PSIS_HW_DEVICE_INFO HwDeviceExtension)
  12. {
  13. USHORT ModeIdIndex;
  14. USHORT RefreshRateTableIndex;
  15. SiS_SetFlag = SiS_SetFlag | ProgrammingCRT2;
  16. SiS_SearchModeID (ROMAddr, ModeNo, &ModeIdIndex);
  17. SiS_SelectCRT2Rate = 4;
  18. RefreshRateTableIndex =
  19.     SiS_GetRatePtrCRT2 (ROMAddr, ModeNo, ModeIdIndex);
  20. SiS_SaveCRT2Info (ModeNo);
  21. SiS_DisableBridge (HwDeviceExtension, BaseAddr);
  22. SiS_UnLockCRT2 (HwDeviceExtension, BaseAddr);
  23. SiS_SetCRT2ModeRegs (BaseAddr, ModeNo, HwDeviceExtension);
  24. if (SiS_VBInfo & DisableCRT2Display) {
  25. SiS_LockCRT2 (HwDeviceExtension, BaseAddr);
  26. SiS_DisplayOn ();
  27. return (FALSE);
  28. }
  29. /* SetDefCRT2ExtRegs(BaseAddr);   */
  30. SiS_GetCRT2Data (ROMAddr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
  31. /*301b */
  32. if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
  33.     && (SiS_VBInfo & SetCRT2ToLCDA)) {
  34. SiS_GetLVDSDesData (ROMAddr, ModeNo, ModeIdIndex,
  35.     RefreshRateTableIndex);
  36. }
  37. /*end 301b */
  38. if (SiS_IF_DEF_LVDS == 1) {
  39. SiS_GetLVDSDesData (ROMAddr, ModeNo, ModeIdIndex,
  40.     RefreshRateTableIndex);
  41. }
  42. SiS_SetGroup1 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
  43.        HwDeviceExtension, RefreshRateTableIndex);
  44. /*301b */
  45. if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
  46.     && (SiS_VBInfo & SetCRT2ToLCDA) && (SiS_IF_DEF_LVDS == 0)) {
  47. } else if (SiS_IF_DEF_LVDS == 0 && (!(SiS_VBInfo & SetCRT2ToLCDA))) {
  48. SiS_SetGroup2 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
  49.        RefreshRateTableIndex, HwDeviceExtension);
  50. SiS_SetGroup3 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
  51.        HwDeviceExtension);
  52. SiS_SetGroup4 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
  53.        RefreshRateTableIndex, HwDeviceExtension);
  54. SiS_SetGroup5 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex);
  55. } else {
  56. if (SiS_IF_DEF_CH7005 == 1) {
  57. SiS_SetCHTVReg (ROMAddr, ModeNo, ModeIdIndex,
  58. RefreshRateTableIndex);
  59. }
  60. SiS_ModCRT1CRTC (ROMAddr, ModeNo, ModeIdIndex,
  61.  RefreshRateTableIndex);
  62. SiS_SetCRT2ECLK (ROMAddr, ModeNo, ModeIdIndex,
  63.  RefreshRateTableIndex, HwDeviceExtension);
  64. }
  65. #ifdef CONFIG_FB_SIS_300
  66. if ((HwDeviceExtension->jChipType == SIS_540) ||
  67.     (HwDeviceExtension->jChipType == SIS_630) ||
  68.     (HwDeviceExtension->jChipType == SIS_730) ||
  69.     (HwDeviceExtension->jChipType == SIS_300))
  70. SiS_OEM300Setting (HwDeviceExtension, BaseAddr, ROMAddr,
  71.    ModeNo);
  72. #endif
  73. #ifdef CONFIG_FB_SIS_315
  74. if ((HwDeviceExtension->jChipType == SIS_315H) || /* 05/02/01 ynlai for sis550 */
  75.     (HwDeviceExtension->jChipType == SIS_315PRO) ||
  76.     (HwDeviceExtension->jChipType == SIS_550) || /* 05/02/01 ynlai for 550 */
  77.     (HwDeviceExtension->jChipType == SIS_640) || /* 08/20/01 chiawen for 640/740 */
  78.     (HwDeviceExtension->jChipType == SIS_740)) { /* 09/03/01 chiawen for 640/740 */
  79. SiS_OEM310Setting (HwDeviceExtension, BaseAddr, ROMAddr, ModeNo,
  80.    ModeIdIndex);
  81. SiS_CRT2AutoThreshold (BaseAddr);
  82. }
  83. #endif
  84. SiS_EnableBridge (HwDeviceExtension, BaseAddr);
  85. SiS_DisplayOn ();
  86. SiS_LockCRT2 (HwDeviceExtension, BaseAddr);
  87. return 1;
  88. }
  89. void
  90. SiS_SetGroup1 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
  91.        USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,
  92.        USHORT RefreshRateTableIndex)
  93. {
  94. USHORT temp = 0, tempax = 0, tempbx = 0, tempcx = 0;
  95. USHORT pushbx = 0, CRT1Index = 0;
  96. USHORT modeflag, resinfo = 0;
  97. if (ModeNo <= 0x13) {
  98. } else {
  99. CRT1Index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
  100. CRT1Index = CRT1Index & 0x3F;
  101. resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
  102. }
  103. /*301b */
  104. if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
  105.     && (SiS_VBInfo & SetCRT2ToLCDA)) {
  106. } else {
  107. SiS_SetCRT2Offset (SiS_Part1Port, ROMAddr, ModeNo, ModeIdIndex,
  108.    RefreshRateTableIndex, HwDeviceExtension);
  109. if (HwDeviceExtension->jChipType < SIS_315H) /* 300 series */
  110. SiS_SetCRT2FIFO (SiS_Part1Port, ROMAddr, ModeNo,
  111.  HwDeviceExtension);
  112. else /* 310 series */
  113. SiS_SetCRT2FIFO2 (SiS_Part1Port, ROMAddr, ModeNo,
  114.   HwDeviceExtension);
  115. SiS_SetCRT2Sync (BaseAddr, ROMAddr, ModeNo,
  116.  RefreshRateTableIndex);
  117. }
  118. if (ModeNo <= 0x13) {
  119. modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  120. } else {
  121. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  122. }
  123. /*301b */
  124. if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
  125.     && (SiS_VBInfo & SetCRT2ToLCDA)) {
  126. SiS_SetGroup1_LCDA (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
  127.     HwDeviceExtension, RefreshRateTableIndex);
  128. }
  129. /*end 301b */
  130. else if (HwDeviceExtension->jChipType < SIS_315H) { /* 300 series */
  131. temp = (SiS_VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
  132. SiS_SetReg1 (SiS_Part1Port, 0x08, temp);
  133. temp = (((SiS_VGAHT - 1) & 0xFF00) >> 8) << 4;
  134. SiS_SetRegANDOR (SiS_Part1Port, 0x09, ~0x0F0, temp);
  135. temp = (SiS_VGAHDE + 12) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */
  136. SiS_SetReg1 (SiS_Part1Port, 0x0A, temp);
  137. pushbx = SiS_VGAHDE + 12; /* bx  BTVGA@HRS 0x0B,0x0C */
  138. tempcx = (SiS_VGAHT - SiS_VGAHDE) >> 2; /* cx */
  139. tempbx = pushbx + tempcx;
  140. tempcx = tempcx << 1;
  141. tempcx = tempcx + tempbx;
  142. if (SiS_IF_DEF_LVDS == 0) {
  143. if (SiS_VBInfo & SetCRT2ToRAMDAC) {
  144. tempbx = SiS_CRT1Table[CRT1Index].CR[4];
  145. tempbx =
  146.     tempbx |
  147.     ((SiS_CRT1Table[CRT1Index].CR[14] & 0xC0) <<
  148.      2);
  149. tempbx = (tempbx - 1) << 3;
  150. tempcx = SiS_CRT1Table[CRT1Index].CR[5];
  151. tempcx = tempcx & 0x1F;
  152. temp = SiS_CRT1Table[CRT1Index].CR[15];
  153. temp = (temp & 0x04) << (6 - 2);
  154. tempcx = ((tempcx | temp) - 1) << 3;
  155. }
  156. }
  157. /*add for hardware request */
  158. if ((SiS_VBInfo & SetCRT2ToTV) && (resinfo == 0x08)) {
  159. if (SiS_VBInfo & SetPALTV) {
  160. tempbx = 1040;
  161. tempcx = 1042;
  162. } else {
  163. tempbx = 1040;
  164. tempcx = 1042;
  165. }
  166. }
  167. temp = tempbx & 0x00FF;
  168. SiS_SetReg1 (SiS_Part1Port, 0x0B, temp);
  169. } else { /* 310 series */
  170. if (modeflag & HalfDCLK) { /* for low resolution mode */
  171. temp = (SiS_VGAHT / 2 - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
  172. SiS_SetReg1 (SiS_Part1Port, 0x08, temp);
  173. temp = (((SiS_VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
  174. SiS_SetRegANDOR (SiS_Part1Port, 0x09, ~0x0F0, temp);
  175. temp = (SiS_VGAHDE / 2 + 16) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */
  176. SiS_SetReg1 (SiS_Part1Port, 0x0A, temp);
  177. pushbx = SiS_VGAHDE / 2 + 16;
  178. tempcx = ((SiS_VGAHT - SiS_VGAHDE) / 2) >> 2; /* cx */
  179. tempbx = pushbx + tempcx; /* bx  BTVGA@HRS 0x0B,0x0C */
  180. tempcx = tempcx + tempbx;
  181. if (SiS_IF_DEF_LVDS == 0) {
  182. if (SiS_VBInfo & SetCRT2ToRAMDAC) {
  183. tempbx = SiS_CRT1Table[CRT1Index].CR[4];
  184. tempbx =
  185.     tempbx |
  186.     ((SiS_CRT1Table
  187.       [CRT1Index].CR[14] & 0xC0) << 2);
  188. tempbx = (tempbx - 3) << 3; /*(VGAHRS-3)*8 */
  189. tempcx = SiS_CRT1Table[CRT1Index].CR[5];
  190. tempcx = tempcx & 0x1F;
  191. temp = SiS_CRT1Table[CRT1Index].CR[15];
  192. temp = (temp & 0x04) << (5 - 2); /*VGAHRE D[5] */
  193. tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
  194. }
  195. }
  196. tempbx += 4;
  197. tempcx += 4;
  198. if (tempcx > (SiS_VGAHT / 2))
  199. tempcx = SiS_VGAHT / 2;
  200. temp = tempbx & 0x00FF;
  201. SiS_SetReg1 (SiS_Part1Port, 0x0B, temp);
  202. } else {
  203. temp = (SiS_VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
  204. SiS_SetReg1 (SiS_Part1Port, 0x08, temp);
  205. temp = (((SiS_VGAHT - 1) & 0xFF00) >> 8) << 4;
  206. SiS_SetRegANDOR (SiS_Part1Port, 0x09, ~0x0F0, temp);
  207. temp = (SiS_VGAHDE + 16) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */
  208. SiS_SetReg1 (SiS_Part1Port, 0x0A, temp);
  209. pushbx = SiS_VGAHDE + 16;
  210. tempcx = (SiS_VGAHT - SiS_VGAHDE) >> 2; /* cx */
  211. tempbx = pushbx + tempcx; /* bx  BTVGA@HRS 0x0B,0x0C */
  212. tempcx = tempcx + tempbx;
  213. if (SiS_IF_DEF_LVDS == 0) {
  214. if (SiS_VBInfo & SetCRT2ToRAMDAC) {
  215. tempbx = SiS_CRT1Table[CRT1Index].CR[4];
  216. tempbx =
  217.     tempbx |
  218.     ((SiS_CRT1Table
  219.       [CRT1Index].CR[14] & 0xC0) << 2);
  220. tempbx = (tempbx - 3) << 3; /*(VGAHRS-3)*8 */
  221. tempcx = SiS_CRT1Table[CRT1Index].CR[5];
  222. tempcx = tempcx & 0x1F;
  223. temp = SiS_CRT1Table[CRT1Index].CR[15];
  224. temp = (temp & 0x04) << (5 - 2); /*VGAHRE D[5] */
  225. tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
  226. tempbx += 16;
  227. tempcx += 16;
  228. }
  229. }
  230. if (tempcx > SiS_VGAHT)
  231. tempcx = SiS_VGAHT;
  232. /*add for hardware request */
  233. if ((SiS_VBInfo & SetCRT2ToTV) && (resinfo == 0x08)) {
  234. if (SiS_VBInfo & SetPALTV) {
  235. tempbx = 1040;
  236. tempcx = 1042;
  237. } else {
  238. tempbx = 1040;
  239. tempcx = 1042;
  240. }
  241. }
  242. temp = tempbx & 0x00FF;
  243. SiS_SetReg1 (SiS_Part1Port, 0x0B, temp);
  244. }
  245. }
  246. tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
  247. tempbx = pushbx;
  248. tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
  249. tempax = tempax | (tempbx & 0xFF00);
  250. temp = (tempax & 0xFF00) >> 8;
  251. SiS_SetReg1 (SiS_Part1Port, 0x0C, temp);
  252. temp = tempcx & 0x00FF;
  253. SiS_SetReg1 (SiS_Part1Port, 0x0D, temp);
  254. tempcx = (SiS_VGAVT - 1);
  255. temp = tempcx & 0x00FF;
  256. if (SiS_IF_DEF_CH7005 == 1) {
  257. if (SiS_VBInfo & 0x0C) {
  258. temp--;
  259. }
  260. }
  261. SiS_SetReg1 (SiS_Part1Port, 0x0E, temp);
  262. tempbx = SiS_VGAVDE - 1;
  263. temp = tempbx & 0x00FF;
  264. SiS_SetReg1 (SiS_Part1Port, 0x0F, temp);
  265. temp = ((tempbx & 0xFF00) << 3) >> 8;
  266. temp = temp | ((tempcx & 0xFF00) >> 8);
  267. SiS_SetReg1 (SiS_Part1Port, 0x12, temp);
  268. tempax = SiS_VGAVDE;
  269. tempbx = SiS_VGAVDE;
  270. tempcx = SiS_VGAVT;
  271. tempbx = (SiS_VGAVT + SiS_VGAVDE) >> 1; /*      BTVGA2VRS     0x10,0x11   */
  272. tempcx = ((SiS_VGAVT - SiS_VGAVDE) >> 4) + tempbx + 1; /*      BTVGA2VRE     0x11        */
  273. if (SiS_IF_DEF_LVDS == 0) {
  274. if (SiS_VBInfo & SetCRT2ToRAMDAC) {
  275. tempbx = SiS_CRT1Table[CRT1Index].CR[8];
  276. temp = SiS_CRT1Table[CRT1Index].CR[7];
  277. if (temp & 0x04)
  278. tempbx = tempbx | 0x0100;
  279. if (temp & 0x080)
  280. tempbx = tempbx | 0x0200;
  281. temp = SiS_CRT1Table[CRT1Index].CR[13];
  282. if (temp & 0x08)
  283. tempbx = tempbx | 0x0400;
  284. temp = SiS_CRT1Table[CRT1Index].CR[9];
  285. tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
  286. }
  287. }
  288. temp = tempbx & 0x00FF;
  289. SiS_SetReg1 (SiS_Part1Port, 0x10, temp);
  290. temp = ((tempbx & 0xFF00) >> 8) << 4;
  291. temp = ((tempcx & 0x000F) | (temp));
  292. SiS_SetReg1 (SiS_Part1Port, 0x11, temp);
  293. if (SiS_IF_DEF_LVDS == 0) {
  294. temp = 0x20;
  295. if (SiS_LCDResInfo == Panel1280x1024)
  296. temp = 0x20;
  297. if (SiS_LCDResInfo == Panel1280x960)
  298. temp = 0x24;
  299. if (SiS_VBInfo & SetCRT2ToTV)
  300. temp = 0x08;
  301. if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
  302. if (SiS_VBInfo & SetInSlaveMode)
  303. temp = 0x2c;
  304. else
  305. temp = 0x20;
  306. }
  307. } else {
  308. temp = 0x20;
  309. }
  310. if (HwDeviceExtension->jChipType < SIS_315H) /* 300 series */
  311. SiS_SetRegANDOR (SiS_Part1Port, 0x13, ~0x03C, temp);
  312. else { /* 310 series */
  313. temp >>= 2;
  314. temp = 0x11; /*  ynlai 05/30/2001 for delay compenation  */
  315. SiS_SetReg1 (SiS_Part1Port, 0x2D, temp);
  316. /*SiS_SetRegANDOR(SiS_Part1Port,0x2D,~0x00F,temp); */
  317. SiS_SetRegAND (SiS_Part1Port, 0x13, 0xEF); /* BDirectLCD=0 for lcd ?? */
  318. tempax = 0;
  319. if (modeflag & DoubleScanMode)
  320. tempax |= 0x80;
  321. if (modeflag & HalfDCLK)
  322. tempax |= 0x40;
  323. SiS_SetRegANDOR (SiS_Part1Port, 0x2C, ~0x0C0, tempax);
  324. }
  325. if (SiS_IF_DEF_LVDS == 0) { /*  301  */
  326. SiS_SetGroup1_301 (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
  327.    HwDeviceExtension, RefreshRateTableIndex);
  328. } else { /*  LVDS  */
  329. SiS_SetGroup1_LVDS (BaseAddr, ROMAddr, ModeNo, ModeIdIndex,
  330.     HwDeviceExtension, RefreshRateTableIndex);
  331. }
  332. }
  333. void
  334. SiS_SetGroup1_301 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
  335.    USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,
  336.    USHORT RefreshRateTableIndex)
  337. {
  338. USHORT push1, push2;
  339. USHORT tempax, tempbx, tempcx, temp;
  340. USHORT resinfo, modeflag;
  341. USHORT CRT1Index;
  342. if (ModeNo <= 0x13) {
  343. modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
  344. resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
  345. } else {
  346. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
  347. resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
  348. CRT1Index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
  349. CRT1Index = CRT1Index & 0x3F;
  350. }
  351. if (!(SiS_VBInfo & SetInSlaveMode)) {
  352. return;
  353. }
  354. tempax = 0xFFFF;
  355. if (!(SiS_VBInfo & SetCRT2ToTV)) {
  356. tempax = SiS_GetVGAHT2 ();
  357. }
  358. if (modeflag & Charx8Dot)
  359. tempcx = 0x08;
  360. else
  361. tempcx = 0x09;
  362. if (tempax >= SiS_VGAHT) {
  363. tempax = SiS_VGAHT;
  364. }
  365. if (modeflag & HalfDCLK) {
  366. tempax = tempax >> 1;
  367. }
  368. tempax = (tempax / tempcx) - 5;
  369. tempbx = tempax;
  370. temp = 0xFF; /* set MAX HT */
  371. SiS_SetReg1 (SiS_Part1Port, 0x03, temp);
  372. tempax = SiS_VGAHDE; /* 0x04 Horizontal Display End */
  373. if (modeflag & HalfDCLK)
  374. tempax = tempax >> 1;
  375. tempax = (tempax / tempcx) - 1;
  376. tempbx = tempbx | ((tempax & 0x00FF) << 8);
  377. temp = tempax & 0x00FF;
  378. SiS_SetReg1 (SiS_Part1Port, 0x04, temp);
  379. temp = (tempbx & 0xFF00) >> 8;
  380. if (SiS_VBInfo & SetCRT2ToTV) {
  381. temp = temp + 2;
  382. if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
  383. if (resinfo == 7)
  384. temp = temp - 2;
  385. }
  386. }
  387. SiS_SetReg1 (SiS_Part1Port, 0x05, temp); /* 0x05 Horizontal Display Start */
  388. SiS_SetReg1 (SiS_Part1Port, 0x06, 0x03); /* 0x06 Horizontal Blank end     */
  389. /* 0x07 horizontal Retrace Start */
  390. if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
  391. temp = (tempbx & 0x00FF) - 1;
  392. if (!(modeflag & HalfDCLK)) {
  393. temp = temp - 6;
  394. if (SiS_SetFlag & TVSimuMode) {
  395. temp = temp - 4;
  396. if (ModeNo > 0x13)
  397. temp = temp - 10;
  398. }
  399. }
  400. } else {
  401. tempcx = tempbx & 0x00FF;
  402. tempbx = (tempbx & 0xFF00) >> 8;
  403. tempcx = (tempcx + tempbx) >> 1;
  404. temp = (tempcx & 0x00FF) + 2;
  405. if (SiS_VBInfo & SetCRT2ToTV) {
  406. temp = temp - 1;
  407. if (!(modeflag & HalfDCLK)) {
  408. if ((modeflag & Charx8Dot)) {
  409. temp = temp + 4;
  410. if (SiS_VGAHDE >= 800) {
  411. temp = temp - 6;
  412. }
  413. }
  414. }
  415. } else {
  416. if (!(modeflag & HalfDCLK)) {
  417. temp = temp - 4;
  418. if (SiS_LCDResInfo != Panel1280x960) {
  419. if (SiS_VGAHDE >= 800) {
  420. temp = temp - 7;
  421. if (SiS_ModeType == ModeEGA) {
  422. if (SiS_VGAVDE == 1024) {
  423. temp =
  424.     temp + 15;
  425. if
  426.     (SiS_LCDResInfo
  427.      !=
  428.      Panel1280x1024)
  429. {
  430. temp =
  431.     temp
  432.     + 7;
  433. }
  434. }
  435. }
  436. if (SiS_VGAHDE >= 1280) {
  437. if (SiS_LCDResInfo !=
  438.     Panel1280x960) {
  439. if (SiS_LCDInfo
  440.     &
  441.     LCDNonExpanding)
  442. {
  443. temp =
  444.     temp
  445.     +
  446.     28;
  447. }
  448. }
  449. }
  450. }
  451. }
  452. }
  453. }
  454. }
  455. SiS_SetReg1 (SiS_Part1Port, 0x07, temp); /* 0x07 Horizontal Retrace Start */
  456. SiS_SetReg1 (SiS_Part1Port, 0x08, 0); /* 0x08 Horizontal Retrace End   */
  457. if (SiS_VBInfo & SetCRT2ToTV) {
  458. if (SiS_SetFlag & TVSimuMode) {
  459. if ((ModeNo == 0x06) || (ModeNo == 0x10)
  460.     || (ModeNo == 0x11) || (ModeNo == 0x13)
  461.     || (ModeNo == 0x0F)) {
  462. SiS_SetReg1 (SiS_Part1Port, 0x07, 0x5b);
  463. SiS_SetReg1 (SiS_Part1Port, 0x08, 0x03);
  464. }
  465. if ((ModeNo == 0x00) || (ModeNo == 0x01)) {
  466. if (SiS_VBInfo & SetNTSCTV) {
  467. SiS_SetReg1 (SiS_Part1Port, 0x07, 0x2A);
  468. SiS_SetReg1 (SiS_Part1Port, 0x08, 0x61);
  469. } else {
  470. SiS_SetReg1 (SiS_Part1Port, 0x07, 0x2A);
  471. SiS_SetReg1 (SiS_Part1Port, 0x08, 0x41);
  472. SiS_SetReg1 (SiS_Part1Port, 0x0C, 0xF0);
  473. }
  474. }
  475. if ((ModeNo == 0x02) || (ModeNo == 0x03)
  476.     || (ModeNo == 0x07)) {
  477. if (SiS_VBInfo & SetNTSCTV) {
  478. SiS_SetReg1 (SiS_Part1Port, 0x07, 0x54);
  479. SiS_SetReg1 (SiS_Part1Port, 0x08, 0x00);
  480. } else {
  481. SiS_SetReg1 (SiS_Part1Port, 0x07, 0x55);
  482. SiS_SetReg1 (SiS_Part1Port, 0x08, 0x00);
  483. SiS_SetReg1 (SiS_Part1Port, 0x0C, 0xF0);
  484. }
  485. }
  486. if ((ModeNo == 0x04) || (ModeNo == 0x05)
  487.     || (ModeNo == 0x0D) || (ModeNo == 0x50)) {
  488. if (SiS_VBInfo & SetNTSCTV) {
  489. SiS_SetReg1 (SiS_Part1Port, 0x07, 0x30);
  490. SiS_SetReg1 (SiS_Part1Port, 0x08, 0x03);
  491. } else {
  492. SiS_SetReg1 (SiS_Part1Port, 0x07, 0x2f);
  493. SiS_SetReg1 (SiS_Part1Port, 0x08, 0x02);
  494. }
  495. }
  496. }
  497. }
  498. SiS_SetReg1 (SiS_Part1Port, 0x18, 0x03); /* 0x18 SR08                     */
  499. SiS_SetRegANDOR (SiS_Part1Port, 0x19, 0xF0, 0x00);
  500. SiS_SetReg1 (SiS_Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT               */
  501. tempbx = SiS_VGAVT;
  502. push1 = tempbx;
  503. tempcx = 0x121;
  504. tempbx = SiS_VGAVDE; /* 0x0E Virtical Display End */
  505. if (tempbx == 357)
  506. tempbx = 350;
  507. if (tempbx == 360)
  508. tempbx = 350;
  509. if (tempbx == 375)
  510. tempbx = 350;
  511. if (tempbx == 405)
  512. tempbx = 400;
  513. if (tempbx == 420)
  514. tempbx = 400;
  515. if (tempbx == 525)
  516. tempbx = 480;
  517. push2 = tempbx;
  518. if (SiS_VBInfo & SetCRT2ToLCD) {
  519. if (SiS_LCDResInfo == Panel1024x768) {
  520. if (!(SiS_SetFlag & LCDVESATiming)) {
  521. if (tempbx == 350)
  522. tempbx = tempbx + 5;
  523. if (tempbx == 480)
  524. tempbx = tempbx + 5;
  525. }
  526. }
  527. }
  528. tempbx--;
  529. temp = tempbx & 0x00FF;
  530. tempbx--;
  531. temp = tempbx & 0x00FF;
  532. SiS_SetReg1 (SiS_Part1Port, 0x10, temp); /* 0x10 vertical Blank Start */
  533. tempbx = push2;
  534. tempbx--;
  535. temp = tempbx & 0x00FF;
  536. SiS_SetReg1 (SiS_Part1Port, 0x0E, temp);
  537. if (tempbx & 0x0100) {
  538. tempcx = tempcx | 0x0002;
  539. }
  540. tempax = 0x000B;
  541. if (modeflag & DoubleScanMode) {
  542. tempax = tempax | 0x08000;
  543. }
  544. if (tempbx & 0x0200) {
  545. tempcx = tempcx | 0x0040;
  546. }
  547. temp = (tempax & 0xFF00) >> 8;
  548. SiS_SetReg1 (SiS_Part1Port, 0x0B, temp);
  549. if (tempbx & 0x0400) {
  550. tempcx = tempcx | 0x0600;
  551. }
  552. SiS_SetReg1 (SiS_Part1Port, 0x11, 0x00); /* 0x11 Vertival Blank End */
  553. tempax = push1;
  554. tempax = tempax - tempbx; /* 0x0C Vertical Retrace Start */
  555. tempax = tempax >> 2;
  556. push1 = tempax; /* push ax */
  557. if (resinfo != 0x09) {
  558. tempax = tempax << 1;
  559. tempbx = tempax + tempbx;
  560. }
  561. if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
  562. tempbx = tempbx - 10;
  563. } else {
  564. if (SiS_SetFlag & TVSimuMode) {
  565. if (SiS_VBInfo & SetPALTV) {
  566. tempbx = tempbx + 40;
  567. }
  568. }
  569. }
  570. tempax = push1;
  571. tempax = tempax >> 2;
  572. tempax++;
  573. tempax = tempax + tempbx;
  574. push1 = tempax; /* push ax  */
  575. if ((SiS_VBInfo & SetPALTV)) {
  576. if (tempbx <= 513) {
  577. if (tempax >= 513) {
  578. tempbx = 513;
  579. }
  580. }
  581. }
  582. temp = (tempbx & 0x00FF);
  583. SiS_SetReg1 (SiS_Part1Port, 0x0C, temp);
  584. tempbx--;
  585. temp = tempbx & 0x00FF;
  586. SiS_SetReg1 (SiS_Part1Port, 0x10, temp);
  587. if (tempbx & 0x0100) {
  588. tempcx = tempcx | 0x0008;
  589. }
  590. if (tempbx & 0x0200) {
  591. SiS_SetRegANDOR (SiS_Part1Port, 0x0B, 0x0FF, 0x20);
  592. }
  593. tempbx++;
  594. if (tempbx & 0x0100) {
  595. tempcx = tempcx | 0x0004;
  596. }
  597. if (tempbx & 0x0200) {
  598. tempcx = tempcx | 0x0080;
  599. }
  600. if (tempbx & 0x0400) {
  601. tempcx = tempcx | 0x0C00;
  602. }
  603. tempbx = push1; /* pop ax */
  604. temp = tempbx & 0x00FF;
  605. temp = temp & 0x0F;
  606. SiS_SetReg1 (SiS_Part1Port, 0x0D, temp); /* 0x0D vertical Retrace End */
  607. if (tempbx & 0x0010) {
  608. tempcx = tempcx | 0x2000;
  609. }
  610. temp = tempcx & 0x00FF;
  611. SiS_SetReg1 (SiS_Part1Port, 0x0A, temp); /* 0x0A CR07 */
  612. temp = (tempcx & 0x0FF00) >> 8;
  613. SiS_SetReg1 (SiS_Part1Port, 0x17, temp); /* 0x17 SR0A */
  614. tempax = modeflag;
  615. temp = (tempax & 0xFF00) >> 8;
  616. temp = (temp >> 1) & 0x09;
  617. SiS_SetReg1 (SiS_Part1Port, 0x16, temp); /* 0x16 SR01 */
  618. SiS_SetReg1 (SiS_Part1Port, 0x0F, 0); /* 0x0F CR14 */
  619. SiS_SetReg1 (SiS_Part1Port, 0x12, 0); /* 0x12 CR17 */
  620. if (SiS_LCDInfo & LCDRGB18Bit)
  621. temp = 0x80;
  622. else
  623. temp = 0x00;
  624. SiS_SetReg1 (SiS_Part1Port, 0x1A, temp); /* 0x1A SR0E */
  625. return;
  626. }
  627. void
  628. SiS_SetGroup1_LVDS (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
  629.     USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,
  630.     USHORT RefreshRateTableIndex)
  631. {
  632. USHORT modeflag, resinfo;
  633. USHORT push1, push2, tempax, tempbx, tempcx, temp, pushcx;
  634. ULONG tempeax = 0, tempebx, tempecx, tempvcfact = 0;
  635. if (ModeNo <= 0x13) {
  636. modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
  637. resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
  638. } else {
  639. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
  640. resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
  641. }
  642. tempax = SiS_LCDHDES;
  643. tempbx = SiS_HDE;
  644. tempcx = SiS_HT;
  645. tempcx = tempcx - tempbx; /* HT-HDE  */
  646. if (SiS_LCDInfo & LCDNonExpanding) {
  647. if (SiS_LCDResInfo == Panel800x600)
  648. tempbx = 800;
  649. if (SiS_LCDResInfo == Panel1024x768)
  650. tempbx = 1024;
  651. }
  652. push1 = tempax;
  653. tempax = tempax + tempbx; /* lcdhdee  */
  654. tempbx = SiS_HT;
  655. if (tempax >= tempbx) {
  656. tempax = tempax - tempbx;
  657. }
  658. push2 = tempax;
  659. /* push ax   lcdhdee  */
  660. tempcx = tempcx >> 2; /* temp  */
  661. tempcx = tempcx + tempax; /* lcdhrs  */
  662. if (tempcx >= tempbx) {
  663. tempcx = tempcx - tempbx;
  664. }
  665. /* v ah,cl  */
  666. tempax = tempcx;
  667. tempax = tempax >> 3; /* BPLHRS */
  668. temp = tempax & 0x00FF;
  669. SiS_SetReg1 (SiS_Part1Port, 0x14, temp); /* Part1_14h  */
  670. temp = (tempax & 0x00FF) + 10;
  671. temp = temp & 0x01F;
  672. temp = temp | (((tempcx & 0x00ff) & 0x07) << 5);
  673. SiS_SetReg1 (SiS_Part1Port, 0x15, temp); /* Part1_15h  */
  674. tempbx = push2; /* lcdhdee  */
  675. tempcx = push1; /* lcdhdes  */
  676. temp = (tempcx & 0x00FF);
  677. temp = temp & 0x07; /* BPLHDESKEW  */
  678. SiS_SetReg1 (SiS_Part1Port, 0x1A, temp); /* Part1_1Ah  */
  679. tempcx = tempcx >> 3; /* BPLHDES */
  680. temp = (tempcx & 0x00FF);
  681. SiS_SetReg1 (SiS_Part1Port, 0x16, temp); /* Part1_16h  */
  682. if (tempbx & 0x07)
  683. tempbx = tempbx + 8;
  684. tempbx = tempbx >> 3; /* BPLHDEE  */
  685. temp = tempbx & 0x00FF;
  686. SiS_SetReg1 (SiS_Part1Port, 0x17, temp); /* Part1_17h  */
  687. tempcx = SiS_VGAVT;
  688. tempbx = SiS_VGAVDE;
  689. tempcx = tempcx - tempbx; /* GAVT-VGAVDE  */
  690. tempbx = SiS_LCDVDES; /* VGAVDES  */
  691. push1 = tempbx; /* push bx temppush1 */
  692. if (SiS_IF_DEF_TRUMPION == 0) {
  693. if (SiS_IF_DEF_CH7005 == 1) {
  694. if (SiS_VBInfo & SetCRT2ToTV) {
  695. tempax = SiS_VGAVDE;
  696. }
  697. }
  698. if (SiS_VBInfo & SetCRT2ToLCD) {
  699. if (SiS_LCDResInfo == Panel800x600)
  700. tempax = 600;
  701. if (SiS_LCDResInfo == Panel1024x768)
  702. tempax = 768;
  703. }
  704. } else
  705. tempax = SiS_VGAVDE;
  706. tempbx = tempbx + tempax;
  707. tempax = SiS_VT; /* VT  */
  708. if (tempbx >= SiS_VT) {
  709. tempbx = tempbx - tempax;
  710. }
  711. push2 = tempbx; /* push bx  temppush2  */
  712. tempcx = tempcx >> 1;
  713. tempbx = tempbx + tempcx;
  714. tempbx++; /* BPLVRS  */
  715. if (tempbx >= tempax) {
  716. tempbx = tempbx - tempax;
  717. }
  718. temp = tempbx & 0x00FF;
  719. SiS_SetReg1 (SiS_Part1Port, 0x18, temp); /* Part1_18h  */
  720. tempcx = tempcx >> 3;
  721. tempcx = tempcx + tempbx;
  722. tempcx++; /* BPLVRE  */
  723. temp = tempcx & 0x00FF;
  724. temp = temp & 0x0F;
  725. SiS_SetRegANDOR (SiS_Part1Port, 0x19, ~0x00F, temp); /* Part1_19h  */
  726. temp = (tempbx & 0xFF00) >> 8;
  727. temp = temp & 0x07;
  728. temp = temp << 3; /* BPLDESKEW =0 */
  729. tempbx = SiS_VGAVDE;
  730. if (tempbx != SiS_VDE) {
  731. temp = temp | 0x40;
  732. }
  733. if (SiS_SetFlag & EnableLVDSDDA) {
  734. temp = temp | 0x40;
  735. }
  736. if (SiS_LCDInfo & LCDRGB18Bit) {
  737. temp = temp | 0x80;
  738. }
  739. SiS_SetRegANDOR (SiS_Part1Port, 0x1A, 0x07, temp); /* Part1_1Ah */
  740. tempecx = SiS_VGAVT;
  741. tempebx = SiS_VDE;
  742. tempeax = SiS_VGAVDE;
  743. tempecx = tempecx - tempeax; /* VGAVT-VGAVDE  */
  744. tempeax = tempeax << 6;
  745. temp = (USHORT) (tempeax % tempebx);
  746. tempeax = tempeax / tempebx;
  747. if (temp != 0) {
  748. tempeax++;
  749. }
  750. tempebx = tempeax; /* BPLVCFACT  */
  751. if (SiS_SetFlag & EnableLVDSDDA) {
  752. tempebx = tempebx & 0x003F;
  753. }
  754. temp = (USHORT) (tempebx & 0x00FF);
  755. SiS_SetReg1 (SiS_Part1Port, 0x1E, temp); /* Part1_1Eh */
  756. /*add for 301b different 301 */
  757. if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
  758. tempecx = SiS_VGAVT;
  759. tempebx = SiS_VDE;
  760. tempeax = SiS_VGAVDE;
  761. tempecx = tempecx - tempeax; /* VGAVT-VGAVDE  */
  762. tempeax = tempeax << 18;
  763. temp = (USHORT) (tempeax % tempebx);
  764. tempeax = tempeax / tempebx;
  765. if (temp != 0) {
  766. tempeax++;
  767. }
  768. tempebx = tempeax; /* BPLVCFACT  */
  769. tempvcfact = tempeax; /*301b */
  770. temp = (USHORT) (tempebx & 0x00FF);
  771. SiS_SetReg1 (SiS_Part1Port, 0x37, temp);
  772. temp = (USHORT) ((tempebx & 0x00FF00) >> 8);
  773. SiS_SetReg1 (SiS_Part1Port, 0x36, temp);
  774. temp = (USHORT) ((tempebx & 0x00030000) >> 16);
  775. if (SiS_VDE == SiS_VGAVDE) {
  776. temp = temp | 0x04;
  777. }
  778. SiS_SetReg1 (SiS_Part1Port, 0x35, temp);
  779. }
  780. /*end for 301b */
  781. tempbx = push2; /* p bx temppush2 BPLVDEE  */
  782. tempcx = push1; /* pop cx temppush1 NPLVDES */
  783. push1 = (USHORT) (tempeax & 0xFFFF);
  784. if (!(SiS_VBInfo & SetInSlaveMode)) {
  785. if (SiS_LCDResInfo == Panel800x600) {
  786. if (resinfo == 7)
  787. tempcx++;
  788. } else {
  789. if (SiS_LCDResInfo == Panel1024x768) {
  790. if (resinfo == 8)
  791. tempcx++;
  792. }
  793. }
  794. }
  795. temp = (tempbx & 0xFF00) >> 8;
  796. temp = temp & 0x07;
  797. temp = temp << 3;
  798. temp = temp | (((tempcx & 0xFF00) >> 8) & 0x07);
  799. SiS_SetReg1 (SiS_Part1Port, 0x1D, temp); /* Part1_1Dh */
  800. temp = tempbx & 0x00FF;
  801. SiS_SetReg1 (SiS_Part1Port, 0x1C, temp); /* Part1_1Ch  */
  802. temp = tempcx & 0x00FF;
  803. SiS_SetReg1 (SiS_Part1Port, 0x1B, temp); /* Part1_1Bh  */
  804. tempecx = SiS_VGAHDE;
  805. tempebx = SiS_HDE;
  806. tempeax = tempecx;
  807. tempeax = tempeax << 6;
  808. tempeax = tempeax << 10;
  809. tempeax = tempeax / tempebx;
  810. if (tempebx == tempecx) {
  811. tempeax = 65535;
  812. }
  813. tempecx = tempeax;
  814. tempeax = SiS_VGAHDE; /*change VGAHT->VGAHDE */
  815. tempeax = tempeax << 6;
  816. tempeax = tempeax << 10;
  817. tempeax = tempeax / tempecx;
  818. tempecx = tempecx << 16;
  819. tempeax = tempeax - 1;
  820. tempecx = tempecx | (tempeax & 0x00FFFF);
  821. temp = (USHORT) (tempecx & 0x00FF);
  822. SiS_SetReg1 (SiS_Part1Port, 0x1F, temp); /* Part1_1Fh  */
  823. tempeax = SiS_VGAVDE;
  824. tempeax = tempeax << 18; /*301b */
  825. tempeax = tempeax / tempvcfact;
  826. tempbx = (USHORT) (tempeax & 0x0FFFF);
  827. if (SiS_LCDResInfo == Panel1024x768)
  828. tempbx--;
  829. if (SiS_SetFlag & EnableLVDSDDA) {
  830. tempbx = 1;
  831. }
  832. temp = ((tempbx & 0xFF00) >> 8) << 3;
  833. temp = temp | (USHORT) (((tempecx & 0x0000FF00) >> 8) & 0x07);
  834. SiS_SetReg1 (SiS_Part1Port, 0x20, temp); /* Part1_20h */
  835. temp = tempbx & 0x00FF;
  836. SiS_SetReg1 (SiS_Part1Port, 0x21, temp); /* Part1_21h */
  837. tempecx = tempecx >> 16; /* BPLHCFACT  */
  838. if (modeflag & HalfDCLK) {
  839. tempecx = tempecx >> 1;
  840. }
  841. temp = (USHORT) ((tempecx & 0x0000FF00) >> 8);
  842. SiS_SetReg1 (SiS_Part1Port, 0x22, temp); /* Part1_22h */
  843. temp = (USHORT) (tempecx & 0x000000FF);
  844. SiS_SetReg1 (SiS_Part1Port, 0x23, temp);
  845. /*add dstn new register */
  846. if (SiS_IF_DEF_DSTN) {
  847. SiS_SetReg1 (SiS_Part1Port, 0x1E, 0x01);
  848. SiS_SetReg1 (SiS_Part1Port, 0x25, 0x00);
  849. SiS_SetReg1 (SiS_Part1Port, 0x26, 0x00);
  850. SiS_SetReg1 (SiS_Part1Port, 0x27, 0x00);
  851. SiS_SetReg1 (SiS_Part1Port, 0x28, 0x87);
  852. SiS_SetReg1 (SiS_Part1Port, 0x29, 0x5A);
  853. SiS_SetReg1 (SiS_Part1Port, 0x2A, 0x4B);
  854. SiS_SetRegANDOR (SiS_Part1Port, 0x44, ~0x007, 0x03);
  855. tempbx = SiS_HDE; /*Blps=lcdhdee(lcdhdes+HDE) +64 */
  856. tempbx = tempbx + 64;
  857. temp = tempbx & 0x00FF;
  858. SiS_SetReg1 (SiS_Part1Port, 0x38, temp);
  859. temp = ((tempbx & 0xFF00) >> 8) << 3;
  860. SiS_SetRegANDOR (SiS_Part1Port, 0x35, ~0x078, temp);
  861. tempbx = tempbx + 32; /*Blpe=lBlps+32 */
  862. temp = tempbx & 0x00FF;
  863. SiS_SetReg1 (SiS_Part1Port, 0x39, temp);
  864. SiS_SetReg1 (SiS_Part1Port, 0x3A, 0x00); /*Bflml=0 */
  865. SiS_SetRegANDOR (SiS_Part1Port, 0x3C, ~0x007, 0x00);
  866. tempbx = SiS_VDE;
  867. tempbx = tempbx / 2;
  868. temp = tempbx & 0x00FF;
  869. SiS_SetReg1 (SiS_Part1Port, 0x3B, temp);
  870. temp = ((tempbx & 0xFF00) >> 8) << 3;
  871. SiS_SetRegANDOR (SiS_Part1Port, 0x3C, ~0x038, temp);
  872. tempeax = SiS_HDE; /* BDxFIFOSTOP= (HDE*4)/128 */
  873. tempeax = tempeax * 4;
  874. tempebx = 128;
  875. temp = (USHORT) (tempeax % tempebx);
  876. tempeax = tempeax / tempebx;
  877. if (temp != 0) {
  878. tempeax++;
  879. }
  880. temp = (USHORT) (tempeax & 0x0000003F);
  881. SiS_SetRegANDOR (SiS_Part1Port, 0x45, ~0x0FF, temp);
  882. SiS_SetReg1 (SiS_Part1Port, 0x3F, 0x00); /*BDxWadrst0 */
  883. SiS_SetReg1 (SiS_Part1Port, 0x3E, 0x00);
  884. SiS_SetReg1 (SiS_Part1Port, 0x3D, 0x10);
  885. SiS_SetRegANDOR (SiS_Part1Port, 0x3C, ~0x040, 0x00);
  886. tempax = SiS_HDE;
  887. tempax = tempax >> 4; /*BDxWadroff = HDE*4/8/8  */
  888. pushcx = tempax;
  889. temp = tempax & 0x00FF;
  890. SiS_SetReg1 (SiS_Part1Port, 0x43, temp);
  891. temp = ((tempax & 0xFF00) >> 8) << 3;
  892. SiS_SetRegANDOR (SiS_Part1Port, 0x44, ~0x0F8, temp);
  893. tempax = SiS_VDE; /*BDxWadrst1 = BDxWadrst0+BDxWadroff*VDE */
  894. tempeax = (tempax * pushcx);
  895. tempebx = 0x00100000 + tempeax;
  896. temp = (USHORT) tempebx & 0x000000FF;
  897. SiS_SetReg1 (SiS_Part1Port, 0x42, temp);
  898. temp = (USHORT) ((tempebx & 0x0000FF00) >> 8);
  899. SiS_SetReg1 (SiS_Part1Port, 0x41, temp);
  900. temp = (USHORT) ((tempebx & 0x00FF0000) >> 16);
  901. SiS_SetReg1 (SiS_Part1Port, 0x40, temp);
  902. temp = (USHORT) ((tempebx & 0x01000000) >> 24);
  903. temp = temp << 7;
  904. SiS_SetRegANDOR (SiS_Part1Port, 0x3C, ~0x080, temp);
  905. SiS_SetReg1 (SiS_Part1Port, 0x2F, 0x03);
  906. SiS_SetReg1 (SiS_Part1Port, 0x03, 0x50);
  907. SiS_SetReg1 (SiS_Part1Port, 0x04, 0x00);
  908. SiS_SetReg1 (SiS_Part1Port, 0x2F, 0x01);
  909. SiS_SetReg1 (SiS_Part1Port, 0x13, 0x00);
  910. SiS_SetReg1 (SiS_P3c4, 0x05, 0x86);
  911. SiS_SetReg1 (SiS_P3c4, 0x1e, 0x62);
  912. SiS_SetReg1 (SiS_Part1Port, 0x19, 0x38);
  913. SiS_SetReg1 (SiS_Part1Port, 0x1e, 0x7d);
  914. }
  915. /*end add dstn */
  916. return;
  917. }
  918. /*301b*/
  919. void
  920. SiS_SetGroup1_LCDA (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
  921.     USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,
  922.     USHORT RefreshRateTableIndex)
  923. {
  924. USHORT modeflag, resinfo;
  925. USHORT push1, push2, tempax, tempbx, tempcx, temp;
  926. ULONG tempeax = 0, tempebx, tempecx, tempvcfact; /*301b */
  927. SiS_SetRegOR (SiS_Part1Port, 0x2D, 0x20);
  928. if (ModeNo <= 0x13) {
  929. modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
  930. resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
  931. } else {
  932. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
  933. resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
  934. }
  935. tempax = SiS_LCDHDES;
  936. tempbx = SiS_HDE;
  937. tempcx = SiS_HT;
  938. if (SiS_LCDInfo & LCDNonExpanding) {
  939. if (SiS_LCDResInfo == Panel1280x1024)
  940. tempbx = 1280;
  941. if (SiS_LCDResInfo == Panel1024x768)
  942. tempbx = 1024;
  943. }
  944. tempcx = tempcx - tempbx; /* HT-HDE  */
  945. push1 = tempax;
  946. tempax = tempax + tempbx; /* lcdhdee  */
  947. tempbx = SiS_HT;
  948. if (tempax >= tempbx) {
  949. tempax = tempax - tempbx;
  950. }
  951. push2 = tempax;
  952. /* push ax   lcdhdee  */
  953. tempcx = tempcx >> 2; /* temp  */
  954. tempcx = tempcx + tempax; /* lcdhrs  */
  955. if (tempcx >= tempbx) {
  956. tempcx = tempcx - tempbx;
  957. }
  958. /* v ah,cl  */
  959. tempax = tempcx;
  960. tempax = tempax >> 3; /* BPLHRS */
  961. temp = tempax & 0x00FF;
  962. SiS_SetReg1 (SiS_Part1Port, 0x14, temp); /* Part1_14h  */
  963. temp = (tempax & 0x00FF) + 10;
  964. temp = temp & 0x01F;
  965. temp = temp | (((tempcx & 0x00ff) & 0x07) << 5);
  966. SiS_SetReg1 (SiS_Part1Port, 0x15, temp); /* Part1_15h  */
  967. tempbx = push2; /* lcdhdee  */
  968. tempcx = push1; /* lcdhdes  */
  969. temp = (tempcx & 0x00FF);
  970. temp = temp & 0x07; /* BPLHDESKEW  */
  971. SiS_SetReg1 (SiS_Part1Port, 0x1A, temp); /* Part1_1Ah  */
  972. tempcx = tempcx >> 3; /* BPLHDES */
  973. temp = (tempcx & 0x00FF);
  974. SiS_SetReg1 (SiS_Part1Port, 0x16, temp); /* Part1_16h  */
  975. if (tempbx & 0x07)
  976. tempbx = tempbx + 8;
  977. tempbx = tempbx >> 3; /* BPLHDEE  */
  978. temp = tempbx & 0x00FF;
  979. SiS_SetReg1 (SiS_Part1Port, 0x17, temp); /* Part1_17h  */
  980. tempcx = SiS_VGAVT;
  981. tempbx = SiS_VGAVDE;
  982. tempcx = tempcx - tempbx; /* GAVT-VGAVDE  */
  983. tempbx = SiS_LCDVDES; /* VGAVDES  */
  984. push1 = tempbx; /* push bx temppush1 */
  985. if (SiS_IF_DEF_TRUMPION == 0) {
  986. if (SiS_IF_DEF_CH7005 == 1) {
  987. if (SiS_VBInfo & SetCRT2ToTV) {
  988. tempax = SiS_VGAVDE;
  989. }
  990. }
  991. if (SiS_LCDResInfo == Panel1024x768)
  992. tempax = 768;
  993. if (SiS_LCDResInfo == Panel1280x1024)
  994. tempax = 1024;
  995. } else
  996. tempax = SiS_VGAVDE;
  997. tempbx = tempbx + tempax;
  998. tempax = SiS_VT; /* VT  */
  999. if (tempbx >= SiS_VT) {
  1000. tempbx = tempbx - tempax;
  1001. }
  1002. push2 = tempbx; /* push bx  temppush2  */
  1003. tempcx = tempcx >> 1;
  1004. tempbx = tempbx + tempcx;
  1005. tempbx++; /* BPLVRS  */
  1006. if (tempbx >= tempax) {
  1007. tempbx = tempbx - tempax;
  1008. }
  1009. temp = tempbx & 0x00FF;
  1010. SiS_SetReg1 (SiS_Part1Port, 0x18, temp); /* Part1_18h  */
  1011. tempcx = tempcx >> 3;
  1012. tempcx = tempcx + tempbx;
  1013. tempcx++; /* BPLVRE  */
  1014. temp = tempcx & 0x00FF;
  1015. temp = temp & 0x0F;
  1016. SiS_SetRegANDOR (SiS_Part1Port, 0x19, ~0x00F, temp); /* Part1_19h  */
  1017. temp = (tempbx & 0xFF00) >> 8;
  1018. temp = temp & 0x07;
  1019. temp = temp << 3; /* BPLDESKEW =0 */
  1020. tempbx = SiS_VGAVDE;
  1021. if (tempbx != SiS_VDE) {
  1022. temp = temp | 0x40;
  1023. }
  1024. if (SiS_SetFlag & EnableLVDSDDA) {
  1025. temp = temp | 0x40;
  1026. }
  1027. if (SiS_LCDInfo & LCDRGB18Bit) {
  1028. temp = temp | 0x80;
  1029. }
  1030. SiS_SetRegANDOR (SiS_Part1Port, 0x1A, 0x07, temp); /* Part1_1Ah */
  1031. tempbx = push2; /* p bx temppush2 BPLVDEE  */
  1032. tempcx = push1; /* pop cx temppush1 NPLVDES */
  1033. push1 = (USHORT) (tempeax & 0xFFFF);
  1034. if (!(SiS_VBInfo & SetInSlaveMode)) {
  1035. if (SiS_LCDResInfo == Panel800x600) {
  1036. if (resinfo == 7)
  1037. tempcx++;
  1038. } else {
  1039. if (SiS_LCDResInfo == Panel1024x768) {
  1040. if (resinfo == 8)
  1041. tempcx++;
  1042. }
  1043. }
  1044. }
  1045. temp = (tempbx & 0xFF00) >> 8;
  1046. temp = temp & 0x07;
  1047. temp = temp << 3;
  1048. temp = temp | (((tempcx & 0xFF00) >> 8) & 0x07);
  1049. SiS_SetReg1 (SiS_Part1Port, 0x1D, temp); /* Part1_1Dh */
  1050. temp = tempbx & 0x00FF;
  1051. SiS_SetReg1 (SiS_Part1Port, 0x1C, temp); /* Part1_1Ch  */
  1052. temp = tempcx & 0x00FF;
  1053. SiS_SetReg1 (SiS_Part1Port, 0x1B, temp); /* Part1_1Bh  */
  1054. tempecx = SiS_VGAVT;
  1055. tempebx = SiS_VDE;
  1056. tempeax = SiS_VGAVDE;
  1057. tempecx = tempecx - tempeax; /* VGAVT-VGAVDE  */
  1058. tempeax = tempeax << 18;
  1059. temp = (USHORT) (tempeax % tempebx);
  1060. tempeax = tempeax / tempebx;
  1061. if (temp != 0) {
  1062. tempeax++;
  1063. }
  1064. tempebx = tempeax; /* BPLVCFACT  */
  1065. tempvcfact = tempeax; /*301b */
  1066. temp = (USHORT) (tempebx & 0x00FF);
  1067. SiS_SetReg1 (SiS_Part1Port, 0x37, temp);
  1068. temp = (USHORT) ((tempebx & 0x00FF00) >> 8);
  1069. SiS_SetReg1 (SiS_Part1Port, 0x36, temp);
  1070. temp = (USHORT) ((tempebx & 0x00030000) >> 16);
  1071. if (SiS_VDE == SiS_VGAVDE) {
  1072. temp = temp | 0x04;
  1073. }
  1074. SiS_SetReg1 (SiS_Part1Port, 0x35, temp);
  1075. tempecx = SiS_VGAHDE;
  1076. tempebx = SiS_HDE;
  1077. tempeax = tempecx;
  1078. tempeax = tempeax << 6;
  1079. tempeax = tempeax << 10;
  1080. tempeax = tempeax / tempebx;
  1081. if (tempebx == tempecx) {
  1082. tempeax = 65535;
  1083. }
  1084. tempecx = tempeax;
  1085. tempeax = SiS_VGAHDE; /*301b to change HT->HDE */
  1086. tempeax = tempeax << 6;
  1087. tempeax = tempeax << 10;
  1088. tempeax = tempeax / tempecx;
  1089. tempecx = tempecx << 16;
  1090. tempeax = tempeax - 1;
  1091. tempecx = tempecx | (tempeax & 0x00FFFF);
  1092. temp = (USHORT) (tempecx & 0x00FF);
  1093. SiS_SetReg1 (SiS_Part1Port, 0x1F, temp); /* Part1_1Fh  */
  1094. tempeax = SiS_VGAVDE;
  1095. tempeax = tempeax << 18; /*301b */
  1096. tempeax = tempeax / tempvcfact;
  1097. tempbx = (USHORT) (tempeax & 0x0FFFF);
  1098. if (SiS_LCDResInfo == Panel1024x768)
  1099. tempbx--;
  1100. if (SiS_SetFlag & EnableLVDSDDA) {
  1101. tempbx = 1;
  1102. }
  1103. temp = ((tempbx & 0xFF00) >> 8) << 3;
  1104. temp = temp | (USHORT) (((tempecx & 0x0000FF00) >> 8) & 0x07);
  1105. SiS_SetReg1 (SiS_Part1Port, 0x20, temp); /* Part1_20h */
  1106. temp = tempbx & 0x00FF;
  1107. SiS_SetReg1 (SiS_Part1Port, 0x21, temp); /* Part1_21h */
  1108. tempecx = tempecx >> 16; /* BPLHCFACT  */
  1109. temp = (USHORT) ((tempecx & 0x0000FF00) >> 8);
  1110. SiS_SetReg1 (SiS_Part1Port, 0x22, temp); /* Part1_22h */
  1111. temp = (USHORT) (tempecx & 0x000000FF);
  1112. SiS_SetReg1 (SiS_Part1Port, 0x23, temp);
  1113. return;
  1114. }
  1115. /*end 301b*/
  1116. void
  1117. SiS_SetTPData ()
  1118. {
  1119. return;
  1120. }
  1121. void
  1122. SiS_SetCRT2Offset (USHORT SiS_Part1Port, ULONG ROMAddr, USHORT ModeNo,
  1123.    USHORT ModeIdIndex, USHORT RefreshRateTableIndex,
  1124.    PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1125. {
  1126. USHORT offset;
  1127. UCHAR temp;
  1128. if (SiS_VBInfo & SetInSlaveMode) {
  1129. return;
  1130. }
  1131. offset =
  1132.     SiS_GetOffset (ROMAddr, ModeNo, ModeIdIndex, RefreshRateTableIndex,
  1133.    HwDeviceExtension);
  1134. temp = (UCHAR) (offset & 0xFF);
  1135. SiS_SetReg1 (SiS_Part1Port, 0x07, temp);
  1136. temp = (UCHAR) ((offset & 0xFF00) >> 8);
  1137. SiS_SetReg1 (SiS_Part1Port, 0x09, temp);
  1138. temp = (UCHAR) (((offset >> 3) & 0xFF) + 1);
  1139. SiS_SetReg1 (SiS_Part1Port, 0x03, temp);
  1140. }
  1141. USHORT
  1142. SiS_GetOffset (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  1143.        USHORT RefreshRateTableIndex,
  1144.        PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1145. {
  1146. USHORT temp, colordepth;
  1147. USHORT modeinfo, index, infoflag;
  1148. USHORT ColorDepth[] = { 0x01, 0x02, 0x04 };
  1149. modeinfo = SiS_EModeIDTable[ModeIdIndex].Ext_ModeInfo;
  1150. infoflag = SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
  1151. if (HwDeviceExtension->jChipType < SIS_315H) { /* 300 series */
  1152. index = (modeinfo >> 4) & 0xFF;
  1153. } else { /* 310 series */
  1154. index = (modeinfo >> 8) & 0xFF;
  1155. }
  1156. temp = SiS_ScreenOffset[index];
  1157. if (infoflag & InterlaceMode) {
  1158. temp = temp << 1;
  1159. }
  1160. colordepth = SiS_GetColorDepth (ROMAddr, ModeNo, ModeIdIndex);
  1161. if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
  1162. temp = ModeNo - 0x7C;
  1163. colordepth = ColorDepth[temp];
  1164. temp = 0x6B;
  1165. if (infoflag & InterlaceMode) {
  1166. temp = temp << 1;
  1167. }
  1168. return (temp * colordepth);
  1169. } else
  1170. return (temp * colordepth);
  1171. }
  1172. USHORT
  1173. SiS_GetColorDepth (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
  1174. {
  1175. USHORT ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
  1176. SHORT index;
  1177. USHORT modeflag;
  1178. if (ModeNo <= 0x13) {
  1179. modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  1180. } else {
  1181. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  1182. }
  1183. index = (modeflag & ModeInfoFlag) - ModeEGA;
  1184. if (index < 0)
  1185. index = 0;
  1186. return (ColorDepth[index]);
  1187. }
  1188. void
  1189. SiS_SetCRT2Sync (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
  1190.  USHORT RefreshRateTableIndex)
  1191. {
  1192. USHORT tempah = 0, infoflag, flag;
  1193. flag = 0;
  1194. infoflag = SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
  1195. if (SiS_IF_DEF_LVDS == 1) {
  1196. if (SiS_VBInfo & SetCRT2ToLCD) {
  1197. tempah = SiS_LCDInfo;
  1198. if (tempah & LCDSync) {
  1199. flag = 1;
  1200. }
  1201. }
  1202. }
  1203. if (flag != 1)
  1204. tempah = infoflag >> 8;
  1205. tempah = tempah & 0xC0;
  1206. tempah = tempah | 0x20;
  1207. if (!(SiS_LCDInfo & LCDRGB18Bit))
  1208. tempah = tempah | 0x10;
  1209. if (SiS_IF_DEF_CH7005 == 1)
  1210. tempah = tempah | 0xC0;
  1211. SiS_SetRegANDOR (SiS_Part1Port, 0x19, 0x3F, tempah);
  1212. }
  1213. void
  1214. SiS_SetCRT2FIFO (USHORT SiS_Part1Port, ULONG ROMAddr, USHORT ModeNo,
  1215.  PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1216. {
  1217. USHORT temp, index;
  1218. USHORT modeidindex, refreshratetableindex;
  1219. USHORT VCLK, MCLK, colorth = 0, data, data2;
  1220. ULONG eax;
  1221. UCHAR LatencyFactor[] = { 97, 88, 86, 79, 77, 00, /*; 64  bit    BQ=2   */
  1222. 00, 87, 85, 78, 76, 54, /*; 64  bit    BQ=1   */
  1223. 97, 88, 86, 79, 77, 00, /*; 128 bit    BQ=2   */
  1224. 00, 79, 77, 70, 68, 48, /*; 128 bit    BQ=1   */
  1225. 80, 72, 69, 63, 61, 00, /*; 64  bit    BQ=2   */
  1226. 00, 70, 68, 61, 59, 37, /*; 64  bit    BQ=1   */
  1227. 86, 77, 75, 68, 66, 00, /*; 128 bit    BQ=2   */
  1228. 00, 68, 66, 59, 57, 37
  1229. }; /*; 128 bit    BQ=1   */
  1230. SiS_SearchModeID (ROMAddr, ModeNo, &modeidindex);
  1231. SiS_SetFlag = SiS_SetFlag & (~ProgrammingCRT2);
  1232. SiS_SelectCRT2Rate = 0;
  1233. refreshratetableindex = SiS_GetRatePtrCRT2 (ROMAddr, ModeNo, modeidindex); /* 11.GetRatePtr */
  1234. if (ModeNo >= 0x13) {
  1235. index = SiS_RefIndex[refreshratetableindex].Ext_CRTVCLK;
  1236. index = index & 0x3F;
  1237. VCLK = SiS_VCLKData[index].CLOCK; /* Get VCLK  */
  1238. index = SiS_GetReg1 (SiS_P3c4, 0x1A);
  1239. index = index & 07;
  1240. MCLK = SiS_MCLKData[index].CLOCK; /* Get MCLK  */
  1241. data2 = SiS_ModeType - 0x02;
  1242. switch (data2) {
  1243. case 0:
  1244. colorth = 1;
  1245. break;
  1246. case 1:
  1247. colorth = 1;
  1248. break;
  1249. case 2:
  1250. colorth = 2;
  1251. break;
  1252. case 3:
  1253. colorth = 2;
  1254. break;
  1255. case 4:
  1256. colorth = 3;
  1257. break;
  1258. case 5:
  1259. colorth = 4;
  1260. break;
  1261. }
  1262. data2 = (data2 * VCLK) / MCLK; /*  bx */
  1263. temp = SiS_GetReg1 (SiS_P3c4, 0x14);
  1264. temp = ((temp & 0x00FF) >> 6) << 1;
  1265. if (temp == 0)
  1266. temp = 1;
  1267. temp = temp << 2;
  1268. data2 = temp - data2;
  1269. if (data2 % (28 * 16)) {
  1270. data2 = data2 / (28 * 16);
  1271. data2++;
  1272. } else {
  1273. data2 = data2 / (28 * 16);
  1274. }
  1275. index = 0;
  1276. temp = SiS_GetReg1 (SiS_P3c4, 0x14);
  1277. if (temp & 0x0080)
  1278. index = index + 12;
  1279. SiS_SetReg4 (0xcf8, 0x800000A0);
  1280. eax = SiS_GetReg3 (0xcfc);
  1281. temp = (USHORT) (eax >> 24);
  1282. if (!(temp & 0x01))
  1283. index = index + 24;
  1284. SiS_SetReg4 (0xcf8, 0x80000050);
  1285. eax = SiS_GetReg3 (0xcfc);
  1286. temp = (USHORT) (eax >> 24);
  1287. if (temp & 0x01)
  1288. index = index + 6;
  1289. temp = (temp & 0x0F) >> 1;
  1290. index = index + temp;
  1291. data = LatencyFactor[index];
  1292. data = data + 15;
  1293. temp = SiS_GetReg1 (SiS_P3c4, 0x14);
  1294. if (!(temp & 0x80))
  1295. data = data + 5;
  1296. data = data + data2;
  1297. SiS_SetFlag = SiS_SetFlag | ProgrammingCRT2;
  1298. data = data * VCLK * colorth;
  1299. if (data % (MCLK << 4)) {
  1300. data = data / (MCLK << 4);
  1301. data++;
  1302. } else {
  1303. data = data / (MCLK << 4);
  1304. }
  1305. temp = 0x16;
  1306. /*  Revision ID  */
  1307. temp = 0x13;
  1308. /*  Revision ID  */
  1309. SiS_SetRegANDOR (SiS_Part1Port, 0x01, ~0x01F, temp);
  1310. SiS_SetRegANDOR (SiS_Part1Port, 0x02, ~0x01F, temp);
  1311. }
  1312. }
  1313. void
  1314. SiS_SetCRT2FIFO2 (USHORT SiS_Part1Port, ULONG ROMAddr, USHORT ModeNo,
  1315.   PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1316. {
  1317. #ifdef CONFIG_FB_SIS_315
  1318. UCHAR CombCode[] = { 1, 1, 1, 4, 3, 1, 3, 4, 4, 1, 4, 4, 5, 1, 5, 4 };
  1319. UCHAR CRT2ThLow[] =
  1320.     { 39, 63, 55, 79, 78, 102, 90, 114, 55, 87, 84, 116, 103, 135, 119,
  1321.     151 };
  1322. #endif
  1323. USHORT temp, temp1, temp2, temp3;
  1324. USHORT index;
  1325. USHORT CRT1ModeNo, CRT2ModeNo;
  1326. USHORT ModeIdIndex;
  1327. USHORT RefreshRateTableIndex;
  1328. SiS_SetReg1 (SiS_Part1Port, 0x1, 0x3B);
  1329. /* CRT1ModeNo=(UCHAR)SiS_GetReg1(SiS_P3d4,0x34); *//* get CRT1 ModeNo */
  1330. CRT1ModeNo = SiS_CRT1Mode;
  1331. /* CRT1ModeNo =ModeNo; */
  1332. SiS_SearchModeID (ROMAddr, CRT1ModeNo, &ModeIdIndex); /* Get ModeID Table */
  1333. SiS_SetFlag = SiS_SetFlag & (~ProgrammingCRT2);
  1334. RefreshRateTableIndex = SiS_GetRatePtrCRT2 (ROMAddr, CRT1ModeNo, ModeIdIndex); /* Set REFIndex-> for crt1 refreshrate */
  1335. index =
  1336.     SiS_GetVCLK2Ptr (ROMAddr, CRT1ModeNo, ModeIdIndex,
  1337.      RefreshRateTableIndex, HwDeviceExtension);
  1338. temp1 = SiS_VCLKData[index].CLOCK; /* Get VCLK  */
  1339. temp2 = SiS_GetColorDepth (ROMAddr, CRT1ModeNo, ModeIdIndex);
  1340. #ifdef CONFIG_FB_SIS_315
  1341. index = SiS_Get310DRAMType (ROMAddr);
  1342. #endif
  1343. temp3 = SiS_MCLKData[index].CLOCK; /* Get MCLK  */
  1344. temp = SiS_GetReg1 (SiS_P3c4, 0x14);
  1345. if (temp & 0x02)
  1346. temp = 16;
  1347. else
  1348. temp = 8;
  1349. temp = temp - temp1 * temp2 / temp3; /* 16-DRamBus - DCLK*BytePerPixel/MCLK */
  1350. if ((52 * 16 % temp) == 0)
  1351. temp = 52 * 16 / temp + 40;
  1352. else
  1353. temp = 52 * 16 / temp + 40 + 1;
  1354. /* get DRAM latency */
  1355. temp1 = (SiS_GetReg1 (SiS_P3c4, 0x17) >> 3) & 0x7; /* SR17[5:3] DRAM Queue depth */
  1356. temp2 = (SiS_GetReg1 (SiS_P3c4, 0x17) >> 6) & 0x3; /* SR17[7:6] DRAM Grant length */
  1357. #ifdef CONFIG_FB_SIS_315
  1358. if (SiS_Get310DRAMType (ROMAddr) < 2) {
  1359. for (temp3 = 0; temp3 < 16; temp3 += 2) {
  1360. if ((CombCode[temp3] == temp1)
  1361.     && (CombCode[temp3 + 1] == temp2)) {
  1362. temp3 = CRT2ThLow[temp3 >> 1];
  1363. }
  1364. }
  1365. } else {
  1366. for (temp3 = 0; temp3 < 16; temp3 += 2) {
  1367. if ((CombCode[temp3] == temp1)
  1368.     && (CombCode[temp3 + 1] == temp2)) {
  1369. temp3 = CRT2ThLow[8 + (temp3 >> 1)];
  1370. }
  1371. }
  1372. }
  1373. #endif
  1374. temp += temp3; /* CRT1 Request Period */
  1375. CRT2ModeNo = ModeNo; /* get CRT2 ModeNo */
  1376. SiS_SearchModeID (ROMAddr, CRT2ModeNo, &ModeIdIndex); /* Get ModeID Table */
  1377. SiS_SetFlag = SiS_SetFlag | ProgrammingCRT2;
  1378. RefreshRateTableIndex = SiS_GetRatePtrCRT2 (ROMAddr, CRT1ModeNo, ModeIdIndex); /* Set REFIndex-> for crt1 refreshrate */
  1379. index =
  1380.     SiS_GetVCLK2Ptr (ROMAddr, CRT2ModeNo, ModeIdIndex,
  1381.      RefreshRateTableIndex, HwDeviceExtension);
  1382. temp1 = SiS_VCLKData[index].CLOCK; /* Get VCLK  */
  1383. temp2 = SiS_GetColorDepth (ROMAddr, CRT2ModeNo, ModeIdIndex);
  1384. #ifdef CONFIG_FB_SIS_315
  1385. index = SiS_Get310DRAMType (ROMAddr);
  1386. #endif
  1387. temp3 = SiS_MCLKData[index].CLOCK; /* Get MCLK  */
  1388. if ((temp * temp1 * temp2) % (16 * temp3) == 0)
  1389. temp = temp * temp1 * temp2 / (16 * temp3); /* CRT1 Request period * TCLK*BytePerPixel/(MCLK*16) */
  1390. else
  1391. temp = temp * temp1 * temp2 / (16 * temp3) + 1; /* CRT1 Request period * TCLK*BytePerPixel/(MCLK*16) */
  1392. if (temp > 0x37)
  1393. temp = 0x37;
  1394. SiS_SetRegANDOR (SiS_Part1Port, 0x02, ~0x3F, temp);
  1395. }
  1396. void
  1397. SiS_GetLVDSDesData (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  1398.     USHORT RefreshRateTableIndex)
  1399. {
  1400. USHORT modeflag;
  1401. USHORT PanelIndex, ResIndex;
  1402. SiS_LVDSDesStruct *PanelDesPtr = NULL;
  1403. if ((SiS_IF_DEF_LVDS == 0)
  1404.     && ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) { /*301b *//*for test */
  1405. SiS_GetLVDSDesPtrA (ROMAddr, ModeNo, ModeIdIndex,
  1406.     RefreshRateTableIndex, &PanelIndex,
  1407.     &ResIndex);
  1408. switch (PanelIndex) {
  1409. case 0:
  1410. PanelDesPtr = LVDS1024x768Des_1;
  1411. break;
  1412. case 1:
  1413. PanelDesPtr = LVDS1280x1024Des_1;
  1414. break;
  1415. case 2:
  1416. PanelDesPtr = LVDS1280x960Des_1;
  1417. break;
  1418. case 3:
  1419. PanelDesPtr = LVDS1024x768Des_2;
  1420. break;
  1421. case 4:
  1422. PanelDesPtr = LVDS1280x1024Des_2;
  1423. break;
  1424. case 5:
  1425. PanelDesPtr = LVDS1280x960Des_2;
  1426. break;
  1427. }
  1428. } else {
  1429. SiS_GetLVDSDesPtr (ROMAddr, ModeNo, ModeIdIndex,
  1430.    RefreshRateTableIndex, &PanelIndex,
  1431.    &ResIndex);
  1432. switch (PanelIndex) {
  1433. case 0:
  1434. PanelDesPtr = SiS_PanelType00_1;
  1435. break;
  1436. case 1:
  1437. PanelDesPtr = SiS_PanelType01_1;
  1438. break;
  1439. case 2:
  1440. PanelDesPtr = SiS_PanelType02_1;
  1441. break;
  1442. case 3:
  1443. PanelDesPtr = SiS_PanelType03_1;
  1444. break;
  1445. case 4:
  1446. PanelDesPtr = SiS_PanelType04_1;
  1447. break;
  1448. case 5:
  1449. PanelDesPtr = SiS_PanelType05_1;
  1450. break;
  1451. case 6:
  1452. PanelDesPtr = SiS_PanelType06_1;
  1453. break;
  1454. case 7:
  1455. PanelDesPtr = SiS_PanelType07_1;
  1456. break;
  1457. case 8:
  1458. PanelDesPtr = SiS_PanelType08_1;
  1459. break;
  1460. case 9:
  1461. PanelDesPtr = SiS_PanelType09_1;
  1462. break;
  1463. case 10:
  1464. PanelDesPtr = SiS_PanelType0a_1;
  1465. break;
  1466. case 11:
  1467. PanelDesPtr = SiS_PanelType0b_1;
  1468. break;
  1469. case 12:
  1470. PanelDesPtr = SiS_PanelType0c_1;
  1471. break;
  1472. case 13:
  1473. PanelDesPtr = SiS_PanelType0d_1;
  1474. break;
  1475. case 14:
  1476. PanelDesPtr = SiS_PanelType0e_1;
  1477. break;
  1478. case 15:
  1479. PanelDesPtr = SiS_PanelType0f_1;
  1480. break;
  1481. case 16:
  1482. PanelDesPtr = SiS_PanelType00_2;
  1483. break;
  1484. case 17:
  1485. PanelDesPtr = SiS_PanelType01_2;
  1486. break;
  1487. case 18:
  1488. PanelDesPtr = SiS_PanelType02_2;
  1489. break;
  1490. case 19:
  1491. PanelDesPtr = SiS_PanelType03_2;
  1492. break;
  1493. case 20:
  1494. PanelDesPtr = SiS_PanelType04_2;
  1495. break;
  1496. case 21:
  1497. PanelDesPtr = SiS_PanelType05_2;
  1498. break;
  1499. case 22:
  1500. PanelDesPtr = SiS_PanelType06_2;
  1501. break;
  1502. case 23:
  1503. PanelDesPtr = SiS_PanelType07_2;
  1504. break;
  1505. case 24:
  1506. PanelDesPtr = SiS_PanelType08_2;
  1507. break;
  1508. case 25:
  1509. PanelDesPtr = SiS_PanelType09_2;
  1510. break;
  1511. case 26:
  1512. PanelDesPtr = SiS_PanelType0a_2;
  1513. break;
  1514. case 27:
  1515. PanelDesPtr = SiS_PanelType0b_2;
  1516. break;
  1517. case 28:
  1518. PanelDesPtr = SiS_PanelType0c_2;
  1519. break;
  1520. case 29:
  1521. PanelDesPtr = SiS_PanelType0d_2;
  1522. break;
  1523. case 30:
  1524. PanelDesPtr = SiS_PanelType0e_2;
  1525. break;
  1526. case 31:
  1527. PanelDesPtr = SiS_PanelType0f_2;
  1528. break;
  1529. case 32:
  1530. PanelDesPtr = SiS_CHTVUNTSCDesData;
  1531. break;
  1532. case 33:
  1533. PanelDesPtr = SiS_CHTVONTSCDesData;
  1534. break;
  1535. case 34:
  1536. PanelDesPtr = SiS_CHTVUPALDesData;
  1537. break;
  1538. case 35:
  1539. PanelDesPtr = SiS_CHTVOPALDesData;
  1540. break;
  1541. }
  1542. }
  1543. SiS_LCDHDES = (PanelDesPtr + ResIndex)->LCDHDES;
  1544. SiS_LCDVDES = (PanelDesPtr + ResIndex)->LCDVDES;
  1545. if (SiS_LCDInfo & LCDNonExpanding) {
  1546. if (SiS_LCDResInfo >= Panel1024x768) {
  1547. if (ModeNo <= 0x13) {
  1548. modeflag =
  1549.     SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  1550. if (!(modeflag & HalfDCLK)) {
  1551. SiS_LCDHDES = 320;
  1552. }
  1553. }
  1554. }
  1555. }
  1556. return;
  1557. }
  1558. void
  1559. SiS_GetLVDSDesPtr (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  1560.    USHORT RefreshRateTableIndex, USHORT * PanelIndex,
  1561.    USHORT * ResIndex)
  1562. {
  1563. USHORT tempbx, tempal;
  1564. tempbx = 0;
  1565. if (SiS_IF_DEF_CH7005 == 1) {
  1566. if (!(SiS_VBInfo & SetCRT2ToLCD)) {
  1567. tempbx = 32;
  1568. if (SiS_VBInfo & SetPALTV)
  1569. tempbx = tempbx + 2;
  1570. if (SiS_VBInfo & SetCHTVOverScan)
  1571. tempbx = tempbx + 1;
  1572. }
  1573. }
  1574. if (SiS_VBInfo & SetCRT2ToLCD) {
  1575. tempbx = SiS_LCDTypeInfo;
  1576. if (SiS_LCDInfo & LCDNonExpanding) {
  1577. tempbx = tempbx + 16;
  1578. }
  1579. }
  1580. if (ModeNo <= 0x13) {
  1581. tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
  1582. } else {
  1583. tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
  1584. }
  1585. tempal = tempal & 0x1F;
  1586. *PanelIndex = tempbx;
  1587. *ResIndex = tempal;
  1588. }
  1589. /*301b*/
  1590. void
  1591. SiS_GetLVDSDesPtrA (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  1592.     USHORT RefreshRateTableIndex, USHORT * PanelIndex,
  1593.     USHORT * ResIndex)
  1594. {
  1595. USHORT tempbx, tempal;
  1596. tempbx = 0;
  1597. tempbx = SiS_LCDResInfo;
  1598. tempbx = tempbx - Panel1024x768;
  1599. if (SiS_LCDInfo & LCDNonExpanding) {
  1600. tempbx = tempbx + 3;
  1601. }
  1602. if (ModeNo <= 0x13) {
  1603. tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
  1604. } else {
  1605. tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
  1606. }
  1607. tempal = tempal & 0x1F;
  1608. *PanelIndex = tempbx;
  1609. *ResIndex = tempal;
  1610. }
  1611. /*end 301b*/
  1612. void
  1613. SiS_SetCRT2ModeRegs (USHORT BaseAddr, USHORT ModeNo,
  1614.      PSIS_HW_DEVICE_INFO HwDeviceExtension)
  1615. {
  1616. USHORT i, j;
  1617. USHORT tempcl, tempah;
  1618. /*301b*/
  1619. if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
  1620.     && (SiS_VBInfo & SetCRT2ToLCDA)) {
  1621. SiS_SetRegANDOR (SiS_Part1Port, 0x00, ~0x050, 0x40);
  1622. SiS_SetRegAND (SiS_Part1Port, 0x2E, 0xF7);
  1623. SiS_SetRegANDOR (SiS_Part1Port, 0x13, 0xFB, 0x04);
  1624. SiS_SetRegANDOR (SiS_Part1Port, 0x2c, 0xCF, 0x30);
  1625. SiS_SetRegANDOR (SiS_Part4Port, 0x21, 0x3F, 0xC0);
  1626. SiS_SetRegANDOR (SiS_Part4Port, 0x23, 0x7F, 0x00);
  1627. }
  1628. /*end 301b */
  1629. else {
  1630. for (i = 0, j = 4; i < 3; i++, j++)
  1631. SiS_SetReg1 (SiS_Part1Port, j, 0);
  1632. tempcl = SiS_ModeType;
  1633. if (HwDeviceExtension->jChipType < SIS_315H) { /* 300 series */
  1634. if (ModeNo > 0x13) {
  1635. tempcl = tempcl - ModeVGA;
  1636. if ((tempcl > 0) || (tempcl == 0)) {
  1637. tempah = ((0x010 >> tempcl) | 0x080);
  1638. }
  1639. } else {
  1640. tempah = 0x080;
  1641. }
  1642. if (SiS_VBInfo & SetInSlaveMode) {
  1643. tempah = (tempah ^ 0x0A0);
  1644. }
  1645. } else { /* 310 series */
  1646. if (ModeNo > 0x13) {
  1647. tempcl = tempcl - ModeVGA;
  1648. if ((tempcl > 0) || (tempcl == 0)) {
  1649. tempah = (0x008 >> tempcl);
  1650. if (tempah == 0)
  1651. tempah = 1;
  1652. tempah |= 0x040;
  1653. }
  1654. } else {
  1655. tempah = 0x040;
  1656. }
  1657. if (SiS_VBInfo & SetInSlaveMode) {
  1658. tempah = (tempah ^ 0x050);
  1659. }
  1660. }
  1661. if (SiS_VBInfo & CRT2DisplayFlag) {
  1662. tempah = 0;
  1663. }
  1664. SiS_SetReg1 (SiS_Part1Port, 0x00, tempah);
  1665. if (SiS_IF_DEF_LVDS == 0) { /* ifdef 301 */
  1666. tempah = 0x01;
  1667. if (!(SiS_VBInfo & SetInSlaveMode)) {
  1668. tempah = (tempah | 0x02);
  1669. }
  1670. if (!(SiS_VBInfo & SetCRT2ToRAMDAC)) {
  1671. tempah = (tempah ^ 0x05);
  1672. if (!(SiS_VBInfo & SetCRT2ToLCD)) {
  1673. tempah = (tempah ^ 0x01);
  1674. }
  1675. }
  1676. tempcl = tempah; /* 05/03/01 ynlai for TV display bug */
  1677. if (HwDeviceExtension->jChipType < SIS_315H) { /* 300 series */
  1678. tempah = (tempah << 5) & 0xFF;
  1679. if (SiS_VBInfo & CRT2DisplayFlag) {
  1680. tempah = 0;
  1681. }
  1682. SiS_SetReg1 (SiS_Part1Port, 0x01, tempah);
  1683. tempah = tempah >> 5;
  1684. } else { /* 310 series */
  1685. if (SiS_VBInfo & CRT2DisplayFlag) {
  1686. tempah = 0;
  1687. }
  1688. tempah =
  1689.     (SiS_GetReg1 (SiS_Part1Port, 0x2E) & 0xF8) |
  1690.     tempah;
  1691. SiS_SetReg1 (SiS_Part1Port, 0x2E, tempah);
  1692. tempah = tempcl;
  1693. }
  1694. if ((SiS_ModeType == ModeVGA)
  1695.     && (!(SiS_VBInfo & SetInSlaveMode))) {
  1696. tempah = tempah | 0x010;
  1697. }
  1698. if (SiS_LCDResInfo == Panel1024x768)
  1699. tempah = tempah | 0x080;
  1700. if ((SiS_LCDResInfo == Panel1280x1024)
  1701.     || (SiS_LCDResInfo == Panel1280x960)) {
  1702. tempah = tempah | 0x080;
  1703. }
  1704. if (SiS_VBInfo & SetCRT2ToTV) {
  1705. if (SiS_VBInfo & SetInSlaveMode) {
  1706. if (
  1707.     ((SiS_VBType & VB_SIS301B)
  1708.      || (SiS_VBType & VB_SIS302B))) { /*301b */
  1709. if (SiS_SetFlag & TVSimuMode)
  1710. tempah = tempah | 0x020;
  1711. } else
  1712. tempah = tempah | 0x020;
  1713. }
  1714. }
  1715. SiS_SetRegANDOR (SiS_Part4Port, 0x0D, ~0x0BF, tempah);
  1716. tempah = 0;
  1717. if (SiS_VBInfo & SetCRT2ToTV) {
  1718. if (SiS_VBInfo & SetInSlaveMode) {
  1719. if (
  1720.     ((SiS_VBType & VB_SIS301B)
  1721.      || (SiS_VBType & VB_SIS302B))) { /*301b */
  1722. {
  1723. SiS_SetFlag =
  1724.     SiS_SetFlag |
  1725.     RPLLDIV2XO;
  1726. tempah = tempah | 0x40;
  1727. }
  1728. } else {
  1729. if (!(SiS_SetFlag & TVSimuMode)) {
  1730. if (!
  1731.     (SiS_VBInfo &
  1732.      SetCRT2ToHiVisionTV))
  1733. {
  1734. SiS_SetFlag =
  1735.     SiS_SetFlag
  1736.     |
  1737.     RPLLDIV2XO;
  1738. tempah =
  1739.     tempah |
  1740.     0x40;
  1741. }
  1742. }
  1743. }
  1744. } else {
  1745. SiS_SetFlag = SiS_SetFlag | RPLLDIV2XO;
  1746. tempah = tempah | 0x40;
  1747. }
  1748. }
  1749. if (SiS_LCDResInfo == Panel1280x1024)
  1750. tempah = tempah | 0x80;
  1751. if (SiS_LCDResInfo == Panel1280x960)
  1752. tempah = tempah | 0x80;
  1753. SiS_SetReg1 (SiS_Part4Port, 0x0C, tempah);
  1754. } else {
  1755. /*LVDS*/ tempah = 0;
  1756. if (!(SiS_VBInfo & SetInSlaveMode)) {
  1757. tempah = tempah | 0x02;
  1758. }
  1759. SiS_SetRegANDOR (SiS_Part1Port, 0x2e, 0xF0, tempah);
  1760. }
  1761. }
  1762. /*301b*/
  1763. if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
  1764.     && (!(SiS_VBInfo & SetCRT2ToLCDA))) {
  1765. if (SiS_IsDualEdge (BaseAddr))
  1766. SiS_SetRegANDOR (SiS_Part1Port, 0x13, 0xFB, 0x00);
  1767. else
  1768. SiS_SetRegANDOR (SiS_Part1Port, 0x13, 0xFF, 0x00);
  1769. if (SiS_IsDualEdge (BaseAddr))
  1770. SiS_SetRegANDOR (SiS_Part1Port, 0x2c, 0xCF, 0x00);
  1771. else
  1772. SiS_SetRegANDOR (SiS_Part1Port, 0x2c, 0xFF, 0x00);
  1773. if (SiS_IsDualEdge (BaseAddr))
  1774. SiS_SetRegANDOR (SiS_Part4Port, 0x21, 0x3F, 0x00);
  1775. else
  1776. SiS_SetRegANDOR (SiS_Part4Port, 0x21, 0xFF, 0x00);
  1777. if (SiS_IsDualEdge (BaseAddr))
  1778. SiS_SetRegANDOR (SiS_Part4Port, 0x23, 0xFF, 0x80);
  1779. else
  1780. SiS_SetRegANDOR (SiS_Part4Port, 0x23, 0xFF, 0x00);
  1781. }
  1782. /*end 301b*/
  1783. }
  1784. void
  1785. SiS_GetCRT2Data (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  1786.  USHORT RefreshRateTableIndex)
  1787. {
  1788. if (SiS_IF_DEF_LVDS == 0) { /*301  */
  1789. if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) {
  1790. if (SiS_VBInfo & SetCRT2ToLCDA)
  1791. SiS_GetCRT2DataLVDS (ROMAddr, ModeNo,
  1792.      ModeIdIndex,
  1793.      RefreshRateTableIndex);
  1794. else
  1795. SiS_GetCRT2Data301 (ROMAddr, ModeNo,
  1796.     ModeIdIndex,
  1797.     RefreshRateTableIndex);
  1798. } else
  1799. SiS_GetCRT2Data301 (ROMAddr, ModeNo, ModeIdIndex,
  1800.     RefreshRateTableIndex);
  1801. return;
  1802. } else { /*LVDS */
  1803. SiS_GetCRT2DataLVDS (ROMAddr, ModeNo, ModeIdIndex,
  1804.      RefreshRateTableIndex);
  1805. return;
  1806. }
  1807. }
  1808. void
  1809. SiS_GetCRT2DataLVDS (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  1810.      USHORT RefreshRateTableIndex)
  1811. {
  1812. USHORT tempax, tempbx;
  1813. USHORT CRT2Index, ResIndex;
  1814. SiS_LVDSDataStruct *LVDSData = NULL;
  1815. SiS_GetCRT2ResInfo (ROMAddr, ModeNo, ModeIdIndex);
  1816. /*301b */
  1817. if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
  1818.     && (SiS_VBInfo & SetCRT2ToLCDA)) {
  1819. SiS_GetCRT2PtrA (ROMAddr, ModeNo, ModeIdIndex,
  1820.  RefreshRateTableIndex, &CRT2Index, &ResIndex);
  1821. switch (CRT2Index) {
  1822. case 0:
  1823. LVDSData = SiS_LVDS1024x768Data_1;
  1824. break;
  1825. case 1:
  1826. LVDSData = SiS_LVDS1280x1024Data_1;
  1827. break;
  1828. case 2:
  1829. LVDSData = SiS_LVDS1280x1024Data_1;
  1830. break;
  1831. /*  case  2:  LVDSData=SiS_LVDS1280x960Data_1;  break; */
  1832. case 3:
  1833. LVDSData = SiS_LVDS1024x768Data_2;
  1834. break;
  1835. case 4:
  1836. LVDSData = SiS_LVDS1280x1024Data_2;
  1837. break;
  1838. case 5:
  1839. LVDSData = SiS_LVDS1280x1024Data_2;
  1840. break;
  1841. /*  case  5:  LVDSData=SiS_LVDS1280x960Data_2;  break; */
  1842. }
  1843. }
  1844. else {
  1845. SiS_GetCRT2Ptr (ROMAddr, ModeNo, ModeIdIndex,
  1846. RefreshRateTableIndex, &CRT2Index, &ResIndex);
  1847. switch (CRT2Index) {
  1848. case 0:
  1849. LVDSData = SiS_LVDS800x600Data_1;
  1850. break;
  1851. case 1:
  1852. LVDSData = SiS_LVDS1024x768Data_1;
  1853. break;
  1854. case 2:
  1855. LVDSData = SiS_LVDS1280x1024Data_1;
  1856. break;
  1857. case 3:
  1858. LVDSData = SiS_LVDS800x600Data_2;
  1859. break;
  1860. case 4:
  1861. LVDSData = SiS_LVDS1024x768Data_2;
  1862. break;
  1863. case 5:
  1864. LVDSData = SiS_LVDS1280x1024Data_2;
  1865. break;
  1866. case 6:
  1867. LVDSData = SiS_LVDS640x480Data_1;
  1868. break;
  1869. case 7:
  1870. LVDSData = SiS_CHTVUNTSCData;
  1871. break;
  1872. case 8:
  1873. LVDSData = SiS_CHTVONTSCData;
  1874. break;
  1875. case 9:
  1876. LVDSData = SiS_CHTVUPALData;
  1877. break;
  1878. case 10:
  1879. LVDSData = SiS_CHTVOPALData;
  1880. break;
  1881. }
  1882. }
  1883. SiS_VGAHT = (LVDSData + ResIndex)->VGAHT;
  1884. SiS_VGAVT = (LVDSData + ResIndex)->VGAVT;
  1885. SiS_HT = (LVDSData + ResIndex)->LCDHT;
  1886. SiS_VT = (LVDSData + ResIndex)->LCDVT;
  1887. /*301b*/
  1888. if ((SiS_IF_DEF_LVDS == 0)
  1889.     && ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))) { /*for test */
  1890. if (!(SiS_LCDInfo & LCDNonExpanding)) {
  1891. if (SiS_LCDResInfo == Panel1024x768) {
  1892. tempax = 1024;
  1893. tempbx = 768;
  1894. } else {
  1895. tempax = 1280;
  1896. tempbx = 1024;
  1897. }
  1898. SiS_HDE = tempax;
  1899. SiS_VDE = tempbx;
  1900. }
  1901. } else {
  1902. if (SiS_IF_DEF_TRUMPION == 0) {
  1903. if (SiS_VBInfo & SetCRT2ToLCD) {
  1904. if (!(SiS_LCDInfo & LCDNonExpanding)) {
  1905. if (SiS_LCDResInfo == Panel800x600) {
  1906. tempax = 800;
  1907. tempbx = 600;
  1908. } else if (SiS_LCDResInfo ==
  1909.    Panel1024x768) {
  1910. tempax = 1024;
  1911. tempbx = 768;
  1912. } else {
  1913. tempax = 1280;
  1914. tempbx = 1024;
  1915. }
  1916. SiS_HDE = tempax;
  1917. SiS_VDE = tempbx;
  1918. }
  1919. }
  1920. }
  1921. }
  1922. return;
  1923. }
  1924. void
  1925. SiS_GetCRT2Data301 (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  1926.     USHORT RefreshRateTableIndex)
  1927. {
  1928. USHORT tempax, tempbx, modeflag;
  1929. USHORT resinfo;
  1930. USHORT CRT2Index, ResIndex;
  1931. SiS_LCDDataStruct *LCDPtr = NULL;
  1932. SiS_TVDataStruct *TVPtr = NULL;
  1933. if (ModeNo <= 0x13) {
  1934. modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
  1935. resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
  1936. } else {
  1937. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
  1938. resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
  1939. }
  1940. SiS_NewFlickerMode = 0;
  1941. SiS_RVBHRS = 50;
  1942. SiS_RY1COE = 0;
  1943. SiS_RY2COE = 0;
  1944. SiS_RY3COE = 0;
  1945. SiS_RY4COE = 0;
  1946. SiS_GetCRT2ResInfo (ROMAddr, ModeNo, ModeIdIndex);
  1947. if (SiS_VBInfo & SetCRT2ToRAMDAC) {
  1948. SiS_GetRAMDAC2DATA (ROMAddr, ModeNo, ModeIdIndex,
  1949.     RefreshRateTableIndex);
  1950. return;
  1951. }
  1952. if (SiS_VBInfo & SetCRT2ToTV) {
  1953. SiS_GetCRT2Ptr (ROMAddr, ModeNo, ModeIdIndex,
  1954. RefreshRateTableIndex, &CRT2Index, &ResIndex);
  1955. switch (CRT2Index) {
  1956. case 2:
  1957. TVPtr = SiS_ExtHiTVData;
  1958. break;
  1959. case 3:
  1960. TVPtr = SiS_ExtPALData;
  1961. break;
  1962. case 4:
  1963. TVPtr = SiS_ExtNTSCData;
  1964. break;
  1965. case 7:
  1966. TVPtr = SiS_St1HiTVData;
  1967. break;
  1968. case 8:
  1969. TVPtr = SiS_StPALData;
  1970. break;
  1971. case 9:
  1972. TVPtr = SiS_StNTSCData;
  1973. break;
  1974. case 12:
  1975. TVPtr = SiS_St2HiTVData;
  1976. break;
  1977. }
  1978. SiS_RVBHCMAX = (TVPtr + ResIndex)->RVBHCMAX;
  1979. SiS_RVBHCFACT = (TVPtr + ResIndex)->RVBHCFACT;
  1980. SiS_VGAHT = (TVPtr + ResIndex)->VGAHT;
  1981. SiS_VGAVT = (TVPtr + ResIndex)->VGAVT;
  1982. SiS_HDE = (TVPtr + ResIndex)->TVHDE;
  1983. SiS_VDE = (TVPtr + ResIndex)->TVVDE;
  1984. SiS_RVBHRS = (TVPtr + ResIndex)->RVBHRS;
  1985. SiS_NewFlickerMode = (TVPtr + ResIndex)->FlickerMode;
  1986. if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
  1987. if (resinfo == 0x08)
  1988. SiS_NewFlickerMode = 0x40;
  1989. if (resinfo == 0x09)
  1990. SiS_NewFlickerMode = 0x40;
  1991. if (resinfo == 0x10)
  1992. SiS_NewFlickerMode = 0x40;
  1993. }
  1994. if (SiS_VBInfo & SetCRT2ToHiVisionTV) {
  1995. if (SiS_VGAVDE == 350)
  1996. SiS_SetFlag = SiS_SetFlag | TVSimuMode;
  1997. tempax = ExtHiTVHT;
  1998. tempbx = ExtHiTVVT;
  1999. if (SiS_VBInfo & SetInSlaveMode) {
  2000. if (SiS_SetFlag & TVSimuMode) {
  2001. tempax = StHiTVHT;
  2002. tempbx = StHiTVVT;
  2003. if (!(modeflag & Charx8Dot)) {
  2004. tempax = StHiTextTVHT;
  2005. tempbx = StHiTextTVVT;
  2006. }
  2007. }
  2008. }
  2009. }
  2010. if (!(SiS_VBInfo & SetCRT2ToHiVisionTV)) {
  2011. SiS_RY1COE = (TVPtr + ResIndex)->RY1COE;
  2012. SiS_RY2COE = (TVPtr + ResIndex)->RY2COE;
  2013. if (modeflag & HalfDCLK) {
  2014. SiS_RY1COE = 0x00;
  2015. SiS_RY2COE = 0xf4;
  2016. }
  2017. SiS_RY3COE = (TVPtr + ResIndex)->RY3COE;
  2018. SiS_RY4COE = (TVPtr + ResIndex)->RY4COE;
  2019. if (modeflag & HalfDCLK) {
  2020. SiS_RY3COE = 0x10;
  2021. SiS_RY4COE = 0x38;
  2022. }
  2023. if (!(SiS_VBInfo & SetPALTV)) {
  2024. tempax = NTSCHT;
  2025. tempbx = NTSCVT;
  2026. } else {
  2027. tempax = PALHT;
  2028. tempbx = PALVT;
  2029. }
  2030. }
  2031. SiS_HT = tempax;
  2032. SiS_VT = tempbx;
  2033. return;
  2034. }
  2035. if (SiS_VBInfo & SetCRT2ToLCD) {
  2036. SiS_GetCRT2Ptr (ROMAddr, ModeNo, ModeIdIndex,
  2037. RefreshRateTableIndex, &CRT2Index, &ResIndex);
  2038. switch (CRT2Index) {
  2039. case 0:
  2040. LCDPtr = SiS_ExtLCD1024x768Data;
  2041. break;
  2042. case 1:
  2043. LCDPtr = SiS_ExtLCD1280x1024Data;
  2044. break;
  2045. case 5:
  2046. LCDPtr = SiS_StLCD1024x768Data;
  2047. break;
  2048. case 6:
  2049. LCDPtr = SiS_StLCD1280x1024Data;
  2050. break;
  2051. case 10:
  2052. LCDPtr = SiS_St2LCD1024x768Data;
  2053. break;
  2054. case 11:
  2055. LCDPtr = SiS_St2LCD1280x1024Data;
  2056. break;
  2057. case 13:
  2058. LCDPtr = SiS_NoScaleData;
  2059. break;
  2060. case 14:
  2061. LCDPtr = SiS_LCD1280x960Data;
  2062. break;
  2063. }
  2064. SiS_RVBHCMAX = (LCDPtr + ResIndex)->RVBHCMAX;
  2065. SiS_RVBHCFACT = (LCDPtr + ResIndex)->RVBHCFACT;
  2066. SiS_VGAHT = (LCDPtr + ResIndex)->VGAHT;
  2067. SiS_VGAVT = (LCDPtr + ResIndex)->VGAVT;
  2068. SiS_HT = (LCDPtr + ResIndex)->LCDHT;
  2069. SiS_VT = (LCDPtr + ResIndex)->LCDVT;
  2070. tempax = 1024;
  2071. if (SiS_SetFlag & LCDVESATiming) {
  2072. if (SiS_VGAVDE == 350)
  2073. tempbx = 560;
  2074. else if (SiS_VGAVDE == 400)
  2075. tempbx = 640;
  2076. else
  2077. tempbx = 768;
  2078. } else {
  2079. if (SiS_VGAVDE == 357)
  2080. tempbx = 527;
  2081. else if (SiS_VGAVDE == 420)
  2082. tempbx = 620;
  2083. else if (SiS_VGAVDE == 525)
  2084. tempbx = 775;
  2085. else if (SiS_VGAVDE == 600)
  2086. tempbx = 775;
  2087. else if (SiS_VGAVDE == 350)
  2088. tempbx = 560;
  2089. else if (SiS_VGAVDE == 400)
  2090. tempbx = 640;
  2091. else
  2092. tempbx = 768;
  2093. }
  2094. if (SiS_LCDResInfo == Panel1280x1024) {
  2095. tempax = 1280;
  2096. if (SiS_VGAVDE == 360)
  2097. tempbx = 768;
  2098. else if (SiS_VGAVDE == 375)
  2099. tempbx = 800;
  2100. else if (SiS_VGAVDE == 405)
  2101. tempbx = 864;
  2102. else
  2103. tempbx = 1024;
  2104. }
  2105. if (SiS_LCDResInfo == Panel1280x960) {
  2106. tempax = 1280;
  2107. if (SiS_VGAVDE == 350)
  2108. tempbx = 700;
  2109. else if (SiS_VGAVDE == 400)
  2110. tempbx = 800;
  2111. else if (SiS_VGAVDE == 1024)
  2112. tempbx = 960;
  2113. else
  2114. tempbx = 960;
  2115. }
  2116. if (SiS_LCDInfo & LCDNonExpanding) {
  2117. tempax = SiS_VGAHDE;
  2118. tempbx = SiS_VGAVDE;
  2119. }
  2120. SiS_HDE = tempax;
  2121. SiS_VDE = tempbx;
  2122. return;
  2123. }
  2124. }
  2125. USHORT
  2126. SiS_GetResInfo (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
  2127. {
  2128. USHORT resindex;
  2129. if (ModeNo <= 0x13) {
  2130. resindex = SiS_SModeIDTable[ModeIdIndex].St_ResInfo; /* si+St_ResInfo */
  2131. } else {
  2132. resindex = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO; /* si+Ext_ResInfo */
  2133. }
  2134. return (resindex);
  2135. }
  2136. void
  2137. SiS_GetCRT2ResInfo (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
  2138. {
  2139. USHORT xres, yres, modeflag, resindex;
  2140. resindex = SiS_GetResInfo (ROMAddr, ModeNo, ModeIdIndex);
  2141. if (ModeNo <= 0x13) {
  2142. xres = SiS_StResInfo[resindex].HTotal;
  2143. yres = SiS_StResInfo[resindex].VTotal;
  2144. } else {
  2145. xres = SiS_ModeResInfo[resindex].HTotal; /* xres->ax */
  2146. yres = SiS_ModeResInfo[resindex].VTotal; /* yres->bx */
  2147. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+St_ModeFlag */
  2148. if (modeflag & HalfDCLK) {
  2149. xres = xres * 2;
  2150. }
  2151. if (modeflag & DoubleScanMode) {
  2152. yres = yres * 2;
  2153. }
  2154. }
  2155. if (SiS_IF_DEF_LVDS == 0) {
  2156. if (SiS_LCDResInfo == Panel1280x1024) {
  2157. if (yres == 400)
  2158. yres = 405;
  2159. if (yres == 350)
  2160. yres = 360;
  2161. if (SiS_SetFlag & LCDVESATiming) {
  2162. if (yres == 360)
  2163. yres = 375;
  2164. }
  2165. }
  2166. if (SiS_LCDResInfo == Panel1024x768) {
  2167. if (!(SiS_SetFlag & LCDVESATiming)) {
  2168. if (!(SiS_LCDInfo & LCDNonExpanding)) {
  2169. if (yres == 350)
  2170. yres = 357;
  2171. if (yres == 400)
  2172. yres = 420;
  2173. /*          if(!OldBios)             */
  2174. if (yres == 480)
  2175. yres = 525;
  2176. }
  2177. }
  2178. }
  2179. } else {
  2180. if (xres == 720)
  2181. xres = 640;
  2182. }
  2183. SiS_VGAHDE = xres;
  2184. SiS_HDE = xres;
  2185. SiS_VGAVDE = yres;
  2186. SiS_VDE = yres;
  2187. }
  2188. void
  2189. SiS_GetCRT2Ptr (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  2190. USHORT RefreshRateTableIndex, USHORT * CRT2Index,
  2191. USHORT * ResIndex)
  2192. {
  2193. USHORT tempbx, tempal;
  2194. USHORT Flag;
  2195. if (SiS_IF_DEF_LVDS == 0) {
  2196. if (SiS_VBInfo & SetCRT2ToLCD) { /* LCD */
  2197. tempbx = SiS_LCDResInfo;
  2198. tempbx = tempbx - Panel1024x768;
  2199. if (!(SiS_SetFlag & LCDVESATiming)) {
  2200. tempbx += 5;
  2201. /*      GetRevisionID();  */
  2202. tempbx += 5;
  2203. }
  2204. } else {
  2205. if (SiS_VBInfo & SetCRT2ToHiVisionTV) { /* TV */
  2206. if (SiS_VGAVDE > 480)
  2207. SiS_SetFlag =
  2208.     SiS_SetFlag & (!TVSimuMode);
  2209. tempbx = 2;
  2210. if (SiS_VBInfo & SetInSlaveMode) {
  2211. if (!(SiS_SetFlag & TVSimuMode))
  2212. tempbx = 10;
  2213. }
  2214. } else {
  2215. if (SiS_VBInfo & SetPALTV) {
  2216. tempbx = 3;
  2217. } else {
  2218. tempbx = 4;
  2219. }
  2220. if (SiS_SetFlag & TVSimuMode) {
  2221. tempbx = tempbx + 5;
  2222. }
  2223. }
  2224. }
  2225. if (ModeNo <= 0x13) {
  2226. tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
  2227. } else {
  2228. tempal =
  2229.     SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
  2230. }
  2231. tempal = tempal & 0x3F;
  2232. /*301b */
  2233. if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
  2234.     && (SiS_VBInfo & SetCRT2ToTV)) {
  2235. /*look */
  2236. if (tempal == 0x06)
  2237. tempal = 0x07;
  2238. }
  2239. /*end 301b */
  2240. if ((0x31 <= ModeNo) && (ModeNo <= 0x35))
  2241. tempal = 6;
  2242. if (SiS_LCDInfo & LCDNonExpanding)
  2243. tempbx = 0x0D;
  2244. if (SiS_LCDResInfo == Panel1280x960)
  2245. tempbx = 0x0E;
  2246. *CRT2Index = tempbx;
  2247. *ResIndex = tempal;
  2248. } else { /* LVDS */
  2249. Flag = 1;
  2250. tempbx = 0;
  2251. if (SiS_IF_DEF_CH7005 == 1) {
  2252. if (!(SiS_VBInfo & SetCRT2ToLCD)) {
  2253. Flag = 0;
  2254. tempbx = 7;
  2255. if (SiS_VBInfo & SetPALTV)
  2256. tempbx = tempbx + 2;
  2257. if (SiS_VBInfo & SetCHTVOverScan)
  2258. tempbx = tempbx + 1;
  2259. }
  2260. }
  2261. if (Flag == 1) {
  2262. tempbx = SiS_LCDResInfo - Panel800x600;
  2263. if (SiS_LCDInfo & LCDNonExpanding) {
  2264. tempbx = tempbx + 3;
  2265. }
  2266. }
  2267. if (ModeNo <= 0x13) {
  2268. tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
  2269. } else {
  2270. tempal =
  2271.     SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
  2272. }
  2273. tempal = tempal & 0x1F;
  2274. *CRT2Index = tempbx;
  2275. *ResIndex = tempal;
  2276. }
  2277. }
  2278. void
  2279. SiS_GetCRT2PtrA (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  2280.  USHORT RefreshRateTableIndex, USHORT * CRT2Index,
  2281.  USHORT * ResIndex)
  2282. {
  2283. USHORT tempbx, tempal;
  2284. tempbx = SiS_LCDResInfo - Panel1024x768;
  2285. if (SiS_LCDInfo & LCDNonExpanding) {
  2286. tempbx = tempbx + 3;
  2287. }
  2288. if (ModeNo <= 0x13) {
  2289. tempal = SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
  2290. } else {
  2291. tempal = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
  2292. }
  2293. tempal = tempal & 0x1F;
  2294. *CRT2Index = tempbx;
  2295. *ResIndex = tempal;
  2296. }
  2297. /*end 301b*/
  2298. USHORT
  2299. SiS_GetRatePtrCRT2 (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
  2300. {
  2301. SHORT LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 };
  2302. SHORT LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01 };
  2303. USHORT RefreshRateTableIndex, i;
  2304. USHORT modeflag, index, temp;
  2305. if (ModeNo <= 0x13) {
  2306. modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  2307. } else {
  2308. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  2309. }
  2310. if (SiS_IF_DEF_CH7005 == 1) {
  2311. if (SiS_VBInfo & SetCRT2ToTV) {
  2312. if (modeflag & HalfDCLK)
  2313. return (0);
  2314. }
  2315. }
  2316. if (ModeNo < 0x14)
  2317. return (0xFFFF);
  2318. index = SiS_GetReg1 (SiS_P3d4, 0x33);
  2319. index = index >> SiS_SelectCRT2Rate;
  2320. index = index & 0x0F;
  2321. if (SiS_LCDInfo & LCDNonExpanding)
  2322. index = 0;
  2323. if (index > 0)
  2324. index--;
  2325. if (SiS_SetFlag & ProgrammingCRT2) {
  2326. if (SiS_IF_DEF_CH7005 == 1) {
  2327. if (SiS_VBInfo & SetCRT2ToTV) {
  2328. index = 0;
  2329. }
  2330. }
  2331. if (SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
  2332. if (SiS_IF_DEF_LVDS == 0) {
  2333. if ((SiS_VBType & VB_SIS301B)
  2334.     || (SiS_VBType & VB_SIS302B)) temp =
  2335.     LCDARefreshIndex[SiS_LCDResInfo]; /*301b */
  2336. else
  2337. temp = LCDRefreshIndex[SiS_LCDResInfo];
  2338. if (index > temp) {
  2339. index = temp;
  2340. }
  2341. } else {
  2342. index = 0;
  2343. }
  2344. }
  2345. }
  2346. RefreshRateTableIndex = SiS_EModeIDTable[ModeIdIndex].REFindex;
  2347. ModeNo = SiS_RefIndex[RefreshRateTableIndex].ModeID;
  2348. i = 0;
  2349. do {
  2350. if (SiS_RefIndex[RefreshRateTableIndex + i].ModeID != ModeNo)
  2351. break;
  2352. temp = SiS_RefIndex[RefreshRateTableIndex + i].Ext_InfoFlag;
  2353. temp = temp & ModeInfoFlag;
  2354. if (temp < SiS_ModeType)
  2355. break;
  2356. i++;
  2357. index--;
  2358. } while (index != 0xFFFF);
  2359. if (!(SiS_VBInfo & SetCRT2ToRAMDAC)) {
  2360. if (SiS_VBInfo & SetInSlaveMode) {
  2361. temp =
  2362.     SiS_RefIndex[RefreshRateTableIndex + i -
  2363.  1].Ext_InfoFlag;
  2364. if (temp & InterlaceMode) {
  2365. i++;
  2366. }
  2367. }
  2368. }
  2369. i--;
  2370. if ((SiS_SetFlag & ProgrammingCRT2)) {
  2371. temp =
  2372.     SiS_AjustCRT2Rate (ROMAddr, ModeNo, ModeIdIndex,
  2373.        RefreshRateTableIndex, &i);
  2374. }
  2375. return (RefreshRateTableIndex + i); /*return(0x01|(temp1<<1));   */
  2376. }
  2377. BOOLEAN
  2378. SiS_AjustCRT2Rate (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  2379.    USHORT RefreshRateTableIndex, USHORT * i)
  2380. {
  2381. USHORT tempax, tempbx, resinfo;
  2382. USHORT modeflag, infoflag;
  2383. if (ModeNo <= 0x13) {
  2384. modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ModeFlag */
  2385. } else {
  2386. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  2387. }
  2388. resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
  2389. tempbx = SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID;
  2390. tempax = 0;
  2391. if (SiS_IF_DEF_LVDS == 0) {
  2392. if (SiS_VBInfo & SetCRT2ToRAMDAC) {
  2393. tempax = tempax | SupportRAMDAC2;
  2394. }
  2395. if (SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { /*301b */
  2396. tempax = tempax | SupportLCD;
  2397. if (SiS_LCDResInfo != Panel1280x1024) {
  2398. if (SiS_LCDResInfo != Panel1280x960) {
  2399. if (SiS_LCDInfo & LCDNonExpanding) {
  2400. if (resinfo >= 9) {
  2401. tempax = 0;
  2402. return (0);
  2403. }
  2404. }
  2405. }
  2406. }
  2407. }
  2408. if (SiS_VBInfo & SetCRT2ToHiVisionTV) { /* for HiTV */
  2409. tempax = tempax | SupportHiVisionTV;
  2410. if (SiS_VBInfo & SetInSlaveMode) {
  2411. if (resinfo == 4)
  2412. return (0);
  2413. if (resinfo == 3) {
  2414. if (SiS_SetFlag & TVSimuMode)
  2415. return (0);
  2416. }
  2417. if (resinfo > 7)
  2418. return (0);
  2419. }
  2420. } else {
  2421. if (SiS_VBInfo &
  2422.     (SetCRT2ToAVIDEO | SetCRT2ToSVIDEO |
  2423.      SetCRT2ToSCART)) {
  2424. tempax = tempax | SupportTV;
  2425. /*301b */
  2426. if ((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B)) { /*301b */
  2427. tempax = tempax | SupportTV1024;
  2428. }
  2429. /*end 301b */
  2430. if (!(SiS_VBInfo & SetPALTV)) {
  2431. if (modeflag & NoSupportSimuTV) {
  2432. if (SiS_VBInfo & SetInSlaveMode) {
  2433. if (!
  2434.     (SiS_VBInfo &
  2435.      SetNotSimuMode)) {
  2436. return 0;
  2437. }
  2438. }
  2439. }
  2440. }
  2441. }
  2442. }
  2443. } else { /* for LVDS */
  2444. if (SiS_IF_DEF_CH7005 == 1) {
  2445. if (SiS_VBInfo & SetCRT2ToTV) {
  2446. tempax = tempax | SupportCHTV;
  2447. }
  2448. }
  2449. if (SiS_VBInfo & SetCRT2ToLCD) {
  2450. tempax = tempax | SupportLCD;
  2451. if (resinfo > 0x08)
  2452. return (0); /*1024x768  */
  2453. if (SiS_LCDResInfo < Panel1024x768) {
  2454. if (resinfo > 0x07)
  2455. return (0); /*800x600  */
  2456. if (resinfo == 0x04)
  2457. return (0); /*512x384  */
  2458. }
  2459. }
  2460. }
  2461. for (; SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID == tempbx;
  2462.      (*i)--) {
  2463. infoflag =
  2464.     SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
  2465. if (infoflag & tempax) {
  2466. return (1);
  2467. }
  2468. if ((*i) == 0)
  2469. break;
  2470. }
  2471. for ((*i) = 0;; (*i)++) {
  2472. infoflag =
  2473.     SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
  2474. if (SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID != tempbx) {
  2475. return (0);
  2476. }
  2477. if (infoflag & tempax) {
  2478. return (1);
  2479. }
  2480. }
  2481. return (1);
  2482. }
  2483. void
  2484. SiS_SaveCRT2Info (USHORT ModeNo)
  2485. {
  2486. USHORT temp1, temp2;
  2487. SiS_SetReg1 (SiS_P3d4, 0x34, ModeNo); /* reserve CR34 for CRT1 Mode No */
  2488. temp1 = (SiS_VBInfo & SetInSlaveMode) >> 8;
  2489. temp2 = ~(SetInSlaveMode >> 8);
  2490. SiS_SetRegANDOR (SiS_P3d4, 0x31, temp2, temp1);
  2491. }
  2492. void
  2493. SiS_GetVBInfo301 (USHORT BaseAddr, ULONG ROMAddr, USHORT ModeNo,
  2494.   USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension)
  2495. {
  2496. USHORT tempax, tempbx, temp;
  2497. USHORT modeflag;
  2498. UCHAR OutputSelect = *pSiS_OutputSelect;
  2499. if (ModeNo <= 0x13) {
  2500. modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  2501. } else {
  2502. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  2503. }
  2504. SiS_SetFlag = 0;
  2505. SiS_ModeType = modeflag & ModeInfoFlag;
  2506. tempbx = 0;
  2507. if (SiS_BridgeIsOn (BaseAddr)) {
  2508. temp = SiS_GetReg1 (SiS_P3d4, 0x30);
  2509. tempbx = tempbx | temp;
  2510. temp = SiS_GetReg1 (SiS_P3d4, 0x31);
  2511. tempax = temp << 8;
  2512. tempbx = tempbx | tempax;
  2513. temp = SetCHTVOverScan | SetInSlaveMode | DisableCRT2Display; /* ynlai */
  2514. temp = 0xFFFF ^ temp;
  2515. tempbx = tempbx & temp;
  2516. #ifdef CONFIG_FB_SIS_315
  2517. /*301b */
  2518. if ((SiS_VBType & VB_SIS302B)) {
  2519. temp = SiS_GetReg1 (SiS_P3d4, 0x38);
  2520. if (temp == 0x03)
  2521. tempbx = tempbx | (SetCRT2ToLCDA);
  2522. }
  2523. /*end301b */
  2524. #endif
  2525. if (SiS_IF_DEF_LVDS == 0) {
  2526. if (SiS_IF_DEF_HiVision)
  2527. temp = 0x80FC;
  2528. else
  2529. temp = 0x807C;
  2530. } else {
  2531. if (SiS_IF_DEF_CH7005 == 1) {
  2532. temp = SetCRT2ToTV | SetCRT2ToLCD;
  2533. } else {
  2534. temp = SetCRT2ToLCD;
  2535. }
  2536. }
  2537. if (!(tempbx & temp)) {
  2538. tempax = tempax | DisableCRT2Display;
  2539. tempbx = 0;
  2540. }
  2541. if (SiS_IF_DEF_LVDS == 0) {
  2542. if (tempbx & SetCRT2ToLCDA) { /*301b */
  2543. tempbx =
  2544.     tempbx & (0xFF00 | SwitchToCRT2 |
  2545.       SetSimuScanMode);
  2546. } else if (tempbx & SetCRT2ToRAMDAC) {
  2547. tempbx =
  2548.     tempbx & (0xFF00 | SetCRT2ToRAMDAC |
  2549.       SwitchToCRT2 | SetSimuScanMode);
  2550. } else if ((tempbx & SetCRT2ToLCD) && (!(SiS_VBType & VB_NoLCD))) { /*301dlvds */
  2551. tempbx =
  2552.     tempbx & (0xFF00 | SetCRT2ToLCD |
  2553.       SwitchToCRT2 | SetSimuScanMode);
  2554. } else if (tempbx & SetCRT2ToSCART) {
  2555. tempbx =
  2556.     tempbx & (0xFF00 | SetCRT2ToSCART |
  2557.       SwitchToCRT2 | SetSimuScanMode);
  2558. tempbx = tempbx | SetPALTV;
  2559. } else if (tempbx & SetCRT2ToHiVisionTV) {
  2560. tempbx =
  2561.     tempbx & (0xFF00 | SetCRT2ToHiVisionTV |
  2562.       SwitchToCRT2 | SetSimuScanMode);
  2563. /* ynlai begin */
  2564. tempbx = tempbx | SetPALTV;
  2565. /* ynlai end */
  2566. }
  2567. } else {
  2568. if (SiS_IF_DEF_CH7005 == 1) {
  2569. if (tempbx & SetCRT2ToTV)
  2570. tempbx =
  2571.     tempbx & (0xFF00 | SetCRT2ToTV |
  2572.       SwitchToCRT2 |
  2573.       SetSimuScanMode);
  2574. }
  2575. if (tempbx & SetCRT2ToLCD)
  2576. tempbx =
  2577.     tempbx & (0xFF00 | SetCRT2ToLCD |
  2578.       SwitchToCRT2 | SetSimuScanMode);
  2579. }
  2580. if (tempax & DisableCRT2Display) {
  2581. if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode))) {
  2582. tempbx = SetSimuScanMode | DisableCRT2Display;
  2583. }
  2584. }
  2585. if (!(tempbx & DriverMode)) {
  2586. tempbx = tempbx | SetSimuScanMode;
  2587. }
  2588. if (!(tempbx & SetSimuScanMode)) {
  2589. if (tempbx & SwitchToCRT2) {
  2590. if (!(modeflag & CRT2Mode)) {
  2591. tempbx = tempbx | SetSimuScanMode;
  2592. }
  2593. } else {
  2594. if (!
  2595.     (SiS_BridgeIsEnable
  2596.      (BaseAddr, HwDeviceExtension))) {
  2597. if (!(tempbx & DriverMode)) {
  2598. if (SiS_BridgeInSlave ()) {
  2599. tempbx =
  2600.     tempbx |
  2601.     SetInSlaveMode;
  2602. }
  2603. }
  2604. }
  2605. }
  2606. }
  2607. if (!(tempbx & DisableCRT2Display)) {
  2608. if (tempbx & DriverMode) {
  2609. if (tempbx & SetSimuScanMode) {
  2610. if (!(modeflag & CRT2Mode)) {
  2611. tempbx =
  2612.     tempbx | SetInSlaveMode;
  2613. if (SiS_IF_DEF_LVDS == 0) {
  2614. if (tempbx &
  2615.     SetCRT2ToTV) {
  2616. if (!
  2617.     (tempbx &
  2618.      SetNotSimuMode))
  2619.    SiS_SetFlag =
  2620.     SiS_SetFlag
  2621.     |
  2622.     TVSimuMode;
  2623. }
  2624. }
  2625. }
  2626. }
  2627. } else {
  2628. tempbx = tempbx | SetInSlaveMode;
  2629. if (SiS_IF_DEF_LVDS == 0) {
  2630. if (tempbx & SetCRT2ToTV) {
  2631. if (!(tempbx & SetNotSimuMode))
  2632. SiS_SetFlag =
  2633.     SiS_SetFlag |
  2634.     TVSimuMode;
  2635. }
  2636. }
  2637. }
  2638. }
  2639. if (SiS_IF_DEF_CH7005 == 1) {
  2640. temp = SiS_GetReg1 (SiS_P3d4, 0x35);
  2641. if (temp & TVOverScan)
  2642. tempbx = tempbx | SetCHTVOverScan;
  2643. }
  2644. }
  2645. #ifdef CONFIG_FB_SIS_300
  2646. /*add PALMN */
  2647. if (SiS_IF_DEF_LVDS == 0) {
  2648. if ((HwDeviceExtension->jChipType == SIS_630) ||
  2649.     (HwDeviceExtension->jChipType == SIS_730)) {
  2650. if (!(OutputSelect & EnablePALMN))
  2651. SiS_SetRegAND (SiS_P3d4, 0x35, 0x3F);
  2652. if (tempbx & SetCRT2ToTV) {
  2653. if (tempbx & SetPALTV) {
  2654. temp = SiS_GetReg1 (SiS_P3d4, 0x35);
  2655. temp = temp & 0xC0;
  2656. if (temp == 0x40)
  2657. tempbx = tempbx & (~SetPALTV);
  2658. }
  2659. }
  2660. }
  2661. }
  2662. /*end add */
  2663. #endif
  2664. #ifdef CONFIG_FB_SIS_315
  2665. /*add PALMN */
  2666. if (SiS_IF_DEF_LVDS == 0) {
  2667. if (!(OutputSelect & EnablePALMN))
  2668. SiS_SetRegAND (SiS_P3d4, 0x38, 0x3F);
  2669. if (tempbx & SetCRT2ToTV) {
  2670. if (tempbx & SetPALTV) {
  2671. temp = SiS_GetReg1 (SiS_P3d4, 0x38);
  2672. temp = temp & 0xC0;
  2673. if (temp == 0x40)
  2674. tempbx = tempbx & (~SetPALTV);
  2675. }
  2676. }
  2677. }
  2678. /*end add */
  2679. #endif
  2680. SiS_VBInfo = tempbx;
  2681. }
  2682. void
  2683. SiS_GetRAMDAC2DATA (ULONG ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
  2684.     USHORT RefreshRateTableIndex)
  2685. {
  2686. USHORT tempax, tempbx, temp;
  2687. USHORT temp1, temp2, modeflag = 0, tempcx;
  2688. USHORT StandTableIndex, CRT1Index;
  2689. USHORT ResInfo, DisplayType;
  2690. SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr = NULL;
  2691. SiS_RVBHCMAX = 1;
  2692. SiS_RVBHCFACT = 1;
  2693. if (ModeNo <= 0x13) {
  2694. modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
  2695. StandTableIndex = SiS_GetModePtr (ROMAddr, ModeNo, ModeIdIndex);
  2696. tempax = SiS_StandTable[StandTableIndex].CRTC[0];
  2697. tempbx = SiS_StandTable[StandTableIndex].CRTC[6];
  2698. temp1 = SiS_StandTable[StandTableIndex].CRTC[7];
  2699. } else {
  2700. if (((SiS_VBType & VB_SIS301B) || (SiS_VBType & VB_SIS302B))
  2701.     && (SiS_VBInfo & SetCRT2ToLCDA)) {
  2702. /*add crt1ptr */
  2703. temp =
  2704.     SiS_GetLVDSCRT1Ptr (ROMAddr, ModeNo, ModeIdIndex,
  2705. RefreshRateTableIndex, &ResInfo,
  2706. &DisplayType);
  2707. if (temp == 0) {
  2708. return;
  2709. }
  2710. switch (DisplayType) {
  2711. case 0:
  2712. LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1;
  2713. break;
  2714. case 1:
  2715. LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1;
  2716. break;
  2717. case 2:
  2718. LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1;
  2719. break;
  2720. case 3:
  2721. LVDSCRT1Ptr = SiS_LVDSCRT1800x600_1_H;
  2722. break;
  2723. case 4:
  2724. LVDSCRT1Ptr = SiS_LVDSCRT11024x768_1_H;
  2725. break;
  2726. case 5:
  2727. LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_1_H;
  2728. break;
  2729. case 6:
  2730. LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2;
  2731. break;
  2732. case 7:
  2733. LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2;
  2734. break;
  2735. case 8:
  2736. LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2;
  2737. break;
  2738. case 9:
  2739. LVDSCRT1Ptr = SiS_LVDSCRT1800x600_2_H;
  2740. break;
  2741. case 10:
  2742. LVDSCRT1Ptr = SiS_LVDSCRT11024x768_2_H;
  2743. break;
  2744. case 11:
  2745. LVDSCRT1Ptr = SiS_LVDSCRT11280x1024_2_H;
  2746. break;
  2747. case 12:
  2748. LVDSCRT1Ptr = SiS_CHTVCRT1UNTSC;
  2749. break;
  2750. case 13:
  2751. LVDSCRT1Ptr = SiS_CHTVCRT1ONTSC;
  2752. break;
  2753. case 14:
  2754. LVDSCRT1Ptr = SiS_CHTVCRT1UPAL;
  2755. break;
  2756. case 15:
  2757. LVDSCRT1Ptr = SiS_CHTVCRT1OPAL;
  2758. break;
  2759. }
  2760. temp1 = (LVDSCRT1Ptr + ResInfo)->CR[0];
  2761. temp2 = (LVDSCRT1Ptr + ResInfo)->CR[14];
  2762. tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
  2763. tempbx = (LVDSCRT1Ptr + ResInfo)->CR[6];
  2764. tempcx = (LVDSCRT1Ptr + ResInfo)->CR[13] << 8;
  2765. tempcx = tempcx & 0x0100;
  2766. tempcx = tempcx << 2;
  2767. tempbx = tempbx | tempcx;
  2768. temp1 = (LVDSCRT1Ptr + ResInfo)->CR[7];
  2769. } /*add 301b */
  2770. else {
  2771. modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
  2772. CRT1Index =
  2773.     SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
  2774. CRT1Index = CRT1Index & 0x3F;
  2775. temp1 = (USHORT) SiS_CRT1Table[CRT1Index].CR[0];
  2776. temp2 = (USHORT) SiS_CRT1Table[CRT1Index].CR[14];
  2777. tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
  2778. tempbx = (USHORT) SiS_CRT1Table[CRT1Index].CR[6];
  2779. tempcx = (USHORT) SiS_CRT1Table[CRT1Index].CR[13] << 8;
  2780. tempcx = tempcx & 0x0100;
  2781. tempcx = tempcx << 2;
  2782. tempbx = tempbx | tempcx;
  2783. temp1 = (USHORT) SiS_CRT1Table[CRT1Index].CR[7];
  2784. }
  2785. }
  2786. if (temp1 & 0x01)
  2787. tempbx = tempbx | 0x0100;
  2788. if (temp1 & 0x20)
  2789. tempbx = tempbx | 0x0200;
  2790. tempax = tempax + 5;
  2791. if (modeflag & Charx8Dot)
  2792. tempax = tempax * 8;
  2793. else
  2794. tempax = tempax * 9;
  2795. SiS_VGAHT = tempax;
  2796. SiS_HT = tempax;
  2797. tempbx++;
  2798. SiS_VGAVT = tempbx;
  2799. SiS_VT = tempbx;
  2800. }
  2801. void
  2802. SiS_UnLockCRT2 (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
  2803. {
  2804. if (HwDeviceExtension->jChipType >= SIS_315H) {
  2805. SiS_SetRegANDOR (SiS_Part1Port, 0x2f, 0xFF, 0x01);
  2806. } else {
  2807. SiS_SetRegANDOR (SiS_Part1Port, 0x24, 0xFF, 0x01);
  2808. }
  2809. }
  2810. void
  2811. SiS_LockCRT2 (PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
  2812. {
  2813. if (HwDeviceExtension->jChipType >= SIS_315H) {
  2814. SiS_SetRegANDOR (SiS_Part1Port, 0x2F, 0xFE, 0x00);
  2815. } else {
  2816. SiS_SetRegANDOR (SiS_Part1Port, 0x24, 0xFE, 0x00);
  2817. }
  2818. }
  2819. void
  2820. SiS_EnableCRT2 ()
  2821. {