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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _SISFB_MAIN
  2. #define _SISFB_MAIN
  3. /* Comments and changes marked with "TW" by Thomas Winischhofer <thomas@winischhofer.net> */
  4. #include "vstruct.h"
  5. /* ------------------- Constant Definitions ------------------------- */
  6. #undef LINUXBIOS   /* turn this on when compiling for LINUXBIOS */
  7. #define AGPOFF     /* default is turn off AGP */
  8. #define SISFAIL(x) do { printk(x "n"); return -EINVAL; } while(0)
  9. #define VER_MAJOR                 1
  10. #define VER_MINOR                 5
  11. #define VER_LEVEL                 7
  12. #include "sis.h"
  13. /* TW: To be included in pci_ids.h */
  14. #ifndef PCI_DEVICE_ID_SI_650_VGA
  15. #define PCI_DEVICE_ID_SI_650_VGA  0x6325
  16. #endif
  17. #ifndef PCI_DEVICE_ID_SI_650
  18. #define PCI_DEVICE_ID_SI_650      0x0650
  19. #endif
  20. /* TW end */
  21. #define MAX_ROM_SCAN              0x10000
  22. #define HW_CURSOR_CAP             0x80
  23. #define TURBO_QUEUE_CAP           0x40
  24. #define AGP_CMD_QUEUE_CAP         0x20
  25. #define VM_CMD_QUEUE_CAP          0x10
  26. #define MMIO_CMD_QUEUE_CAP        0x08
  27. /* For 300 series */
  28. #ifdef CONFIG_FB_SIS_300
  29. #define TURBO_QUEUE_AREA_SIZE     0x80000 /* 512K */
  30. #endif
  31. /* For 315 series */
  32. #ifdef CONFIG_FB_SIS_315
  33. #define COMMAND_QUEUE_AREA_SIZE   0x80000 /* 512K */
  34. #define COMMAND_QUEUE_THRESHOLD   0x1F
  35. #endif
  36. /* TW */
  37. #define HW_CURSOR_AREA_SIZE_315   0x4000  /* 16K */
  38. #define HW_CURSOR_AREA_SIZE_300   0x1000  /* 4K */
  39. #define OH_ALLOC_SIZE             4000
  40. #define SENTINEL                  0x7fffffff
  41. #define SEQ_ADR                   0x14
  42. #define SEQ_DATA                  0x15
  43. #define DAC_ADR                   0x18
  44. #define DAC_DATA                  0x19
  45. #define CRTC_ADR                  0x24
  46. #define CRTC_DATA                 0x25
  47. #define DAC2_ADR                  (0x16-0x30)
  48. #define DAC2_DATA                 (0x17-0x30)
  49. #define VB_PART1_ADR              (0x04-0x30)
  50. #define VB_PART1_DATA             (0x05-0x30)
  51. #define VB_PART2_ADR              (0x10-0x30)
  52. #define VB_PART2_DATA             (0x11-0x30)
  53. #define VB_PART3_ADR              (0x12-0x30)
  54. #define VB_PART3_DATA             (0x13-0x30)
  55. #define VB_PART4_ADR              (0x14-0x30)
  56. #define VB_PART4_DATA             (0x15-0x30)
  57. #define SISSR   SiS_Pr.SiS_P3c4
  58. #define SISCR                     SiS_Pr.SiS_P3d4
  59. #define SISDACA                   SiS_Pr.SiS_P3c8
  60. #define SISDACD                   SiS_Pr.SiS_P3c9
  61. #define SISPART1                  SiS_Pr.SiS_Part1Port
  62. #define SISPART2                  SiS_Pr.SiS_Part2Port
  63. #define SISPART3                  SiS_Pr.SiS_Part3Port
  64. #define SISPART4                  SiS_Pr.SiS_Part4Port
  65. #define SISPART5                  SiS_Pr.SiS_Part5Port
  66. #define SISDAC2A                  SISPART5
  67. #define SISDAC2D                  (SISPART5 + 1)
  68. #define SISMISCR                  (SiS_Pr.RelIO + 0x1c)
  69. #define IND_SIS_PASSWORD          0x05  /* SRs */
  70. #define IND_SIS_COLOR_MODE        0x06
  71. #define IND_SIS_RAMDAC_CONTROL    0x07
  72. #define IND_SIS_DRAM_SIZE         0x14
  73. #define IND_SIS_SCRATCH_REG_16    0x16
  74. #define IND_SIS_SCRATCH_REG_17    0x17
  75. #define IND_SIS_SCRATCH_REG_1A    0x1A
  76. #define IND_SIS_MODULE_ENABLE     0x1E
  77. #define IND_SIS_PCI_ADDRESS_SET   0x20
  78. #define IND_SIS_TURBOQUEUE_ADR    0x26
  79. #define IND_SIS_TURBOQUEUE_SET    0x27
  80. #define IND_SIS_POWER_ON_TRAP     0x38
  81. #define IND_SIS_POWER_ON_TRAP2    0x39
  82. #define IND_SIS_CMDQUEUE_SET      0x26
  83. #define IND_SIS_CMDQUEUE_THRESHOLD  0x27
  84. #define IND_SIS_SCRATCH_REG_CR30  0x30  /* CRs */
  85. #define IND_SIS_SCRATCH_REG_CR31  0x31
  86. #define IND_SIS_SCRATCH_REG_CR32  0x32
  87. #define IND_SIS_SCRATCH_REG_CR33  0x33
  88. #define IND_SIS_LCD_PANEL         0x36
  89. #define IND_SIS_SCRATCH_REG_CR37  0x37
  90. #define IND_SIS_AGP_IO_PAD        0x48
  91. #define IND_BRI_DRAM_STATUS       0x63 /* PCI config memory size offset */
  92. #define MMIO_QUEUE_PHYBASE        0x85C0
  93. #define MMIO_QUEUE_WRITEPORT      0x85C4
  94. #define MMIO_QUEUE_READPORT       0x85C8
  95. #define IND_SIS_CRT2_WRITE_ENABLE_300 0x24
  96. #define IND_SIS_CRT2_WRITE_ENABLE_315 0x2F
  97. #define SIS_PASSWORD              0x86  /* SR05 */
  98. #define SIS_INTERLACED_MODE       0x20  /* SR06 */
  99. #define SIS_8BPP_COLOR_MODE       0x0 
  100. #define SIS_15BPP_COLOR_MODE      0x1 
  101. #define SIS_16BPP_COLOR_MODE      0x2 
  102. #define SIS_32BPP_COLOR_MODE      0x4 
  103. #define SIS_DRAM_SIZE_MASK        0x3F  /* 300/630/730 SR14 */
  104. #define SIS_DRAM_SIZE_1MB         0x00
  105. #define SIS_DRAM_SIZE_2MB         0x01
  106. #define SIS_DRAM_SIZE_4MB         0x03
  107. #define SIS_DRAM_SIZE_8MB         0x07
  108. #define SIS_DRAM_SIZE_16MB        0x0F
  109. #define SIS_DRAM_SIZE_32MB        0x1F
  110. #define SIS_DRAM_SIZE_64MB        0x3F
  111. #define SIS_DATA_BUS_MASK         0xC0
  112. #define SIS_DATA_BUS_32           0x00
  113. #define SIS_DATA_BUS_64           0x01
  114. #define SIS_DATA_BUS_128          0x02
  115. #define SIS315_DRAM_SIZE_MASK     0xF0  /* 315 SR14 */
  116. #define SIS315_DRAM_SIZE_2MB      0x01
  117. #define SIS315_DRAM_SIZE_4MB      0x02
  118. #define SIS315_DRAM_SIZE_8MB      0x03
  119. #define SIS315_DRAM_SIZE_16MB     0x04
  120. #define SIS315_DRAM_SIZE_32MB     0x05
  121. #define SIS315_DRAM_SIZE_64MB     0x06
  122. #define SIS315_DRAM_SIZE_128MB    0x07
  123. #define SIS315_DATA_BUS_MASK      0x02
  124. #define SIS315_DATA_BUS_64        0x00
  125. #define SIS315_DATA_BUS_128       0x01
  126. #define SIS315_DUAL_CHANNEL_MASK  0x0C
  127. #define SIS315_SINGLE_CHANNEL_1_RANK   0x0
  128. #define SIS315_SINGLE_CHANNEL_2_RANK   0x1
  129. #define SIS315_ASYM_DDR    0x02
  130. #define SIS315_DUAL_CHANNEL_1_RANK     0x3
  131. #define SIS550_DRAM_SIZE_MASK     0x3F  /* 550/650/740 SR14 */
  132. #define SIS550_DRAM_SIZE_4MB      0x00
  133. #define SIS550_DRAM_SIZE_8MB      0x01
  134. #define SIS550_DRAM_SIZE_16MB     0x03
  135. #define SIS550_DRAM_SIZE_24MB     0x05
  136. #define SIS550_DRAM_SIZE_32MB     0x07
  137. #define SIS550_DRAM_SIZE_64MB     0x0F
  138. #define SIS550_DRAM_SIZE_96MB     0x17
  139. #define SIS550_DRAM_SIZE_128MB    0x1F
  140. #define SIS550_DRAM_SIZE_256MB    0x3F
  141. #define SIS_SCRATCH_REG_1A_MASK   0x10
  142. #define SIS_ENABLE_2D             0x40  /* SR1E */
  143. #define SIS_MEM_MAP_IO_ENABLE     0x01  /* SR20 */
  144. #define SIS_PCI_ADDR_ENABLE       0x80
  145. #define SIS_AGP_CMDQUEUE_ENABLE   0x80  /* 315/650/740 SR26 */
  146. #define SIS_VRAM_CMDQUEUE_ENABLE  0x40
  147. #define SIS_MMIO_CMD_ENABLE       0x20
  148. #define SIS_CMD_QUEUE_SIZE_512k   0x00
  149. #define SIS_CMD_QUEUE_SIZE_1M     0x04
  150. #define SIS_CMD_QUEUE_SIZE_2M     0x08
  151. #define SIS_CMD_QUEUE_SIZE_4M     0x0C
  152. #define SIS_CMD_QUEUE_RESET       0x01
  153. #define SIS_CMD_AUTO_CORR   0x02
  154. #define SIS_SIMULTANEOUS_VIEW_ENABLE  0x01  /* CR30 */
  155. #define SIS_MODE_SELECT_CRT2      0x02
  156. #define SIS_VB_OUTPUT_COMPOSITE   0x04
  157. #define SIS_VB_OUTPUT_SVIDEO      0x08
  158. #define SIS_VB_OUTPUT_SCART       0x10
  159. #define SIS_VB_OUTPUT_LCD         0x20
  160. #define SIS_VB_OUTPUT_CRT2        0x40
  161. #define SIS_VB_OUTPUT_HIVISION    0x80
  162. #define SIS_VB_OUTPUT_DISABLE     0x20  /* CR31 */
  163. #define SIS_DRIVER_MODE           0x40
  164. #define SIS_VB_COMPOSITE          0x01  /* CR32 */
  165. #define SIS_VB_SVIDEO             0x02
  166. #define SIS_VB_SCART              0x04
  167. #define SIS_VB_LCD                0x08
  168. #define SIS_VB_CRT2               0x10
  169. #define SIS_CRT1                  0x20
  170. #define SIS_VB_HIVISION           0x40
  171. #define SIS_VB_DVI                0x80
  172. #define SIS_VB_TV                 (SIS_VB_COMPOSITE | SIS_VB_SVIDEO | 
  173.                                    SIS_VB_SCART | SIS_VB_HIVISION)
  174. #define SIS_EXTERNAL_CHIP_MASK        0x0E  /* CR37 */
  175. #define SIS_EXTERNAL_CHIP_SIS301           0x01  /* in CR37 << 1 ! */
  176. #define SIS_EXTERNAL_CHIP_LVDS             0x02  /* in CR37 << 1 ! */
  177. #define SIS_EXTERNAL_CHIP_TRUMPION         0x03  /* in CR37 << 1 ! */
  178. #define SIS_EXTERNAL_CHIP_LVDS_CHRONTEL    0x04  /* in CR37 << 1 ! */
  179. #define SIS_EXTERNAL_CHIP_CHRONTEL         0x05  /* in CR37 << 1 ! */
  180. #define SIS310_EXTERNAL_CHIP_LVDS          0x02  /* in CR37 << 1 ! */
  181. #define SIS310_EXTERNAL_CHIP_LVDS_CHRONTEL 0x03  /* in CR37 << 1 ! */
  182. #define SIS_AGP_2X                0x20  /* CR48 */
  183. #define BRI_DRAM_SIZE_MASK        0x70  /* PCI bridge config data */
  184. #define BRI_DRAM_SIZE_2MB         0x00
  185. #define BRI_DRAM_SIZE_4MB         0x01
  186. #define BRI_DRAM_SIZE_8MB         0x02
  187. #define BRI_DRAM_SIZE_16MB        0x03
  188. #define BRI_DRAM_SIZE_32MB        0x04
  189. #define BRI_DRAM_SIZE_64MB        0x05
  190. #define HW_DEVICE_EXTENSION   SIS_HW_DEVICE_INFO
  191. #define PHW_DEVICE_EXTENSION      PSIS_HW_DEVICE_INFO
  192. #define SR_BUFFER_SIZE            5
  193. #define CR_BUFFER_SIZE            5
  194. /* Useful macros */
  195. #define inSISREG(base)          inb(base)
  196. #define outSISREG(base,val)     outb(val,base)
  197. #define orSISREG(base,val)      do { 
  198.                                   unsigned char __Temp = inb(base); 
  199.                                   outSISREG(base, __Temp | (val)); 
  200.                                 } while (0)
  201. #define andSISREG(base,val)     do { 
  202.                                   unsigned char __Temp = inb(base); 
  203.                                   outSISREG(base, __Temp & (val)); 
  204.                                 } while (0)
  205. #define inSISIDXREG(base,idx,var)   do { 
  206.                                       outb(idx,base); var=inb((base)+1); 
  207.                                     } while (0)
  208. #define outSISIDXREG(base,idx,val)  do { 
  209.                                       outb(idx,base); outb((val),(base)+1); 
  210.                                     } while (0)
  211. #define orSISIDXREG(base,idx,val)   do { 
  212.                                       unsigned char __Temp; 
  213.                                       outb(idx,base);   
  214.                                       __Temp = inb((base)+1)|(val); 
  215.                                       outSISIDXREG(base,idx,__Temp); 
  216.                                     } while (0)
  217. #define andSISIDXREG(base,idx,and)  do { 
  218.                                       unsigned char __Temp; 
  219.                                       outb(idx,base);   
  220.                                       __Temp = inb((base)+1)&(and); 
  221.                                       outSISIDXREG(base,idx,__Temp); 
  222.                                     } while (0)
  223. #define setSISIDXREG(base,idx,and,or)   do { 
  224.                                           unsigned char __Temp; 
  225.                                           outb(idx,base);   
  226.                                           __Temp = (inb((base)+1)&(and))|(or); 
  227.                                           outSISIDXREG(base,idx,__Temp); 
  228.                                         } while (0)
  229. /* ------------------- Global Variables ----------------------------- */
  230. /* Fbcon variables */
  231. static struct fb_info sis_fb_info;
  232. static struct display sis_disp;
  233. static int    video_type = FB_TYPE_PACKED_PIXELS;
  234. #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,33)
  235. static struct display_switch sisfb_sw;
  236. #endif
  237. static struct fb_var_screeninfo default_var = {
  238. xres:           0,
  239. yres:           0,
  240. xres_virtual:   0,
  241. yres_virtual:   0,
  242. xoffset:        0,
  243. yoffset:        0,
  244. bits_per_pixel: 0,
  245. grayscale:      0,
  246. red:            {0, 8, 0},
  247. green:          {0, 8, 0},
  248. blue:           {0, 8, 0},
  249. transp:         {0, 0, 0},
  250. nonstd:         0,
  251. activate:       FB_ACTIVATE_NOW,
  252. height:         -1,
  253. width:          -1,
  254. accel_flags:    0,
  255. pixclock:       0,
  256. left_margin:    0,
  257. right_margin:   0,
  258. upper_margin:   0,
  259. lower_margin:   0,
  260. hsync_len:      0,
  261. vsync_len:      0,
  262. sync:           0,
  263. vmode:          FB_VMODE_NONINTERLACED,
  264. reserved:       {0, 0, 0, 0, 0, 0}
  265. };
  266. static struct {
  267. u16 blue, green, red, pad;
  268. } sis_palette[256];
  269. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,34)
  270. static u32 pseudo_palette[17];
  271. #endif
  272. static union {
  273. #ifdef FBCON_HAS_CFB16
  274. u16 cfb16[16];
  275. #endif
  276. #ifdef FBCON_HAS_CFB24
  277. u32 cfb24[16];
  278. #endif
  279. #ifdef FBCON_HAS_CFB32
  280. u32 cfb32[16];
  281. #endif
  282. } sis_fbcon_cmap;
  283. /* display status */
  284. static int sisfb_off = 0;
  285. static int sisfb_crt1off = 0;
  286. static int sisfb_forcecrt1 = -1;
  287. static int sisfb_inverse = 0;
  288. static int sisvga_enabled = 0;
  289. #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,23)
  290. static int currcon = 0;
  291. #endif
  292. /* global flags */
  293. static int sisfb_tvmode = 0;
  294. static int sisfb_mem = 0;
  295. static int sisfb_pdc = 0;
  296. static int enable_dstn = 0;
  297. static int sisfb_accel = -1;
  298. static int sisfb_ypan = -1;
  299. VGA_ENGINE sisvga_engine = UNKNOWN_VGA;
  300. /* TW: These are to adapted according to VGA_ENGINE type */
  301. static int sisfb_hwcursor_size = 0;
  302. static int sisfb_CRT2_write_enable = 0;
  303. int sisfb_crt2type  = -1; /* TW: CRT2 type (for overriding autodetection) */
  304. int sisfb_tvplug    = -1; /* PR: Tv plug type (for overriding autodetection) */
  305. int sisfb_queuemode = -1;  /* TW: Use MMIO queue mode by default (310/325 series only) */
  306. /* data for sis components */
  307. struct video_info ivideo;
  308. /* TW: For ioctl SISFB_GET_INFO */
  309. sisfb_info sisfbinfo;
  310. /* TW: Hardware extension; contains data on hardware */
  311. HW_DEVICE_EXTENSION sishw_ext = {
  312. NULL, NULL, FALSE, NULL, NULL,
  313. 0, 0, 0, 0, 0, 0, 0, 0, 0,
  314. NULL, NULL, NULL, NULL,
  315. {0, 0, 0, 0},
  316. 0
  317. };
  318. /* TW: SiS private structure */
  319. SiS_Private  SiS_Pr;
  320. /* card parameters */
  321. static unsigned long sisfb_mmio_size = 0;
  322. static u8            sisfb_caps = 0;
  323. typedef enum _SIS_CMDTYPE {
  324. MMIO_CMD = 0,
  325. AGP_CMD_QUEUE,
  326. VM_CMD_QUEUE,
  327. } SIS_CMDTYPE;
  328. /* Supported SiS Chips list */
  329. static struct board {
  330. u16 vendor, device;
  331. const char *name;
  332. } sisdev_list[] = {
  333. {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_300,     "SIS 300"},
  334. {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_540_VGA, "SIS 540 VGA"},
  335. {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_630_VGA, "SIS 630/730 VGA"},
  336. {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_315H,    "SIS 315H"},
  337. {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_315,     "SIS 315"},
  338. {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_315PRO,  "SIS 315PRO"},
  339. {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_550_VGA, "SIS 550 VGA"},
  340. {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_650_VGA, "SIS 650/M650/651/740 VGA"},
  341. {0, 0, NULL}
  342. };
  343. #define MD_SIS300 1
  344. #define MD_SIS315 2
  345. /* mode table */
  346. /* NOT const - will be patched for 1280x960 mode number chaos reasons */
  347. struct _sisbios_mode {
  348. char name[15];
  349. u8 mode_no;
  350. u16 vesa_mode_no_1;  /* "SiS defined" VESA mode number */
  351. u16 vesa_mode_no_2;  /* Real VESA mode numbers */
  352. u16 xres;
  353. u16 yres;
  354. u16 bpp;
  355. u16 rate_idx;
  356. u16 cols;
  357. u16 rows;
  358. u8  chipset;
  359. } sisbios_mode[] = {
  360. #define MODE_INDEX_NONE           0  /* TW: index for mode=none */
  361. {"none",         0xFF, 0x0000, 0x0000,    0,    0,  0, 0,   0,  0, MD_SIS300|MD_SIS315},  /* TW: for mode "none" */
  362. {"320x240x16",   0x56, 0x0000, 0x0000,  320,  240, 16, 1,  40, 15,           MD_SIS315},
  363. {"320x480x8",    0x5A, 0x0000, 0x0000,  320,  480,  8, 1,  40, 30,           MD_SIS315},  /* TW: FSTN */
  364. {"320x480x16",   0x5B, 0x0000, 0x0000,  320,  480, 16, 1,  40, 30,           MD_SIS315},  /* TW: FSTN */
  365. {"640x480x8",    0x2E, 0x0101, 0x0101,  640,  480,  8, 1,  80, 30, MD_SIS300|MD_SIS315},
  366. {"640x480x16",   0x44, 0x0111, 0x0111,  640,  480, 16, 1,  80, 30, MD_SIS300|MD_SIS315},
  367. {"640x480x24",   0x62, 0x013a, 0x0112,  640,  480, 32, 1,  80, 30, MD_SIS300|MD_SIS315},  /* TW: That's for people who mix up color- and fb depth */
  368. {"640x480x32",   0x62, 0x013a, 0x0112,  640,  480, 32, 1,  80, 30, MD_SIS300|MD_SIS315},
  369. {"720x480x8",    0x31, 0x0000, 0x0000,  720,  480,  8, 1,  90, 30, MD_SIS300|MD_SIS315},
  370. {"720x480x16",   0x33, 0x0000, 0x0000,  720,  480, 16, 1,  90, 30, MD_SIS300|MD_SIS315},
  371. {"720x480x24",   0x35, 0x0000, 0x0000,  720,  480, 32, 1,  90, 30, MD_SIS300|MD_SIS315},
  372. {"720x480x32",   0x35, 0x0000, 0x0000,  720,  480, 32, 1,  90, 30, MD_SIS300|MD_SIS315},
  373. {"720x576x8",    0x32, 0x0000, 0x0000,  720,  576,  8, 1,  90, 36, MD_SIS300|MD_SIS315},
  374. {"720x576x16",   0x34, 0x0000, 0x0000,  720,  576, 16, 1,  90, 36, MD_SIS300|MD_SIS315},
  375. {"720x576x24",   0x36, 0x0000, 0x0000,  720,  576, 32, 1,  90, 36, MD_SIS300|MD_SIS315},
  376. {"720x576x32",   0x36, 0x0000, 0x0000,  720,  576, 32, 1,  90, 36, MD_SIS300|MD_SIS315},
  377. {"800x480x8",    0x70, 0x0000, 0x0000,  800,  480,  8, 1, 100, 30,           MD_SIS315},  /* TW: 310/325 series only */
  378. {"800x480x16",   0x7a, 0x0000, 0x0000,  800,  480, 16, 1, 100, 30,           MD_SIS315},
  379. {"800x480x24",   0x76, 0x0000, 0x0000,  800,  480, 32, 1, 100, 30,           MD_SIS315},
  380. {"800x480x32",   0x76, 0x0000, 0x0000,  800,  480, 32, 1, 100, 30,           MD_SIS315},
  381. #define DEFAULT_MODE              20 /* TW: index for 800x600x8 */
  382. #define DEFAULT_LCDMODE           20 /* TW: index for 800x600x8 */
  383. #define DEFAULT_TVMODE            20 /* TW: index for 800x600x8 */
  384. {"800x600x8",    0x30, 0x0103, 0x0103,  800,  600,  8, 2, 100, 37, MD_SIS300|MD_SIS315},
  385. {"800x600x16",   0x47, 0x0114, 0x0114,  800,  600, 16, 2, 100, 37, MD_SIS300|MD_SIS315},
  386. {"800x600x24",   0x63, 0x013b, 0x0115,  800,  600, 32, 2, 100, 37, MD_SIS300|MD_SIS315},
  387. {"800x600x32",   0x63, 0x013b, 0x0115,  800,  600, 32, 2, 100, 37, MD_SIS300|MD_SIS315},
  388. {"1024x576x8",   0x71, 0x0000, 0x0000, 1024,  576,  8, 1, 128, 36,           MD_SIS315},  /* TW: 310/325 series only */
  389. {"1024x576x16",  0x74, 0x0000, 0x0000, 1024,  576, 16, 1, 128, 36,           MD_SIS315},
  390. {"1024x576x24",  0x77, 0x0000, 0x0000, 1024,  576, 32, 1, 128, 36,           MD_SIS315},
  391. {"1024x576x32",  0x77, 0x0000, 0x0000, 1024,  576, 32, 1, 128, 36,           MD_SIS315},
  392. {"1024x600x8",   0x20, 0x0000, 0x0000, 1024,  600,  8, 1, 128, 37, MD_SIS300          },  /* TW: 300 series only */
  393. {"1024x600x16",  0x21, 0x0000, 0x0000, 1024,  600, 16, 1, 128, 37, MD_SIS300          },
  394. {"1024x600x24",  0x22, 0x0000, 0x0000, 1024,  600, 32, 1, 128, 37, MD_SIS300          },
  395. {"1024x600x32",  0x22, 0x0000, 0x0000, 1024,  600, 32, 1, 128, 37, MD_SIS300          },
  396. {"1024x768x8",   0x38, 0x0105, 0x0105, 1024,  768,  8, 2, 128, 48, MD_SIS300          },
  397. {"1024x768x16",  0x4A, 0x0117, 0x0117, 1024,  768, 16, 2, 128, 48, MD_SIS300          },
  398. {"1024x768x24",  0x64, 0x013c, 0x0118, 1024,  768, 32, 2, 128, 48, MD_SIS300          },
  399. {"1024x768x32",  0x64, 0x013c, 0x0118, 1024,  768, 32, 2, 128, 48, MD_SIS300          },
  400. {"1152x768x8",   0x23, 0x0000, 0x0000, 1152,  768,  8, 1, 144, 48, MD_SIS300          },  /* TW: 300 series only */
  401. {"1152x768x16",  0x24, 0x0000, 0x0000, 1152,  768, 16, 1, 144, 48, MD_SIS300          },
  402. {"1152x768x24",  0x25, 0x0000, 0x0000, 1152,  768, 32, 1, 144, 48, MD_SIS300          },
  403. {"1152x768x32",  0x25, 0x0000, 0x0000, 1152,  768, 32, 1, 144, 48, MD_SIS300          },
  404. {"1280x720x8",   0x79, 0x0000, 0x0000, 1280,  720,  8, 1, 160, 45,           MD_SIS315},  /* TW: 310/325 series only */
  405. {"1280x720x16",  0x75, 0x0000, 0x0000, 1280,  720, 16, 1, 160, 45,           MD_SIS315},
  406. {"1280x720x24",  0x78, 0x0000, 0x0000, 1280,  720, 32, 1, 160, 45,           MD_SIS315},
  407. {"1280x720x32",  0x78, 0x0000, 0x0000, 1280,  720, 32, 1, 160, 45,           MD_SIS315},
  408. {"1280x768x8",   0x23, 0x0000, 0x0000, 1280,  768,  8, 1, 160, 48,           MD_SIS315},  /* TW: 310/325 series only */
  409. {"1280x768x16",  0x24, 0x0000, 0x0000, 1280,  768, 16, 1, 160, 48,           MD_SIS315},
  410. {"1280x768x24",  0x25, 0x0000, 0x0000, 1280,  768, 32, 1, 160, 48,           MD_SIS315},
  411. {"1280x768x32",  0x25, 0x0000, 0x0000, 1280,  768, 32, 1, 160, 48,           MD_SIS315},
  412. #define MODEINDEX_1280x960 48
  413. {"1280x960x8",   0x7C, 0x0000, 0x0000, 1280,  960,  8, 1, 160, 60, MD_SIS300|MD_SIS315},  /* TW: Modenumbers being patched */
  414. {"1280x960x16",  0x7D, 0x0000, 0x0000, 1280,  960, 16, 1, 160, 60, MD_SIS300|MD_SIS315},
  415. {"1280x960x24",  0x7E, 0x0000, 0x0000, 1280,  960, 32, 1, 160, 60, MD_SIS300|MD_SIS315},
  416. {"1280x960x32",  0x7E, 0x0000, 0x0000, 1280,  960, 32, 1, 160, 60, MD_SIS300|MD_SIS315},
  417. {"1280x1024x8",  0x3A, 0x0107, 0x0107, 1280, 1024,  8, 2, 160, 64, MD_SIS300|MD_SIS315},
  418. {"1280x1024x16", 0x4D, 0x011a, 0x011a, 1280, 1024, 16, 2, 160, 64, MD_SIS300|MD_SIS315},
  419. {"1280x1024x24", 0x65, 0x013d, 0x011b, 1280, 1024, 32, 2, 160, 64, MD_SIS300|MD_SIS315},
  420. {"1280x1024x32", 0x65, 0x013d, 0x011b, 1280, 1024, 32, 2, 160, 64, MD_SIS300|MD_SIS315},
  421. {"1400x1050x8",  0x26, 0x0000, 0x0000, 1400, 1050,  8, 1, 175, 65,           MD_SIS315},  /* TW: 310/325 series only */
  422. {"1400x1050x16", 0x27, 0x0000, 0x0000, 1400, 1050, 16, 1, 175, 65,           MD_SIS315},
  423. {"1400x1050x24", 0x28, 0x0000, 0x0000, 1400, 1050, 32, 1, 175, 65,           MD_SIS315},
  424. {"1400x1050x32", 0x28, 0x0000, 0x0000, 1400, 1050, 32, 1, 175, 65,           MD_SIS315},
  425. {"1600x1200x8",  0x3C, 0x0130, 0x011c, 1600, 1200,  8, 1, 200, 75, MD_SIS300|MD_SIS315},
  426. {"1600x1200x16", 0x3D, 0x0131, 0x011e, 1600, 1200, 16, 1, 200, 75, MD_SIS300|MD_SIS315},
  427. {"1600x1200x24", 0x66, 0x013e, 0x011f, 1600, 1200, 32, 1, 200, 75, MD_SIS300|MD_SIS315},
  428. {"1600x1200x32", 0x66, 0x013e, 0x011f, 1600, 1200, 32, 1, 200, 75, MD_SIS300|MD_SIS315},
  429. {"1920x1440x8",  0x68, 0x013f, 0x0000, 1920, 1440,  8, 1, 240, 75, MD_SIS300|MD_SIS315},
  430. {"1920x1440x16", 0x69, 0x0140, 0x0000, 1920, 1440, 16, 1, 240, 75, MD_SIS300|MD_SIS315},
  431. {"1920x1440x24", 0x6B, 0x0141, 0x0000, 1920, 1440, 32, 1, 240, 75, MD_SIS300|MD_SIS315},
  432. {"1920x1440x32", 0x6B, 0x0141, 0x0000, 1920, 1440, 32, 1, 240, 75, MD_SIS300|MD_SIS315},
  433. {"2048x1536x8",  0x6c, 0x0000, 0x0000, 2048, 1536,  8, 1, 256, 96,           MD_SIS315},  /* TW: 310/325 series only */
  434. {"2048x1536x16", 0x6d, 0x0000, 0x0000, 2048, 1536, 16, 1, 256, 96,           MD_SIS315},
  435. {"2048x1536x24", 0x6e, 0x0000, 0x0000, 2048, 1536, 32, 1, 256, 96,           MD_SIS315},
  436. {"2048x1536x32", 0x6e, 0x0000, 0x0000, 2048, 1536, 32, 1, 256, 96,           MD_SIS315},
  437. {"", 0x00, 0, 0, 0, 0, 0, 0, 0}
  438. };
  439. /* mode-related variables */
  440. #ifdef MODULE
  441. int sisfb_mode_idx = MODE_INDEX_NONE;  /* Don't use a mode by default if we are a module */
  442. #else
  443. int sisfb_mode_idx = -1;               /* Use a default mode if we are inside the kernel */
  444. #endif
  445. u8  sisfb_mode_no  = 0;
  446. u8  sisfb_rate_idx = 0;
  447. /* TW: CR36 evaluation */
  448. const USHORT sis300paneltype[] =
  449.     { LCD_UNKNOWN,   LCD_800x600,  LCD_1024x768,  LCD_1280x1024,
  450.       LCD_1280x960,  LCD_640x480,  LCD_1024x600,  LCD_1152x768,
  451.       LCD_320x480,   LCD_1024x768, LCD_1024x768,  LCD_1024x768,
  452.       LCD_1024x768,  LCD_1024x768, LCD_1024x768,  LCD_1024x768 };
  453. const USHORT sis310paneltype[] =
  454.     { LCD_UNKNOWN,   LCD_800x600,  LCD_1024x768,  LCD_1280x1024,
  455.       LCD_640x480,   LCD_1024x600, LCD_1152x864,  LCD_1280x960,
  456.       LCD_1152x768,  LCD_1400x1050,LCD_1280x768,  LCD_1600x1200,
  457.       LCD_320x480,   LCD_1024x768, LCD_1024x768,  LCD_1024x768 };
  458. static const struct _sis_crt2type {
  459. char name[10];
  460. int type_no;
  461. int tvplug_no;
  462. } sis_crt2type[] = {
  463. {"NONE",  0,  -1},
  464. {"LCD",   DISPTYPE_LCD,  -1},
  465. {"TV",    DISPTYPE_TV,  -1},
  466. {"VGA",   DISPTYPE_CRT2,  -1},
  467. {"SVIDEO",  DISPTYPE_TV,  TVPLUG_SVIDEO},
  468. {"COMPOSITE",  DISPTYPE_TV,  TVPLUG_COMPOSITE},
  469. {"SCART",  DISPTYPE_TV,  TVPLUG_SCART},
  470. {"none",  0,  -1},
  471. {"lcd",   DISPTYPE_LCD,  -1},
  472. {"tv",    DISPTYPE_TV,  -1},
  473. {"vga",   DISPTYPE_CRT2,  -1},
  474. {"svideo",  DISPTYPE_TV,  TVPLUG_SVIDEO},
  475. {"composite",  DISPTYPE_TV,  TVPLUG_COMPOSITE},
  476. {"scart",  DISPTYPE_TV,  TVPLUG_SCART},
  477. {"",   -1,  -1}
  478. };
  479. /* Queue mode selection for 310 series */
  480. static const struct _sis_queuemode {
  481. char name[6];
  482. int type_no;
  483. } sis_queuemode[] = {
  484. {"AGP",   AGP_CMD_QUEUE},
  485. {"VRAM",  VM_CMD_QUEUE},
  486. {"MMIO",  MMIO_CMD},
  487. {"agp",   AGP_CMD_QUEUE},
  488. {"vram",  VM_CMD_QUEUE},
  489. {"mmio",  MMIO_CMD},
  490. {"",    -1}
  491. };
  492. static const struct _sis_vrate {
  493. u16 idx;
  494. u16 xres;
  495. u16 yres;
  496. u16 refresh;
  497. } sisfb_vrate[] = {
  498. {1,  640,  480, 60}, {2,  640,  480,  72}, {3, 640,   480,  75}, {4,  640, 480,  85},
  499. {5,  640,  480,100}, {6,  640,  480, 120}, {7, 640,   480, 160}, {8,  640, 480, 200},
  500. {1,  720,  480, 60},
  501. {1,  720,  576, 58},
  502. {1,  800,  480, 60}, {2,  800,  480,  75}, {3, 800,   480,  85},
  503. {1,  800,  600, 56}, {2,  800,  600,  60}, {3, 800,   600,  72}, {4,  800, 600,  75},
  504. {5,  800,  600, 85}, {6,  800,  600, 100}, {7, 800,   600, 120}, {8,  800, 600, 160},
  505. {1, 1024,  768, 43}, {2, 1024,  768,  60}, {3, 1024,  768,  70}, {4, 1024, 768,  75},
  506. {5, 1024,  768, 85}, {6, 1024,  768, 100}, {7, 1024,  768, 120},
  507. {1, 1024,  576, 60}, {2, 1024,  576,  65}, {3, 1024,  576,  75},
  508. {1, 1024,  600, 60},
  509. {1, 1152,  768, 60},
  510. {1, 1280,  720, 60}, {2, 1280,  720,  75}, {3, 1280,  720,  85},
  511. {1, 1280,  768, 60},
  512. {1, 1280, 1024, 43}, {2, 1280, 1024,  60}, {3, 1280, 1024,  75}, {4, 1280, 1024,  85},
  513. {1, 1280,  960, 60},
  514. {1, 1400, 1050, 60},
  515. {1, 1600, 1200, 60}, {2, 1600, 1200,  65}, {3, 1600, 1200,  70}, {4, 1600, 1200,  75},
  516. {5, 1600, 1200, 85}, {6, 1600, 1200, 100}, {7, 1600, 1200, 120},
  517. /* TW: Clock values for 1920x1440 guessed (except for the first one) */
  518. {1, 1920, 1440, 60}, {2, 1920, 1440,  70}, {3, 1920, 1440,  75}, {4, 1920, 1440,  85},
  519. {5, 1920, 1440,100}, {6, 1920, 1440, 120},
  520. /* TW: Clock values for 2048x1536 guessed */
  521. {1, 2048, 1536, 60}, {2, 2048, 1536,  70}, {3, 2048, 1536,  75}, {4, 2048, 1536,  85},
  522. {5, 2048, 1536,100},
  523. {0, 0, 0, 0}
  524. };
  525. /* Offscreen layout */
  526. typedef struct _SIS_GLYINFO {
  527. unsigned char ch;
  528. int fontwidth;
  529. int fontheight;
  530. u8 gmask[72];
  531. int ngmask;
  532. } SIS_GLYINFO;
  533. typedef struct _SIS_OH {
  534. struct _SIS_OH *poh_next;
  535. struct _SIS_OH *poh_prev;
  536. unsigned long offset;
  537. unsigned long size;
  538. } SIS_OH;
  539. typedef struct _SIS_OHALLOC {
  540. struct _SIS_OHALLOC *poha_next;
  541. SIS_OH aoh[1];
  542. } SIS_OHALLOC;
  543. typedef struct _SIS_HEAP {
  544. SIS_OH oh_free;
  545. SIS_OH oh_used;
  546. SIS_OH *poh_freelist;
  547. SIS_OHALLOC *poha_chain;
  548. unsigned long max_freesize;
  549. } SIS_HEAP;
  550. static unsigned long sisfb_hwcursor_vbase;
  551. static unsigned long sisfb_heap_start;
  552. static unsigned long sisfb_heap_end;
  553. static unsigned long sisfb_heap_size;
  554. static SIS_HEAP      sisfb_heap;
  555. // Eden Chen
  556. static const struct _sis_TV_filter {
  557. u8 filter[9][4];
  558. } sis_TV_filter[] = {
  559. { {{0x00,0x00,0x00,0x40},  /* NTSCFilter_0 */
  560.    {0x00,0xE0,0x10,0x60},
  561.    {0x00,0xEE,0x10,0x44},
  562.    {0x00,0xF4,0x10,0x38},
  563.    {0xF8,0xF4,0x18,0x38},
  564.    {0xFC,0xFB,0x14,0x2A},
  565.    {0x00,0x00,0x10,0x20},
  566.    {0x00,0x04,0x10,0x18}, 
  567.    {0xFF,0xFF,0xFF,0xFF} }},
  568. { {{0x00,0x00,0x00,0x40},  /* NTSCFilter_1 */
  569.    {0x00,0xE0,0x10,0x60},
  570.    {0x00,0xEE,0x10,0x44},
  571.    {0x00,0xF4,0x10,0x38},
  572.    {0xF8,0xF4,0x18,0x38},
  573.    {0xFC,0xFB,0x14,0x2A},
  574.    {0x00,0x00,0x10,0x20},
  575.    {0x00,0x04,0x10,0x18}, 
  576.    {0xFF,0xFF,0xFF,0xFF} }},
  577. { {{0x00,0x00,0x00,0x40},  /* NTSCFilter_2 */
  578.    {0xF5,0xEE,0x1B,0x44},
  579.    {0xF8,0xF4,0x18,0x38},
  580.    {0xEB,0x04,0x25,0x18},
  581.    {0xF1,0x05,0x1F,0x16},
  582.    {0xF6,0x06,0x1A,0x14},
  583.    {0xFA,0x06,0x16,0x14},
  584.    {0x00,0x04,0x10,0x18}, 
  585.    {0xFF,0xFF,0xFF,0xFF} }},
  586. { {{0x00,0x00,0x00,0x40},  /* NTSCFilter_3 */
  587.    {0xF1,0x04,0x1F,0x18},
  588.    {0xEE,0x0D,0x22,0x06},
  589.    {0xF7,0x06,0x19,0x14},
  590.    {0xF4,0x0B,0x1C,0x0A},
  591.    {0xFA,0x07,0x16,0x12},
  592.    {0xF9,0x0A,0x17,0x0C},
  593.    {0x00,0x07,0x10,0x12}, 
  594.    {0xFF,0xFF,0xFF,0xFF} }},
  595. { {{0x00,0x00,0x00,0x40},  /* NTSCFilter_4 */
  596.    {0x00,0xE0,0x10,0x60},
  597.    {0x00,0xEE,0x10,0x44},
  598.    {0x00,0xF4,0x10,0x38},
  599.    {0xF8,0xF4,0x18,0x38},
  600.    {0xFC,0xFB,0x14,0x2A},
  601.    {0x00,0x00,0x10,0x20},
  602.    {0x00,0x04,0x10,0x18}, 
  603.    {0xFF,0xFF,0xFF,0xFF} }},
  604. { {{0x00,0x00,0x00,0x40},  /* NTSCFilter_5 */
  605.    {0xF5,0xEE,0x1B,0x44},
  606.    {0xF8,0xF4,0x18,0x38},
  607.    {0xEB,0x04,0x25,0x18},
  608.    {0xF1,0x05,0x1F,0x16},
  609.    {0xF6,0x06,0x1A,0x14},
  610.    {0xFA,0x06,0x16,0x14},
  611.    {0x00,0x04,0x10,0x18}, 
  612.    {0xFF,0xFF,0xFF,0xFF} }},
  613. { {{0x00,0x00,0x00,0x40},  /* NTSCFilter_6 */
  614.    {0xEB,0x04,0x25,0x18},
  615.    {0xE7,0x0E,0x29,0x04},
  616.    {0xEE,0x0C,0x22,0x08},
  617.    {0xF6,0x0B,0x1A,0x0A},
  618.    {0xF9,0x0A,0x17,0x0C},
  619.    {0xFC,0x0A,0x14,0x0C},
  620.    {0x00,0x08,0x10,0x10}, 
  621.    {0xFF,0xFF,0xFF,0xFF} }},
  622. { {{0x00,0x00,0x00,0x40},  /* NTSCFilter_7 */
  623.    {0xEC,0x02,0x24,0x1C},
  624.    {0xF2,0x04,0x1E,0x18},
  625.    {0xEB,0x15,0x25,0xF6},
  626.    {0xF4,0x10,0x1C,0x00},
  627.    {0xF8,0x0F,0x18,0x02},
  628.    {0x00,0x04,0x10,0x18},
  629.    {0x01,0x06,0x0F,0x14}, 
  630.    {0xFF,0xFF,0xFF,0xFF} }},
  631. { {{0x00,0x00,0x00,0x40},  /* PALFilter_0 */
  632.    {0x00,0xE0,0x10,0x60},
  633.    {0x00,0xEE,0x10,0x44},
  634.    {0x00,0xF4,0x10,0x38},
  635.    {0xF8,0xF4,0x18,0x38},
  636.    {0xFC,0xFB,0x14,0x2A},
  637.    {0x00,0x00,0x10,0x20},
  638.    {0x00,0x04,0x10,0x18}, 
  639.    {0xFF,0xFF,0xFF,0xFF} }},
  640. { {{0x00,0x00,0x00,0x40},  /* PALFilter_1 */
  641.    {0x00,0xE0,0x10,0x60},
  642.    {0x00,0xEE,0x10,0x44},
  643.    {0x00,0xF4,0x10,0x38},
  644.    {0xF8,0xF4,0x18,0x38},
  645.    {0xFC,0xFB,0x14,0x2A},
  646.    {0x00,0x00,0x10,0x20},
  647.    {0x00,0x04,0x10,0x18}, 
  648.    {0xFF,0xFF,0xFF,0xFF} }},
  649. { {{0x00,0x00,0x00,0x40},  /* PALFilter_2 */
  650.    {0xF5,0xEE,0x1B,0x44},
  651.    {0xF8,0xF4,0x18,0x38},
  652.    {0xF1,0xF7,0x01,0x32},
  653.    {0xF5,0xFB,0x1B,0x2A},
  654.    {0xF9,0xFF,0x17,0x22},
  655.    {0xFB,0x01,0x15,0x1E},
  656.    {0x00,0x04,0x10,0x18}, 
  657.    {0xFF,0xFF,0xFF,0xFF} }},
  658. { {{0x00,0x00,0x00,0x40},  /* PALFilter_3 */
  659.    {0xF5,0xFB,0x1B,0x2A},
  660.    {0xEE,0xFE,0x22,0x24},
  661.    {0xF3,0x00,0x1D,0x20},
  662.    {0xF9,0x03,0x17,0x1A},
  663.    {0xFB,0x02,0x14,0x1E},
  664.    {0xFB,0x04,0x15,0x18},
  665.    {0x00,0x06,0x10,0x14}, 
  666.    {0xFF,0xFF,0xFF,0xFF} }},
  667. { {{0x00,0x00,0x00,0x40},  /* PALFilter_4 */
  668.    {0x00,0xE0,0x10,0x60},
  669.    {0x00,0xEE,0x10,0x44},
  670.    {0x00,0xF4,0x10,0x38},
  671.    {0xF8,0xF4,0x18,0x38},
  672.    {0xFC,0xFB,0x14,0x2A},
  673.    {0x00,0x00,0x10,0x20},
  674.    {0x00,0x04,0x10,0x18}, 
  675.    {0xFF,0xFF,0xFF,0xFF} }},
  676. { {{0x00,0x00,0x00,0x40},  /* PALFilter_5 */
  677.    {0xF5,0xEE,0x1B,0x44},
  678.    {0xF8,0xF4,0x18,0x38},
  679.    {0xF1,0xF7,0x1F,0x32},
  680.    {0xF5,0xFB,0x1B,0x2A},
  681.    {0xF9,0xFF,0x17,0x22},
  682.    {0xFB,0x01,0x15,0x1E},
  683.    {0x00,0x04,0x10,0x18}, 
  684.    {0xFF,0xFF,0xFF,0xFF} }},
  685. { {{0x00,0x00,0x00,0x40},  /* PALFilter_6 */
  686.    {0xF5,0xEE,0x1B,0x2A},
  687.    {0xEE,0xFE,0x22,0x24},
  688.    {0xF3,0x00,0x1D,0x20},
  689.    {0xF9,0x03,0x17,0x1A},
  690.    {0xFB,0x02,0x14,0x1E},
  691.    {0xFB,0x04,0x15,0x18},
  692.    {0x00,0x06,0x10,0x14}, 
  693.    {0xFF,0xFF,0xFF,0xFF} }},
  694. { {{0x00,0x00,0x00,0x40},  /* PALFilter_7 */
  695.    {0xF5,0xEE,0x1B,0x44},
  696.    {0xF8,0xF4,0x18,0x38},
  697.    {0xFC,0xFB,0x14,0x2A},
  698.    {0xEB,0x05,0x25,0x16},
  699.    {0xF1,0x05,0x1F,0x16},
  700.    {0xFA,0x07,0x16,0x12},
  701.    {0x00,0x07,0x10,0x12}, 
  702.    {0xFF,0xFF,0xFF,0xFF} }}
  703. };
  704. static int           filter = -1;
  705. static unsigned char filter_tb;
  706. //~Eden Chen
  707. /* ---------------------- Routine prototypes ------------------------- */
  708. /* Interface used by the world */
  709. #ifndef MODULE
  710. int             sisfb_setup(char *options);
  711. #endif
  712. static int      sisfb_get_fix(struct fb_fix_screeninfo *fix, int con,
  713. struct fb_info *info);
  714. static int      sisfb_get_var(struct fb_var_screeninfo *var, int con,
  715. struct fb_info *info);
  716. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,34)
  717. static int      sisfb_set_par(struct fb_info *info);
  718. #endif
  719. #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,33)
  720. static int      sisfb_set_var(struct fb_var_screeninfo *var, int con,
  721. struct fb_info *info);
  722. static int      sisfb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
  723. struct fb_info *info);
  724. static int      sisfb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
  725. struct fb_info *info);
  726. #endif
  727. static int      sisfb_ioctl(struct inode *inode, struct file *file,
  728.         unsigned int cmd, unsigned long arg, int con,
  729.         struct fb_info *info);
  730. /* Interface to the low level console driver */
  731. int             sisfb_init(void);
  732. #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,33)
  733. static int      sisfb_update_var(int con, struct fb_info *info);
  734. static int      sisfb_switch(int con, struct fb_info *info);
  735. #endif
  736. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,34)
  737. static int      sisfb_blank(int blank, struct fb_info *info);
  738. #else
  739. static void     sisfb_blank(int blank, struct fb_info *info);
  740. #endif
  741. /* hardware access routines */
  742. void            sisfb_set_reg4(u16 port, unsigned long data);
  743. u32             sisfb_get_reg3(u16 port);
  744. /* 2D accelerator functions */
  745. extern int      sisfb_initaccel(void);
  746. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,34)
  747. extern void     fbcon_sis_fillrect(struct fb_info *info, struct fb_fillrect *rect);
  748. extern void     fbcon_sis_copyarea(struct fb_info *info, struct fb_copyarea *area);
  749. extern void     cfb_imageblit(struct fb_info *info, struct fb_image *image);
  750. #endif
  751. /* Internal routines */
  752. static void     sisfb_search_mode(const char *name);
  753. static int      sisfb_validate_mode(int modeindex);
  754. static u8       sisfb_search_refresh_rate(unsigned int rate);
  755. static int      sisfb_setcolreg(unsigned regno, unsigned red, unsigned green,
  756. unsigned blue, unsigned transp,
  757. struct fb_info *fb_info);
  758. static int      sisfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
  759.        struct fb_info *info);
  760. #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,33)
  761. static void     sisfb_set_disp(int con, struct fb_var_screeninfo *var, struct fb_info *info);
  762. static int      sis_getcolreg(unsigned regno, unsigned *red, unsigned *green,
  763. unsigned *blue, unsigned *transp,
  764. struct fb_info *fb_info);
  765. static void     sisfb_do_install_cmap(int con, struct fb_info *info);
  766. #endif
  767. static void     sisfb_pre_setmode(void);
  768. static void     sisfb_post_setmode(void);
  769. static void     sisfb_crtc_to_var(struct fb_var_screeninfo *var);
  770. /* Chipset-dependent Routines */
  771. #ifdef CONFIG_FB_SIS_300
  772. static int      sisfb_get_dram_size_300(void);
  773. static void     sisfb_detect_VB_connect_300(void);
  774. static void     sisfb_get_VB_type_300(void);
  775. static int      sisfb_has_VB_300(void);
  776. #endif
  777. #ifdef CONFIG_FB_SIS_315
  778. static int      sisfb_get_dram_size_315(void);
  779. static void     sisfb_detect_VB_connect_315(void);
  780. static void     sisfb_get_VB_type_315(void);
  781. static int      sisfb_has_VB_315(void);
  782. #endif
  783. /* TW: Sensing routines */
  784. void            SiS_Sense30x(void);
  785. int             SISDoSense(int tempbl, int tempbh, int tempcl, int tempch);
  786. void            SiS_SenseCh(void);
  787. /* Routines from init.c/init301.c */
  788. extern void  SiSRegInit(SiS_Private *SiS_Pr, USHORT BaseAddr);
  789. extern BOOLEAN  SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
  790. extern BOOLEAN  SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo);
  791. extern void     SetEnableDstn(SiS_Private *SiS_Pr);
  792. extern void     SiS_LongWait(SiS_Private *SiS_Pr);
  793. /* TW: Chrontel TV functions */
  794. extern USHORT  SiS_GetCH700x(SiS_Private *SiS_Pr, USHORT tempbx);
  795. extern void  SiS_SetCH700x(SiS_Private *SiS_Pr, USHORT tempbx);
  796. extern USHORT  SiS_GetCH701x(SiS_Private *SiS_Pr, USHORT tempbx);
  797. extern void  SiS_SetCH701x(SiS_Private *SiS_Pr, USHORT tempbx);
  798. extern void     SiS_SetCH70xxANDOR(SiS_Private *SiS_Pr, USHORT tempax,USHORT tempbh);
  799. extern void     SiS_DDC2Delay(SiS_Private *SiS_Pr, USHORT delaytime);
  800. /* Export functions  */
  801. static void     sis_get_glyph(struct fb_info *info, SIS_GLYINFO *gly);
  802. void            sis_dispinfo(struct ap_data *rec);
  803. void            sis_malloc(struct sis_memreq *req);
  804. void            sis_free(unsigned long base);
  805. /* heap routines */
  806. static int      sisfb_heap_init(void);
  807. static SIS_OH   *sisfb_poh_new_node(void);
  808. static SIS_OH   *sisfb_poh_allocate(unsigned long size);
  809. static void     sisfb_delete_node(SIS_OH *poh);
  810. static void     sisfb_insert_node(SIS_OH *pohList, SIS_OH *poh);
  811. static SIS_OH   *sisfb_poh_free(unsigned long base);
  812. static void     sisfb_free_node(SIS_OH *poh);
  813. /* routines to access PCI configuration space */
  814. BOOLEAN         sisfb_query_VGA_config_space(PSIS_HW_DEVICE_INFO psishw_ext,
  815.            unsigned long offset, unsigned long set, unsigned long *value);
  816. BOOLEAN         sisfb_query_north_bridge_space(PSIS_HW_DEVICE_INFO psishw_ext,
  817.           unsigned long offset, unsigned long set, unsigned long *value);
  818. #endif