Lines Matching defs:ivideo

73 static void sisfb_handle_command(struct sis_video_info *ivideo,
77 static int sisfb_validate_mode(struct sis_video_info *ivideo, int modeindex, u32 vbflags);
78 static u8 sisfb_search_refresh_rate(struct sis_video_info *ivideo, unsigned int rate,
85 static void sisfb_pre_setmode(struct sis_video_info *ivideo);
86 static void sisfb_post_setmode(struct sis_video_info *ivideo);
87 static bool sisfb_CheckVBRetrace(struct sis_video_info *ivideo);
88 static bool sisfbcheckvretracecrt2(struct sis_video_info *ivideo);
89 static bool sisfbcheckvretracecrt1(struct sis_video_info *ivideo);
90 static bool sisfb_bridgeisslave(struct sis_video_info *ivideo);
91 static void sisfb_detect_VB_connect(struct sis_video_info *ivideo);
92 static void sisfb_get_VB_type(struct sis_video_info *ivideo);
93 static void sisfb_set_TVxposoffset(struct sis_video_info *ivideo, int val);
94 static void sisfb_set_TVyposoffset(struct sis_video_info *ivideo, int val);
97 static int sisfb_heap_init(struct sis_video_info *ivideo);
148 /* We don't know the hardware specs yet and there is no ivideo */
190 /* We don't know the hardware specs yet and there is no ivideo */
295 /* We don't know the hardware specs yet and there is no ivideo */
321 /* We don't know the hardware specs yet and there is no ivideo */
341 /* We don't know the hardware specs yet and there is no ivideo */
380 static void sisfb_detect_custom_timing(struct sis_video_info *ivideo)
388 if(ivideo->SiS_Pr.UseROM) {
389 biosver = ivideo->SiS_Pr.VirtualRomBase + 0x06;
390 biosdate = ivideo->SiS_Pr.VirtualRomBase + 0x2c;
392 chksum += ivideo->SiS_Pr.VirtualRomBase[i];
397 if( (mycustomttable[i].chipID == ivideo->chip) &&
399 (ivideo->SiS_Pr.UseROM &&
403 (ivideo->SiS_Pr.UseROM &&
407 (ivideo->SiS_Pr.UseROM &&
409 (mycustomttable[i].pcisubsysvendor == ivideo->subsysvendor) &&
410 (mycustomttable[i].pcisubsyscard == ivideo->subsysdevice) ) {
414 if(ivideo->SiS_Pr.UseROM) {
415 if(ivideo->SiS_Pr.VirtualRomBase[mycustomttable[i].biosFootprintAddr[j]] !=
424 ivideo->SiS_Pr.SiS_CustomT = mycustomttable[i].SpecialID;
538 static void sisfb_handle_ddc(struct sis_video_info *ivideo,
547 if(ivideo->vbflags & CRT2_LCD) realcrtno = 1;
548 else if(ivideo->vbflags & CRT2_VGA) realcrtno = 2;
552 if((ivideo->sisfb_crt1off) && (!crtno))
555 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, ivideo->sisvga_engine,
556 realcrtno, 0, &buffer[0], ivideo->vbflags2);
571 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, ivideo->sisvga_engine,
572 realcrtno, 1, &buffer[0], ivideo->vbflags2);
594 sisfb_verify_rate(struct sis_video_info *ivideo, struct sisfb_monitor *monitor,
607 switch(sisbios_mode[mode_idx].mode_no[ivideo->mni]) {
621 if(ivideo->sisvga_engine == SIS_315_VGA) return true;
630 if(sisfb_gettotalfrommode(&ivideo->SiS_Pr,
631 sisbios_mode[mode_idx].mode_no[ivideo->mni],
648 sisfb_validate_mode(struct sis_video_info *ivideo, int myindex, u32 vbflags)
653 if (ivideo->sisvga_engine == SIS_300_VGA) {
659 if (ivideo->sisvga_engine == SIS_315_VGA) {
670 xres = ivideo->lcdxres; yres = ivideo->lcdyres;
672 if ((ivideo->SiS_Pr.SiS_CustomT != CUT_PANEL848) &&
673 (ivideo->SiS_Pr.SiS_CustomT != CUT_PANEL856)) {
680 if (ivideo->sisfb_fstn) {
692 if (SiS_GetModeID_LCD(ivideo->sisvga_engine, vbflags, sisbios_mode[myindex].xres,
693 sisbios_mode[myindex].yres, 0, ivideo->sisfb_fstn,
694 ivideo->SiS_Pr.SiS_CustomT, xres, yres, ivideo->vbflags2) < 0x14) {
700 if (SiS_GetModeID_TV(ivideo->sisvga_engine, vbflags, sisbios_mode[myindex].xres,
701 sisbios_mode[myindex].yres, 0, ivideo->vbflags2) < 0x14) {
707 if (SiS_GetModeID_VGA2(ivideo->sisvga_engine, vbflags, sisbios_mode[myindex].xres,
708 sisbios_mode[myindex].yres, 0, ivideo->vbflags2) < 0x14) {
718 sisfb_search_refresh_rate(struct sis_video_info *ivideo, unsigned int rate, int mode_idx)
724 ivideo->rate_idx = 0;
728 ivideo->rate_idx = sisfb_vrate[i].idx;
734 ivideo->rate_idx = sisfb_vrate[i].idx;
735 ivideo->refresh_rate = sisfb_vrate[i].refresh;
740 ivideo->rate_idx = sisfb_vrate[i-1].idx;
741 ivideo->refresh_rate = sisfb_vrate[i-1].refresh;
747 ivideo->rate_idx = sisfb_vrate[i].idx;
753 if(ivideo->rate_idx > 0) {
754 return ivideo->rate_idx;
763 sisfb_bridgeisslave(struct sis_video_info *ivideo)
767 if(!(ivideo->vbflags2 & VB2_VIDEOBRIDGE))
771 if( ((ivideo->sisvga_engine == SIS_300_VGA) && (P1_00 & 0xa0) == 0x20) ||
772 ((ivideo->sisvga_engine == SIS_315_VGA) && (P1_00 & 0x50) == 0x10) ) {
780 sisfballowretracecrt1(struct sis_video_info *ivideo)
796 sisfbcheckvretracecrt1(struct sis_video_info *ivideo)
798 if(!sisfballowretracecrt1(ivideo))
808 sisfbwaitretracecrt1(struct sis_video_info *ivideo)
812 if(!sisfballowretracecrt1(ivideo))
822 sisfbcheckvretracecrt2(struct sis_video_info *ivideo)
826 switch(ivideo->sisvga_engine) {
840 sisfb_CheckVBRetrace(struct sis_video_info *ivideo)
842 if(ivideo->currentvbflags & VB_DISPTYPE_DISP2) {
843 if(!sisfb_bridgeisslave(ivideo)) {
844 return sisfbcheckvretracecrt2(ivideo);
847 return sisfbcheckvretracecrt1(ivideo);
851 sisfb_setupvbblankflags(struct sis_video_info *ivideo, u32 *vcount, u32 *hcount)
858 if((ivideo->currentvbflags & VB_DISPTYPE_DISP2) && (!(sisfb_bridgeisslave(ivideo)))) {
865 switch(ivideo->sisvga_engine) {
880 } else if(sisfballowretracecrt1(ivideo)) {
901 sisfb_myblank(struct sis_video_info *ivideo, int blank)
956 if(ivideo->currentvbflags & VB_DISPTYPE_CRT1) {
958 if( (!ivideo->sisfb_thismonitor.datavalid) ||
959 ((ivideo->sisfb_thismonitor.datavalid) &&
960 (ivideo->sisfb_thismonitor.feature & 0xe0))) {
962 if(ivideo->sisvga_engine == SIS_315_VGA) {
963 SiS_SetRegANDOR(SISCR, ivideo->SiS_Pr.SiS_MyCR63, 0xbf, cr63);
966 if(!(sisfb_bridgeisslave(ivideo))) {
974 if(ivideo->currentvbflags & CRT2_LCD) {
976 if(ivideo->vbflags2 & VB2_SISLVDSBRIDGE) {
978 SiS_SiS30xBLOn(&ivideo->SiS_Pr);
980 SiS_SiS30xBLOff(&ivideo->SiS_Pr);
982 } else if(ivideo->sisvga_engine == SIS_315_VGA) {
984 if(ivideo->vbflags2 & VB2_CHRONTEL) {
986 SiS_Chrontel701xBLOn(&ivideo->SiS_Pr);
988 SiS_Chrontel701xBLOff(&ivideo->SiS_Pr);
994 if(((ivideo->sisvga_engine == SIS_300_VGA) &&
995 (ivideo->vbflags2 & (VB2_301|VB2_30xBDH|VB2_LVDS))) ||
996 ((ivideo->sisvga_engine == SIS_315_VGA) &&
997 ((ivideo->vbflags2 & (VB2_LVDS | VB2_CHRONTEL)) == VB2_LVDS))) {
1001 if(ivideo->sisvga_engine == SIS_300_VGA) {
1002 if((ivideo->vbflags2 & VB2_30xB) &&
1003 (!(ivideo->vbflags2 & VB2_30xBDH))) {
1006 } else if(ivideo->sisvga_engine == SIS_315_VGA) {
1007 if((ivideo->vbflags2 & VB2_30xB) &&
1008 (!(ivideo->vbflags2 & VB2_30xBDH))) {
1013 } else if(ivideo->currentvbflags & CRT2_VGA) {
1015 if(ivideo->vbflags2 & VB2_30xB) {
1030 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo;
1033 pci_read_config_dword(ivideo->nbridge, reg, &val);
1040 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo;
1042 pci_write_config_dword(ivideo->nbridge, reg, (u32)val);
1048 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo;
1051 if(!ivideo->lpcdev) return 0;
1053 pci_read_config_dword(ivideo->lpcdev, reg, &val);
1062 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo;
1064 pci_write_config_byte(ivideo->nbridge, reg, (u8)val);
1070 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo;
1073 if(!ivideo->lpcdev) return 0;
1075 pci_read_config_word(ivideo->lpcdev, reg, &val);
1089 sisfb_set_vparms(struct sis_video_info *ivideo)
1091 switch(ivideo->video_bpp) {
1093 ivideo->DstColor = 0x0000;
1094 ivideo->SiS310_AccelDepth = 0x00000000;
1095 ivideo->video_cmap_len = 256;
1098 ivideo->DstColor = 0x8000;
1099 ivideo->SiS310_AccelDepth = 0x00010000;
1100 ivideo->video_cmap_len = 16;
1103 ivideo->DstColor = 0xC000;
1104 ivideo->SiS310_AccelDepth = 0x00020000;
1105 ivideo->video_cmap_len = 16;
1108 ivideo->video_cmap_len = 16;
1109 printk(KERN_ERR "sisfb: Unsupported depth %d", ivideo->video_bpp);
1110 ivideo->accel = 0;
1115 sisfb_calc_maxyres(struct sis_video_info *ivideo, struct fb_var_screeninfo *var)
1117 int maxyres = ivideo->sisfb_mem / (var->xres_virtual * (var->bits_per_pixel >> 3));
1125 sisfb_calc_pitch(struct sis_video_info *ivideo, struct fb_var_screeninfo *var)
1127 ivideo->video_linelength = var->xres_virtual * (var->bits_per_pixel >> 3);
1128 ivideo->scrnpitchCRT1 = ivideo->video_linelength;
1129 if(!(ivideo->currentvbflags & CRT1_LCDA)) {
1131 ivideo->scrnpitchCRT1 <<= 1;
1137 sisfb_set_pitch(struct sis_video_info *ivideo)
1140 unsigned short HDisplay1 = ivideo->scrnpitchCRT1 >> 3;
1141 unsigned short HDisplay2 = ivideo->video_linelength >> 3;
1143 if(sisfb_bridgeisslave(ivideo)) isslavemode = true;
1146 if((ivideo->currentvbflags & VB_DISPTYPE_DISP1) || (isslavemode)) {
1152 if((ivideo->currentvbflags & VB_DISPTYPE_DISP2) && (!isslavemode)) {
1153 SiS_SetRegOR(SISPART1, ivideo->CRT2_write_enable, 0x01);
1160 sisfb_bpp_to_var(struct sis_video_info *ivideo, struct fb_var_screeninfo *var)
1162 ivideo->video_cmap_len = sisfb_get_cmap_len(var);
1193 sisfb_set_mode(struct sis_video_info *ivideo, int clrscrn)
1195 unsigned short modeno = ivideo->mode_no;
1202 sisfb_pre_setmode(ivideo);
1204 if(!SiSSetMode(&ivideo->SiS_Pr, modeno)) {
1205 printk(KERN_ERR "sisfb: Setting mode[0x%x] failed\n", ivideo->mode_no);
1211 sisfb_post_setmode(ivideo);
1220 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1252 ivideo->refresh_rate = (unsigned int) (hrate * 2 / vtotal);
1254 ivideo->refresh_rate = 60;
1257 old_mode = ivideo->sisfb_mode_idx;
1258 ivideo->sisfb_mode_idx = 0;
1260 while( (sisbios_mode[ivideo->sisfb_mode_idx].mode_no[0] != 0) &&
1261 (sisbios_mode[ivideo->sisfb_mode_idx].xres <= var->xres) ) {
1262 if( (sisbios_mode[ivideo->sisfb_mode_idx].xres == var->xres) &&
1263 (sisbios_mode[ivideo->sisfb_mode_idx].yres == var->yres) &&
1264 (sisbios_mode[ivideo->sisfb_mode_idx].bpp == var->bits_per_pixel)) {
1265 ivideo->mode_no = sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni];
1269 ivideo->sisfb_mode_idx++;
1273 ivideo->sisfb_mode_idx = sisfb_validate_mode(ivideo,
1274 ivideo->sisfb_mode_idx, ivideo->currentvbflags);
1276 ivideo->sisfb_mode_idx = -1;
1279 if(ivideo->sisfb_mode_idx < 0) {
1282 ivideo->sisfb_mode_idx = old_mode;
1286 ivideo->mode_no = sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni];
1288 if(sisfb_search_refresh_rate(ivideo, ivideo->refresh_rate, ivideo->sisfb_mode_idx) == 0) {
1289 ivideo->rate_idx = sisbios_mode[ivideo->sisfb_mode_idx].rate_idx;
1290 ivideo->refresh_rate = 60;
1297 ivideo->accel = 0;
1306 if(!(info->flags & FBINFO_HWACCEL_DISABLED)) ivideo->accel = -1;
1308 if(var->accel_flags & FB_ACCELF_TEXT) ivideo->accel = -1;
1311 if((ret = sisfb_set_mode(ivideo, 1))) {
1315 ivideo->video_bpp = sisbios_mode[ivideo->sisfb_mode_idx].bpp;
1316 ivideo->video_width = sisbios_mode[ivideo->sisfb_mode_idx].xres;
1317 ivideo->video_height = sisbios_mode[ivideo->sisfb_mode_idx].yres;
1319 sisfb_calc_pitch(ivideo, var);
1320 sisfb_set_pitch(ivideo);
1322 sisfb_set_vparms(ivideo);
1324 ivideo->current_width = ivideo->video_width;
1325 ivideo->current_height = ivideo->video_height;
1326 ivideo->current_bpp = ivideo->video_bpp;
1327 ivideo->current_htotal = htotal;
1328 ivideo->current_vtotal = vtotal;
1329 ivideo->current_linelength = ivideo->video_linelength;
1330 ivideo->current_pixclock = var->pixclock;
1331 ivideo->current_refresh_rate = ivideo->refresh_rate;
1332 ivideo->sisfb_lastrates[ivideo->mode_no] = ivideo->refresh_rate;
1339 sisfb_set_base_CRT1(struct sis_video_info *ivideo, unsigned int base)
1346 if(ivideo->sisvga_engine == SIS_315_VGA) {
1352 sisfb_set_base_CRT2(struct sis_video_info *ivideo, unsigned int base)
1354 if(ivideo->currentvbflags & VB_DISPTYPE_DISP2) {
1355 SiS_SetRegOR(SISPART1, ivideo->CRT2_write_enable, 0x01);
1359 if(ivideo->sisvga_engine == SIS_315_VGA) {
1366 sisfb_pan_var(struct sis_video_info *ivideo, struct fb_info *info,
1369 ivideo->current_base = var->yoffset * info->var.xres_virtual
1377 ivideo->current_base >>= 1;
1381 ivideo->current_base >>= 2;
1385 ivideo->current_base += (ivideo->video_offset >> 2);
1387 sisfb_set_base_CRT1(ivideo, ivideo->current_base);
1388 sisfb_set_base_CRT2(ivideo, ivideo->current_base);
1409 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1420 if(ivideo->currentvbflags & VB_DISPTYPE_DISP2) {
1466 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1504 if((tidx = sisfb_validate_mode(ivideo, search_idx,
1505 ivideo->currentvbflags)) > 0) {
1520 if((tidx = sisfb_validate_mode(ivideo,search_idx,
1521 ivideo->currentvbflags)) > 0) {
1546 if( ((ivideo->vbflags2 & VB2_LVDS) ||
1547 ((ivideo->vbflags2 & VB2_30xBDH) && (ivideo->currentvbflags & CRT2_LCD))) &&
1552 } else if( (ivideo->current_htotal == htotal) &&
1553 (ivideo->current_vtotal == vtotal) &&
1554 (ivideo->current_pixclock == pixclock) ) {
1559 } else if( ( (ivideo->current_htotal != htotal) ||
1560 (ivideo->current_vtotal != vtotal) ) &&
1561 (ivideo->current_pixclock == var->pixclock) ) {
1563 if(ivideo->sisfb_lastrates[sisbios_mode[search_idx].mode_no[ivideo->mni]]) {
1565 ivideo->sisfb_lastrates[sisbios_mode[search_idx].mode_no[ivideo->mni]];
1566 } else if(ivideo->sisfb_parm_rate != -1) {
1568 refresh_rate = ivideo->sisfb_parm_rate;
1577 } else if(ivideo->current_refresh_rate) {
1578 refresh_rate = ivideo->current_refresh_rate;
1585 myrateindex = sisfb_search_refresh_rate(ivideo, refresh_rate, search_idx);
1590 var->pixclock = (u32) (1000000000 / sisfb_mode_rate_to_dclock(&ivideo->SiS_Pr,
1591 sisbios_mode[search_idx].mode_no[ivideo->mni],
1593 sisfb_mode_rate_to_ddata(&ivideo->SiS_Pr,
1594 sisbios_mode[search_idx].mode_no[ivideo->mni],
1601 if(ivideo->sisfb_thismonitor.datavalid) {
1602 if(!sisfb_verify_rate(ivideo, &ivideo->sisfb_thismonitor, search_idx,
1610 sisfb_bpp_to_var(ivideo, var);
1615 if(ivideo->sisfb_ypan) {
1616 maxyres = sisfb_calc_maxyres(ivideo, var);
1617 if(ivideo->sisfb_max) {
1658 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1668 err = sisfb_pan_var(ivideo, info, var);
1681 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1683 return sisfb_myblank(ivideo, blank);
1691 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1731 sisvbblank.flags = sisfb_setupvbblankflags(ivideo, &sisvbblank.vcount, &sisvbblank.hcount);
1742 if(ivideo->warncount++ < 10)
1747 ivideo->sisfb_infoblock.sisfb_id = SISFB_ID;
1748 ivideo->sisfb_infoblock.sisfb_version = VER_MAJOR;
1749 ivideo->sisfb_infoblock.sisfb_revision = VER_MINOR;
1750 ivideo->sisfb_infoblock.sisfb_patchlevel = VER_LEVEL;
1751 ivideo->sisfb_infoblock.chip_id = ivideo->chip_id;
1752 ivideo->sisfb_infoblock.sisfb_pci_vendor = ivideo->chip_vendor;
1753 ivideo->sisfb_infoblock.memory = ivideo->video_size / 1024;
1754 ivideo->sisfb_infoblock.heapstart = ivideo->heapstart / 1024;
1755 if(ivideo->modechanged) {
1756 ivideo->sisfb_infoblock.fbvidmode = ivideo->mode_no;
1758 ivideo->sisfb_infoblock.fbvidmode = ivideo->modeprechange;
1760 ivideo->sisfb_infoblock.sisfb_caps = ivideo->caps;
1761 ivideo->sisfb_infoblock.sisfb_tqlen = ivideo->cmdQueueSize / 1024;
1762 ivideo->sisfb_infoblock.sisfb_pcibus = ivideo->pcibus;
1763 ivideo->sisfb_infoblock.sisfb_pcislot = ivideo->pcislot;
1764 ivideo->sisfb_infoblock.sisfb_pcifunc = ivideo->pcifunc;
1765 ivideo->sisfb_infoblock.sisfb_lcdpdc = ivideo->detectedpdc;
1766 ivideo->sisfb_infoblock.sisfb_lcdpdca = ivideo->detectedpdca;
1767 ivideo->sisfb_infoblock.sisfb_lcda = ivideo->detectedlcda;
1768 ivideo->sisfb_infoblock.sisfb_vbflags = ivideo->vbflags;
1769 ivideo->sisfb_infoblock.sisfb_currentvbflags = ivideo->currentvbflags;
1770 ivideo->sisfb_infoblock.sisfb_scalelcd = ivideo->SiS_Pr.UsePanelScaler;
1771 ivideo->sisfb_infoblock.sisfb_specialtiming = ivideo->SiS_Pr.SiS_CustomT;
1772 ivideo->sisfb_infoblock.sisfb_haveemi = ivideo->SiS_Pr.HaveEMI ? 1 : 0;
1773 ivideo->sisfb_infoblock.sisfb_haveemilcd = ivideo->SiS_Pr.HaveEMILCD ? 1 : 0;
1774 ivideo->sisfb_infoblock.sisfb_emi30 = ivideo->SiS_Pr.EMI_30;
1775 ivideo->sisfb_infoblock.sisfb_emi31 = ivideo->SiS_Pr.EMI_31;
1776 ivideo->sisfb_infoblock.sisfb_emi32 = ivideo->SiS_Pr.EMI_32;
1777 ivideo->sisfb_infoblock.sisfb_emi33 = ivideo->SiS_Pr.EMI_33;
1778 ivideo->sisfb_infoblock.sisfb_tvxpos = (u16)(ivideo->tvxpos + 32);
1779 ivideo->sisfb_infoblock.sisfb_tvypos = (u16)(ivideo->tvypos + 32);
1780 ivideo->sisfb_infoblock.sisfb_heapsize = ivideo->sisfb_heap_size / 1024;
1781 ivideo->sisfb_infoblock.sisfb_videooffset = ivideo->video_offset;
1782 ivideo->sisfb_infoblock.sisfb_curfstn = ivideo->curFSTN;
1783 ivideo->sisfb_infoblock.sisfb_curdstn = ivideo->curDSTN;
1784 ivideo->sisfb_infoblock.sisfb_vbflags2 = ivideo->vbflags2;
1785 ivideo->sisfb_infoblock.sisfb_can_post = ivideo->sisfb_can_post ? 1 : 0;
1786 ivideo->sisfb_infoblock.sisfb_card_posted = ivideo->sisfb_card_posted ? 1 : 0;
1787 ivideo->sisfb_infoblock.sisfb_was_boot_device = ivideo->sisfb_was_boot_device ? 1 : 0;
1789 if(copy_to_user((void __user *)arg, &ivideo->sisfb_infoblock,
1790 sizeof(ivideo->sisfb_infoblock)))
1796 if(ivideo->warncount++ < 10)
1801 if(sisfb_CheckVBRetrace(ivideo))
1807 if(ivideo->warncount++ < 10)
1812 if(ivideo->sisfb_max)
1818 if(ivideo->warncount++ < 10)
1826 ivideo->sisfb_max = (gpu32) ? 1 : 0;
1833 sisfb_set_TVxposoffset(ivideo, ((int)(gpu32 >> 16)) - 32);
1834 sisfb_set_TVyposoffset(ivideo, ((int)(gpu32 & 0xffff)) - 32);
1838 return put_user((u32)(((ivideo->tvxpos+32)<<16)|((ivideo->tvypos+32)&0xffff)),
1842 if(copy_from_user(&ivideo->sisfb_command, (void __user *)arg,
1846 sisfb_handle_command(ivideo, &ivideo->sisfb_command);
1848 if(copy_to_user((void __user *)arg, &ivideo->sisfb_command,
1858 ivideo->sisfblocked = (gpu32) ? 1 : 0;
1874 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1878 strscpy(fix->id, ivideo->myid, sizeof(fix->id));
1881 fix->smem_start = ivideo->video_base + ivideo->video_offset;
1882 fix->smem_len = ivideo->sisfb_mem;
1886 fix->visual = (ivideo->video_bpp == 8) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
1888 fix->ypanstep = (ivideo->sisfb_ypan) ? 1 : 0;
1890 fix->line_length = ivideo->video_linelength;
1891 fix->mmio_start = ivideo->mmio_base;
1892 fix->mmio_len = ivideo->mmio_size;
1893 if(ivideo->sisvga_engine == SIS_300_VGA) {
1895 } else if((ivideo->chip == SIS_330) ||
1896 (ivideo->chip == SIS_760) ||
1897 (ivideo->chip == SIS_761)) {
1899 } else if(ivideo->chip == XGI_20) {
1901 } else if(ivideo->chip >= XGI_40) {
1972 static int sisfb_get_dram_size(struct sis_video_info *ivideo)
1978 ivideo->video_size = 0;
1979 ivideo->UMAsize = ivideo->LFBsize = 0;
1981 switch(ivideo->chip) {
1985 ivideo->video_size = ((reg & 0x3F) + 1) << 20;
1990 if(!ivideo->nbridge)
1992 pci_read_config_byte(ivideo->nbridge, 0x63, &reg);
1993 ivideo->video_size = 1 << (((reg & 0x70) >> 4) + 21);
2001 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20;
2005 ivideo->video_size <<= 1;
2008 ivideo->video_size += (ivideo->video_size/2);
2013 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20;
2014 if(reg & 0x0c) ivideo->video_size <<= 1;
2020 ivideo->video_size = (((reg & 0x3f) + 1) << 2) << 20;
2025 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20;
2033 ivideo->video_size = (1 << reg) << 20;
2034 ivideo->UMAsize = ivideo->video_size;
2040 ivideo->LFBsize = (32 << 20);
2042 ivideo->LFBsize = (64 << 20);
2044 ivideo->video_size += ivideo->LFBsize;
2051 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20;
2052 if(ivideo->chip != XGI_20) {
2054 if(ivideo->revision_id == 2) {
2058 if(reg == 0x02) ivideo->video_size <<= 1;
2059 else if(reg == 0x03) ivideo->video_size <<= 2;
2071 static void sisfb_detect_VB_connect(struct sis_video_info *ivideo)
2076 if(ivideo->chip == XGI_20) {
2077 ivideo->sisfb_crt1off = 0;
2082 if(ivideo->sisvga_engine == SIS_300_VGA) {
2084 if((temp & 0x0F) && (ivideo->chip != SIS_300)) {
2086 if(!(ivideo->vbflags & (TV_PAL | TV_NTSC | TV_PALM | TV_PALN))) {
2089 ivideo->vbflags |= TV_PAL;
2091 ivideo->vbflags |= TV_NTSC;
2100 ivideo->sisfb_crt1off = 0;
2102 ivideo->sisfb_crt1off = (cr32 & 0xDF) ? 1 : 0;
2105 ivideo->vbflags &= ~(CRT2_TV | CRT2_LCD | CRT2_VGA);
2107 if(cr32 & SIS_VB_TV) ivideo->vbflags |= CRT2_TV;
2108 if(cr32 & SIS_VB_LCD) ivideo->vbflags |= CRT2_LCD;
2109 if(cr32 & SIS_VB_CRT2) ivideo->vbflags |= CRT2_VGA;
2116 if(ivideo->chip != SIS_550) {
2117 ivideo->sisfb_dstn = ivideo->sisfb_fstn = 0;
2120 if(ivideo->sisfb_tvplug != -1) {
2121 if( (ivideo->sisvga_engine != SIS_315_VGA) ||
2122 (!(ivideo->vbflags2 & VB2_SISYPBPRBRIDGE)) ) {
2123 if(ivideo->sisfb_tvplug & TV_YPBPR) {
2124 ivideo->sisfb_tvplug = -1;
2129 if(ivideo->sisfb_tvplug != -1) {
2130 if( (ivideo->sisvga_engine != SIS_315_VGA) ||
2131 (!(ivideo->vbflags2 & VB2_SISHIVISIONBRIDGE)) ) {
2132 if(ivideo->sisfb_tvplug & TV_HIVISION) {
2133 ivideo->sisfb_tvplug = -1;
2138 if(ivideo->sisfb_tvstd != -1) {
2139 if( (!(ivideo->vbflags2 & VB2_SISBRIDGE)) &&
2140 (!((ivideo->sisvga_engine == SIS_315_VGA) &&
2141 (ivideo->vbflags2 & VB2_CHRONTEL))) ) {
2142 if(ivideo->sisfb_tvstd & (TV_PALM | TV_PALN | TV_NTSCJ)) {
2143 ivideo->sisfb_tvstd = -1;
2150 if(ivideo->sisfb_tvplug != -1) {
2151 ivideo->vbflags |= ivideo->sisfb_tvplug;
2153 if(cr32 & SIS_VB_YPBPR) ivideo->vbflags |= (TV_YPBPR|TV_YPBPR525I); /* default: 480i */
2154 else if(cr32 & SIS_VB_HIVISION) ivideo->vbflags |= TV_HIVISION;
2155 else if(cr32 & SIS_VB_SCART) ivideo->vbflags |= TV_SCART;
2157 if(cr32 & SIS_VB_SVIDEO) ivideo->vbflags |= TV_SVIDEO;
2158 if(cr32 & SIS_VB_COMPOSITE) ivideo->vbflags |= TV_AVIDEO;
2162 if(!(ivideo->vbflags & (TV_YPBPR | TV_HIVISION))) {
2163 if(ivideo->sisfb_tvstd != -1) {
2164 ivideo->vbflags &= ~(TV_NTSC | TV_PAL | TV_PALM | TV_PALN | TV_NTSCJ);
2165 ivideo->vbflags |= ivideo->sisfb_tvstd;
2167 if(ivideo->vbflags & TV_SCART) {
2168 ivideo->vbflags &= ~(TV_NTSC | TV_PALM | TV_PALN | TV_NTSCJ);
2169 ivideo->vbflags |= TV_PAL;
2171 if(!(ivideo->vbflags & (TV_PAL | TV_NTSC | TV_PALM | TV_PALN | TV_NTSCJ))) {
2172 if(ivideo->sisvga_engine == SIS_300_VGA) {
2174 if(temp & 0x01) ivideo->vbflags |= TV_PAL;
2175 else ivideo->vbflags |= TV_NTSC;
2176 } else if((ivideo->chip <= SIS_315PRO) || (ivideo->chip >= SIS_330)) {
2178 if(temp & 0x01) ivideo->vbflags |= TV_PAL;
2179 else ivideo->vbflags |= TV_NTSC;
2182 if(temp & 0x20) ivideo->vbflags |= TV_PAL;
2183 else ivideo->vbflags |= TV_NTSC;
2189 if(ivideo->sisfb_forcecrt1 != -1) {
2190 ivideo->sisfb_crt1off = (ivideo->sisfb_forcecrt1) ? 0 : 1;
2196 static bool sisfb_test_DDC1(struct sis_video_info *ivideo)
2201 old = SiS_ReadDDC1Bit(&ivideo->SiS_Pr);
2203 if(old != SiS_ReadDDC1Bit(&ivideo->SiS_Pr)) break;
2208 static void sisfb_sense_crt1(struct sis_video_info *ivideo)
2226 if (ivideo->sisvga_engine == SIS_315_VGA) {
2227 cr63 = SiS_GetReg(SISCR, ivideo->SiS_Pr.SiS_MyCR63);
2229 SiS_SetRegAND(SISCR, ivideo->SiS_Pr.SiS_MyCR63, 0xBF);
2245 sisfbwaitretracecrt1(ivideo);
2248 if (ivideo->chip >= SIS_330) {
2250 if (ivideo->chip >= SIS_340)
2272 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags,
2273 ivideo->sisvga_engine, 0, 0, NULL, ivideo->vbflags2);
2277 if (sisfb_test_DDC1(ivideo))
2286 if (ivideo->sisvga_engine == SIS_315_VGA)
2287 SiS_SetRegANDOR(SISCR, ivideo->SiS_Pr.SiS_MyCR63, 0xBF, cr63);
2295 static void SiS_SenseLCD(struct sis_video_info *ivideo)
2302 ivideo->SiS_Pr.PanelSelfDetected = false;
2305 if (!(ivideo->vbflags2 & VB2_SISTMDSBRIDGE))
2307 if (ivideo->vbflags2 & VB2_30xBDH)
2316 if (ivideo->SiS_Pr.DDCPortMixup)
2320 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, ivideo->sisvga_engine,
2321 realcrtno, 0, &buffer[0], ivideo->vbflags2);
2329 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags,
2330 ivideo->sisvga_engine, realcrtno, 1,
2331 &buffer[0], ivideo->vbflags2);
2358 if ((yres == 1200) && (ivideo->vbflags2 & VB2_30xC))
2379 ivideo->SiS_Pr.PanelSelfDetected = true;
2382 static int SISDoSense(struct sis_video_info *ivideo, u16 type, u16 test)
2393 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x1500);
2404 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x1000);
2414 static void SiS_Sense30x(struct sis_video_info *ivideo)
2424 if(ivideo->vbflags2 & VB2_301) {
2430 } else if(ivideo->vbflags2 & (VB2_301B | VB2_302B)) {
2432 } else if(ivideo->vbflags2 & (VB2_301LV | VB2_302LV)) {
2434 } else if(ivideo->vbflags2 & (VB2_301C | VB2_302ELV | VB2_307T | VB2_307LV)) {
2440 if(ivideo->vbflags & (VB2_301LV|VB2_302LV|VB2_302ELV|VB2_307LV)) {
2445 if(ivideo->haveXGIROM) {
2446 biosflag = ivideo->bios_abase[0x58] & 0x03;
2447 } else if(ivideo->newrom) {
2448 if(ivideo->bios_abase[0x5d] & 0x04) biosflag |= 0x01;
2449 } else if(ivideo->sisvga_engine == SIS_300_VGA) {
2450 if(ivideo->bios_abase) {
2451 biosflag = ivideo->bios_abase[0xfe] & 0x03;
2455 if(ivideo->chip == SIS_300) {
2460 if(!(ivideo->vbflags2 & VB2_SISVGA2BRIDGE)) {
2468 if(ivideo->vbflags2 & VB2_30xC) {
2473 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x2000);
2479 if(ivideo->vbflags2 & VB2_SISYPBPRBRIDGE) {
2483 if(!(ivideo->vbflags2 & VB2_30xCLV)) {
2484 SISDoSense(ivideo, 0, 0);
2490 if(SISDoSense(ivideo, vga2, vga2_c)) {
2503 if(ivideo->vbflags2 & VB2_30xCLV) {
2507 if((ivideo->sisvga_engine == SIS_315_VGA) && (ivideo->vbflags2 & VB2_SISYPBPRBRIDGE)) {
2509 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x2000);
2510 if((result = SISDoSense(ivideo, svhs, 0x0604))) {
2511 if((result = SISDoSense(ivideo, cvbs, 0x0804))) {
2521 if(!(ivideo->vbflags & TV_YPBPR)) {
2522 if((result = SISDoSense(ivideo, svhs, svhs_c))) {
2527 if(SISDoSense(ivideo, cvbs, cvbs_c)) {
2534 SISDoSense(ivideo, 0, 0);
2540 if(ivideo->vbflags2 & VB2_30xCLV) {
2554 static void SiS_SenseCh(struct sis_video_info *ivideo)
2565 if(ivideo->chip < SIS_315H) {
2568 ivideo->SiS_Pr.SiS_IF_DEF_CH70xx = 1; /* Chrontel 700x */
2569 SiS_SetChrontelGPIO(&ivideo->SiS_Pr, 0x9c); /* Set general purpose IO for Chrontel communication */
2570 SiS_DDC2Delay(&ivideo->SiS_Pr, 1000);
2571 temp1 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x25);
2573 temp2 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0e);
2575 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0e, 0x0b);
2576 SiS_DDC2Delay(&ivideo->SiS_Pr, 300);
2578 temp2 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x25);
2583 temp1 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0e);
2586 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0e,0x0b);
2587 SiS_DDC2Delay(&ivideo->SiS_Pr, 300);
2591 SiS_SetCH700x(&ivideo->SiS_Pr, 0x10, 0x01);
2592 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96);
2593 SiS_SetCH700x(&ivideo->SiS_Pr, 0x10, 0x00);
2594 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96);
2595 temp1 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x10);
2599 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96);
2612 ivideo->vbflags |= TV_SVIDEO;
2617 ivideo->vbflags |= TV_AVIDEO;
2621 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x0e, 0x01, 0xF8);
2625 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x0e, 0x01, 0xF8);
2629 SiS_SetChrontelGPIO(&ivideo->SiS_Pr, 0x00);
2635 ivideo->SiS_Pr.SiS_IF_DEF_CH70xx = 2; /* Chrontel 7019 */
2636 temp1 = SiS_GetCH701x(&ivideo->SiS_Pr, 0x49);
2637 SiS_SetCH701x(&ivideo->SiS_Pr, 0x49, 0x20);
2638 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96);
2639 temp2 = SiS_GetCH701x(&ivideo->SiS_Pr, 0x20);
2641 SiS_SetCH701x(&ivideo->SiS_Pr, 0x20, temp2);
2642 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96);
2644 SiS_SetCH701x(&ivideo->SiS_Pr, 0x20, temp2);
2645 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96);
2646 temp2 = SiS_GetCH701x(&ivideo->SiS_Pr, 0x20);
2647 SiS_SetCH701x(&ivideo->SiS_Pr, 0x49, temp1);
2656 ivideo->vbflags |= TV_AVIDEO;
2662 ivideo->vbflags |= TV_SVIDEO;
2678 static void sisfb_get_VB_type(struct sis_video_info *ivideo)
2686 if(ivideo->chip == XGI_20)
2694 ivideo->vbflags |= VB_301; /* Deprecated */
2695 ivideo->vbflags2 |= VB2_301;
2698 ivideo->vbflags |= VB_301B; /* Deprecated */
2699 ivideo->vbflags2 |= VB2_301B;
2702 ivideo->vbflags |= VB_30xBDH; /* Deprecated */
2703 ivideo->vbflags2 |= VB2_30xBDH;
2709 ivideo->vbflags |= VB_301C; /* Deprecated */
2710 ivideo->vbflags2 |= VB2_301C;
2713 ivideo->vbflags |= VB_301LV; /* Deprecated */
2714 ivideo->vbflags2 |= VB2_301LV;
2719 ivideo->vbflags |= VB_302LV; /* Deprecated */
2720 ivideo->vbflags2 |= VB2_302LV;
2723 ivideo->vbflags |= VB_301C; /* Deprecated */
2724 ivideo->vbflags2 |= VB2_301C;
2727 ivideo->vbflags |= VB_302ELV; /* Deprecated */
2728 ivideo->vbflags2 |= VB2_302ELV;
2735 ivideo->vbflags |= VB_302B; /* Deprecated */
2736 ivideo->vbflags2 |= VB2_302B;
2741 if((!(ivideo->vbflags2 & VB2_VIDEOBRIDGE)) && (ivideo->chip != SIS_300)) {
2745 if(ivideo->sisvga_engine == SIS_300_VGA) {
2749 ivideo->vbflags |= VB_LVDS; /* Deprecated */
2750 ivideo->vbflags2 |= VB2_LVDS;
2753 ivideo->vbflags |= (VB_LVDS | VB_TRUMPION); /* Deprecated */
2754 ivideo->vbflags2 |= (VB2_LVDS | VB2_TRUMPION);
2757 ivideo->vbflags |= VB_CHRONTEL; /* Deprecated */
2758 ivideo->vbflags2 |= VB2_CHRONTEL;
2761 ivideo->vbflags |= (VB_LVDS | VB_CHRONTEL); /* Deprecated */
2762 ivideo->vbflags2 |= (VB2_LVDS | VB2_CHRONTEL);
2765 if(ivideo->vbflags2 & VB2_CHRONTEL) ivideo->chronteltype = 1;
2767 } else if(ivideo->chip < SIS_661) {
2771 ivideo->vbflags |= VB_LVDS; /* Deprecated */
2772 ivideo->vbflags2 |= VB2_LVDS;
2775 ivideo->vbflags |= (VB_LVDS | VB_CHRONTEL); /* Deprecated */
2776 ivideo->vbflags2 |= (VB2_LVDS | VB2_CHRONTEL);
2779 if(ivideo->vbflags2 & VB2_CHRONTEL) ivideo->chronteltype = 2;
2781 } else if(ivideo->chip >= SIS_661) {
2787 ivideo->vbflags |= VB_LVDS; /* Deprecated */
2788 ivideo->vbflags2 |= VB2_LVDS;
2791 ivideo->vbflags |= (VB_LVDS | VB_CHRONTEL); /* Deprecated */
2792 ivideo->vbflags2 |= (VB2_LVDS | VB2_CHRONTEL);
2795 ivideo->vbflags |= (VB_LVDS | VB_CONEXANT); /* Deprecated */
2796 ivideo->vbflags2 |= (VB2_LVDS | VB2_CONEXANT);
2799 if(ivideo->vbflags2 & VB2_CHRONTEL) ivideo->chronteltype = 2;
2802 if(ivideo->vbflags2 & VB2_LVDS) {
2805 if((ivideo->sisvga_engine == SIS_300_VGA) && (ivideo->vbflags2 & VB2_TRUMPION)) {
2808 if(ivideo->vbflags2 & VB2_CHRONTEL) {
2811 if((ivideo->chip >= SIS_661) && (ivideo->vbflags2 & VB2_CONEXANT)) {
2816 if(ivideo->vbflags2 & VB2_SISBRIDGE) {
2817 SiS_SenseLCD(ivideo);
2818 SiS_Sense30x(ivideo);
2819 } else if(ivideo->vbflags2 & VB2_CHRONTEL) {
2820 SiS_SenseCh(ivideo);
2827 sisfb_engine_init(struct sis_video_info *ivideo)
2834 ivideo->caps &= ~(TURBO_QUEUE_CAP |
2840 if(ivideo->sisvga_engine == SIS_300_VGA) {
2844 tqueue_pos = (ivideo->video_size - ivideo->cmdQueueSize) / (64 * 1024);
2854 ivideo->caps |= TURBO_QUEUE_CAP;
2859 if(ivideo->sisvga_engine == SIS_315_VGA) {
2863 if(ivideo->chip == XGI_20) {
2864 switch(ivideo->cmdQueueSize) {
2873 switch(ivideo->cmdQueueSize) {
2892 if((ivideo->chip >= XGI_40) && ivideo->modechanged) {
2898 if(!((templ = MMIO_IN32(ivideo->mmio_vbase, 0x8240)) & (1 << 10))) {
2900 MMIO_OUT32(ivideo->mmio_vbase, Q_WRITE_PTR, 0);
2904 tempq = MMIO_IN32(ivideo->mmio_vbase, Q_READ_PTR);
2905 MMIO_OUT32(ivideo->mmio_vbase, Q_WRITE_PTR, tempq);
2907 tempq = (u32)(ivideo->video_size - ivideo->cmdQueueSize);
2908 MMIO_OUT32(ivideo->mmio_vbase, Q_BASE_ADDR, tempq);
2910 writel(0x16800000 + 0x8240, ivideo->video_vbase + tempq);
2911 writel(templ | (1 << 10), ivideo->video_vbase + tempq + 4);
2912 writel(0x168F0000, ivideo->video_vbase + tempq + 8);
2913 writel(0x168F0000, ivideo->video_vbase + tempq + 12);
2915 MMIO_OUT32(ivideo->mmio_vbase, Q_WRITE_PTR, (tempq + 16));
2917 sisfb_syncaccel(ivideo);
2924 tempq = MMIO_IN32(ivideo->mmio_vbase, MMIO_QUEUE_READPORT);
2925 MMIO_OUT32(ivideo->mmio_vbase, MMIO_QUEUE_WRITEPORT, tempq);
2930 tempq = (u32)(ivideo->video_size - ivideo->cmdQueueSize);
2931 MMIO_OUT32(ivideo->mmio_vbase, MMIO_QUEUE_PHYBASE, tempq);
2933 ivideo->caps |= MMIO_CMD_QUEUE_CAP;
2937 ivideo->engineok = 1;
2940 static void sisfb_detect_lcd_type(struct sis_video_info *ivideo)
2947 if(ivideo->sisvga_engine == SIS_300_VGA) {
2948 ivideo->CRT2LCDType = sis300paneltype[reg];
2949 } else if(ivideo->chip >= SIS_661) {
2950 ivideo->CRT2LCDType = sis661paneltype[reg];
2952 ivideo->CRT2LCDType = sis310paneltype[reg];
2953 if((ivideo->chip == SIS_550) && (sisfb_fstn)) {
2954 if((ivideo->CRT2LCDType != LCD_320x240_2) &&
2955 (ivideo->CRT2LCDType != LCD_320x240_3)) {
2956 ivideo->CRT2LCDType = LCD_320x240;
2961 if(ivideo->CRT2LCDType == LCD_UNKNOWN) {
2963 ivideo->CRT2LCDType = LCD_1024x768;
2970 if(ivideo->CRT2LCDType == sis_lcd_data[i].lcdtype) {
2971 ivideo->lcdxres = sis_lcd_data[i].xres;
2972 ivideo->lcdyres = sis_lcd_data[i].yres;
2973 ivideo->lcddefmodeidx = sis_lcd_data[i].default_mode_idx;
2979 if(ivideo->SiS_Pr.SiS_CustomT == CUT_BARCO1366) {
2980 ivideo->lcdxres = 1360; ivideo->lcdyres = 1024;
2981 ivideo->lcddefmodeidx = DEFAULT_MODE_1360;
2982 } else if(ivideo->SiS_Pr.SiS_CustomT == CUT_PANEL848) {
2983 ivideo->lcdxres = 848; ivideo->lcdyres = 480;
2984 ivideo->lcddefmodeidx = DEFAULT_MODE_848;
2985 } else if(ivideo->SiS_Pr.SiS_CustomT == CUT_PANEL856) {
2986 ivideo->lcdxres = 856; ivideo->lcdyres = 480;
2987 ivideo->lcddefmodeidx = DEFAULT_MODE_856;
2992 ivideo->lcdxres, ivideo->lcdyres);
2995 static void sisfb_save_pdc_emi(struct sis_video_info *ivideo)
2999 if(ivideo->sisvga_engine == SIS_300_VGA) {
3000 if(ivideo->vbflags2 & (VB2_LVDS | VB2_30xBDH)) {
3005 ivideo->detectedpdc = SiS_GetReg(SISPART1, 0x13);
3006 ivideo->detectedpdc &= 0x3c;
3007 if(ivideo->SiS_Pr.PDC == -1) {
3009 ivideo->SiS_Pr.PDC = ivideo->detectedpdc;
3012 ivideo->detectedpdc);
3014 if((ivideo->SiS_Pr.PDC != -1) &&
3015 (ivideo->SiS_Pr.PDC != ivideo->detectedpdc)) {
3017 ivideo->SiS_Pr.PDC);
3024 if(ivideo->sisvga_engine == SIS_315_VGA) {
3027 if(ivideo->vbflags2 & VB2_SISLCDABRIDGE) {
3031 ivideo->SiS_Pr.SiS_UseLCDA = true;
3032 ivideo->detectedlcda = 0x03;
3037 if(ivideo->vbflags2 & VB2_SISLVDSBRIDGE) {
3040 if((tmp & 0x20) || (ivideo->detectedlcda != 0xff)) {
3044 ivideo->detectedpdc = (pdc & 0x0f) << 1;
3045 ivideo->detectedpdca = (pdc & 0xf0) >> 3;
3047 ivideo->detectedpdc |= ((pdc >> 7) & 0x01);
3049 ivideo->detectedpdca |= ((pdc >> 6) & 0x01);
3050 if(ivideo->newrom) {
3052 if(ivideo->detectedlcda != 0xff) {
3053 ivideo->detectedpdc = 0xff;
3055 ivideo->detectedpdca = 0xff;
3058 if(ivideo->SiS_Pr.PDC == -1) {
3059 if(ivideo->detectedpdc != 0xff) {
3060 ivideo->SiS_Pr.PDC = ivideo->detectedpdc;
3063 if(ivideo->SiS_Pr.PDCA == -1) {
3064 if(ivideo->detectedpdca != 0xff) {
3065 ivideo->SiS_Pr.PDCA = ivideo->detectedpdca;
3068 if(ivideo->detectedpdc != 0xff) {
3071 ivideo->detectedpdc);
3073 if(ivideo->detectedpdca != 0xff) {
3076 ivideo->detectedpdca);
3081 if(ivideo->vbflags2 & VB2_SISEMIBRIDGE) {
3082 ivideo->SiS_Pr.EMI_30 = SiS_GetReg(SISPART4, 0x30);
3083 ivideo->SiS_Pr.EMI_31 = SiS_GetReg(SISPART4, 0x31);
3084 ivideo->SiS_Pr.EMI_32 = SiS_GetReg(SISPART4, 0x32);
3085 ivideo->SiS_Pr.EMI_33 = SiS_GetReg(SISPART4, 0x33);
3086 ivideo->SiS_Pr.HaveEMI = true;
3087 if((tmp & 0x20) || (ivideo->detectedlcda != 0xff)) {
3088 ivideo->SiS_Pr.HaveEMILCD = true;
3094 if(ivideo->vbflags2 & VB2_30xBLV) {
3095 if((ivideo->SiS_Pr.PDC != -1) &&
3096 (ivideo->SiS_Pr.PDC != ivideo->detectedpdc)) {
3098 ivideo->SiS_Pr.PDC);
3100 if((ivideo->SiS_Pr.PDCA != -1) &&
3101 (ivideo->SiS_Pr.PDCA != ivideo->detectedpdca)) {
3103 ivideo->SiS_Pr.PDCA);
3113 static u32 sisfb_getheapstart(struct sis_video_info *ivideo)
3115 u32 ret = ivideo->sisfb_parm_mem * 1024;
3116 u32 maxoffs = ivideo->video_size - ivideo->hwcursor_size - ivideo->cmdQueueSize;
3138 if(ivideo->sisvga_engine == SIS_300_VGA) {
3139 if(ivideo->video_size > 0x1000000) {
3141 } else if(ivideo->video_size > 0x800000) {
3146 } else if(ivideo->UMAsize && ivideo->LFBsize) {
3153 if((!ret) || (ret > maxoffs) || (ivideo->cardnumber != 0))
3159 static u32 sisfb_getheapsize(struct sis_video_info *ivideo)
3161 u32 max = ivideo->video_size - ivideo->hwcursor_size - ivideo->cmdQueueSize;
3164 if(ivideo->UMAsize && ivideo->LFBsize) {
3165 if( (!ivideo->sisfb_parm_mem) ||
3166 ((ivideo->sisfb_parm_mem * 1024) > max) ||
3167 ((max - (ivideo->sisfb_parm_mem * 1024)) < ivideo->UMAsize) ) {
3168 ret = ivideo->UMAsize;
3169 max -= ivideo->UMAsize;
3171 ret = max - (ivideo->sisfb_parm_mem * 1024);
3172 max = ivideo->sisfb_parm_mem * 1024;
3174 ivideo->video_offset = ret;
3175 ivideo->sisfb_mem = max;
3177 ret = max - ivideo->heapstart;
3178 ivideo->sisfb_mem = ivideo->heapstart;
3184 static int sisfb_heap_init(struct sis_video_info *ivideo)
3188 ivideo->video_offset = 0;
3189 if(ivideo->sisfb_parm_mem) {
3190 if( (ivideo->sisfb_parm_mem < (2 * 1024 * 1024)) ||
3191 (ivideo->sisfb_parm_mem > ivideo->video_size) ) {
3192 ivideo->sisfb_parm_mem = 0;
3196 ivideo->heapstart = sisfb_getheapstart(ivideo);
3197 ivideo->sisfb_heap_size = sisfb_getheapsize(ivideo);
3199 ivideo->sisfb_heap_start = ivideo->video_vbase + ivideo->heapstart;
3200 ivideo->sisfb_heap_end = ivideo->sisfb_heap_start + ivideo->sisfb_heap_size;
3203 (int)(ivideo->heapstart / 1024), (int)(ivideo->sisfb_heap_size / 1024));
3205 ivideo->sisfb_heap.vinfo = ivideo;
3207 ivideo->sisfb_heap.poha_chain = NULL;
3208 ivideo->sisfb_heap.poh_freelist = NULL;
3210 poh = sisfb_poh_new_node(&ivideo->sisfb_heap);
3214 poh->poh_next = &ivideo->sisfb_heap.oh_free;
3215 poh->poh_prev = &ivideo->sisfb_heap.oh_free;
3216 poh->size = ivideo->sisfb_heap_size;
3217 poh->offset = ivideo->heapstart;
3219 ivideo->sisfb_heap.oh_free.poh_next = poh;
3220 ivideo->sisfb_heap.oh_free.poh_prev = poh;
3221 ivideo->sisfb_heap.oh_free.size = 0;
3222 ivideo->sisfb_heap.max_freesize = poh->size;
3224 ivideo->sisfb_heap.oh_used.poh_next = &ivideo->sisfb_heap.oh_used;
3225 ivideo->sisfb_heap.oh_used.poh_prev = &ivideo->sisfb_heap.oh_used;
3226 ivideo->sisfb_heap.oh_used.size = SENTINEL;
3228 if(ivideo->cardnumber == 0) {
3232 sisfb_heap = &ivideo->sisfb_heap;
3424 sis_int_malloc(struct sis_video_info *ivideo, struct sis_memreq *req)
3428 if((ivideo) && (ivideo->sisfb_id == SISFB_ID) && (!ivideo->havenoheap))
3429 poh = sisfb_poh_allocate(&ivideo->sisfb_heap, (u32)req->size);
3438 (poh->offset + ivideo->video_vbase));
3445 struct sis_video_info *ivideo = sisfb_heap->vinfo;
3447 if(&ivideo->sisfb_heap == sisfb_heap)
3448 sis_int_malloc(ivideo, req);
3456 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
3458 sis_int_malloc(ivideo, req);
3464 sis_int_free(struct sis_video_info *ivideo, u32 base)
3468 if((!ivideo) || (ivideo->sisfb_id != SISFB_ID) || (ivideo->havenoheap))
3471 poh = sisfb_poh_free(&ivideo->sisfb_heap, base);
3482 struct sis_video_info *ivideo = sisfb_heap->vinfo;
3484 sis_int_free(ivideo, base);
3490 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
3492 sis_int_free(ivideo, base);
3498 sisfb_check_engine_and_sync(struct sis_video_info *ivideo)
3504 * ivideo->accel here, as this might have
3512 if(ivideo->sisvga_engine == SIS_300_VGA) {
3517 sisfb_syncaccel(ivideo);
3521 if(ivideo->sisvga_engine == SIS_315_VGA) {
3528 sisfb_syncaccel(ivideo);
3536 sisfb_pre_setmode(struct sis_video_info *ivideo)
3541 ivideo->currentvbflags &= (VB_VIDEOBRIDGE | VB_DISPTYPE_DISP2);
3549 cr33 = ivideo->rate_idx & 0x0F;
3552 if(ivideo->sisvga_engine == SIS_315_VGA) {
3553 if(ivideo->chip >= SIS_661) {
3564 if(ivideo->sisvga_engine == SIS_300_VGA) {
3570 SiS_SetEnableDstn(&ivideo->SiS_Pr, false);
3571 SiS_SetEnableFstn(&ivideo->SiS_Pr, false);
3572 ivideo->curFSTN = ivideo->curDSTN = 0;
3574 switch(ivideo->currentvbflags & VB_DISPTYPE_DISP2) {
3578 if((ivideo->vbflags & TV_YPBPR) && (ivideo->vbflags2 & VB2_SISYPBPRBRIDGE)) {
3580 if(ivideo->chip >= SIS_661) {
3582 if(ivideo->vbflags & TV_YPBPR525P) cr35 |= 0x20;
3583 else if(ivideo->vbflags & TV_YPBPR750P) cr35 |= 0x40;
3584 else if(ivideo->vbflags & TV_YPBPR1080I) cr35 |= 0x60;
3587 ivideo->currentvbflags |= (TV_YPBPR | (ivideo->vbflags & TV_YPBPRALL));
3588 } else if(ivideo->sisvga_engine == SIS_315_VGA) {
3591 if(ivideo->vbflags & TV_YPBPR525P) cr38 |= 0x10;
3592 else if(ivideo->vbflags & TV_YPBPR750P) cr38 |= 0x20;
3593 else if(ivideo->vbflags & TV_YPBPR1080I) cr38 |= 0x30;
3595 ivideo->currentvbflags |= (TV_YPBPR | (ivideo->vbflags & TV_YPBPRALL));
3598 } else if((ivideo->vbflags & TV_HIVISION) &&
3599 (ivideo->vbflags2 & VB2_SISHIVISIONBRIDGE)) {
3600 if(ivideo->chip >= SIS_661) {
3609 ivideo->currentvbflags |= TV_HIVISION;
3610 } else if(ivideo->vbflags & TV_SCART) {
3614 ivideo->currentvbflags |= TV_SCART;
3616 if(ivideo->vbflags & TV_SVIDEO) {
3618 ivideo->currentvbflags |= TV_SVIDEO;
3620 if(ivideo->vbflags & TV_AVIDEO) {
3622 ivideo->currentvbflags |= TV_AVIDEO;
3627 if(ivideo->vbflags & (TV_AVIDEO | TV_SVIDEO)) {
3628 if(ivideo->vbflags & TV_PAL) {
3630 ivideo->currentvbflags |= TV_PAL;
3631 if(ivideo->vbflags & TV_PALM) {
3633 ivideo->currentvbflags |= TV_PALM;
3634 } else if(ivideo->vbflags & TV_PALN) {
3636 ivideo->currentvbflags |= TV_PALN;
3640 ivideo->currentvbflags |= TV_NTSC;
3641 if(ivideo->vbflags & TV_NTSCJ) {
3643 ivideo->currentvbflags |= TV_NTSCJ;
3652 SiS_SetEnableDstn(&ivideo->SiS_Pr, ivideo->sisfb_dstn);
3653 SiS_SetEnableFstn(&ivideo->SiS_Pr, ivideo->sisfb_fstn);
3654 ivideo->curFSTN = ivideo->sisfb_fstn;
3655 ivideo->curDSTN = ivideo->sisfb_dstn;
3661 if(ivideo->sisfb_nocrt2rate) {
3662 cr33 |= (sisbios_mode[ivideo->sisfb_mode_idx].rate_idx << 4);
3664 cr33 |= ((ivideo->rate_idx & 0x0F) << 4);
3676 if(ivideo->chip >= SIS_661) {
3683 } else if(ivideo->chip != SIS_300) {
3688 ivideo->SiS_Pr.SiS_UseOEM = ivideo->sisfb_useoem;
3690 sisfb_check_engine_and_sync(ivideo);
3696 sisfb_fixup_SR11(struct sis_video_info *ivideo)
3700 if(ivideo->chip >= SIS_661) {
3716 sisfb_set_TVxposoffset(struct sis_video_info *ivideo, int val)
3720 ivideo->tvxpos = val;
3722 if(ivideo->sisfblocked) return;
3723 if(!ivideo->modechanged) return;
3725 if(ivideo->currentvbflags & CRT2_TV) {
3727 if(ivideo->vbflags2 & VB2_CHRONTEL) {
3729 int x = ivideo->tvx;
3731 switch(ivideo->chronteltype) {
3736 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0a, (x & 0xff));
3737 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x08, ((x & 0x0100) >> 7), 0xFD);
3744 } else if(ivideo->vbflags2 & VB2_SISBRIDGE) {
3749 p2_1f = ivideo->p2_1f;
3750 p2_20 = ivideo->p2_20;
3751 p2_2b = ivideo->p2_2b;
3752 p2_42 = ivideo->p2_42;
3753 p2_43 = ivideo->p2_43;
3774 sisfb_set_TVyposoffset(struct sis_video_info *ivideo, int val)
3778 ivideo->tvypos = val;
3780 if(ivideo->sisfblocked) return;
3781 if(!ivideo->modechanged) return;
3783 if(ivideo->currentvbflags & CRT2_TV) {
3785 if(ivideo->vbflags2 & VB2_CHRONTEL) {
3787 int y = ivideo->tvy;
3789 switch(ivideo->chronteltype) {
3794 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0b, (y & 0xff));
3795 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x08, ((y & 0x0100) >> 8), 0xFE);
3802 } else if(ivideo->vbflags2 & VB2_SISBRIDGE) {
3806 p2_01 = ivideo->p2_01;
3807 p2_02 = ivideo->p2_02;
3811 if(!(ivideo->currentvbflags & (TV_HIVISION | TV_YPBPR))) {
3824 sisfb_post_setmode(struct sis_video_info *ivideo)
3838 sisfb_fixup_SR11(ivideo);
3842 ivideo->modechanged = 1;
3845 if(ivideo->vbflags2 & VB2_VIDEOBRIDGE) {
3846 if(sisfb_bridgeisslave(ivideo)) doit = false;
3848 ivideo->sisfb_crt1off = 0;
3851 if(ivideo->sisvga_engine == SIS_300_VGA) {
3852 if((ivideo->sisfb_crt1off) && (doit)) {
3863 if(ivideo->sisvga_engine == SIS_315_VGA) {
3864 if((ivideo->sisfb_crt1off) && (doit)) {
3873 SiS_SetRegANDOR(SISCR, ivideo->SiS_Pr.SiS_MyCR63, ~0x40, reg);
3879 ivideo->currentvbflags &= ~VB_DISPTYPE_CRT1;
3880 ivideo->currentvbflags |= VB_SINGLE_MODE;
3882 ivideo->currentvbflags |= VB_DISPTYPE_CRT1;
3883 if(ivideo->currentvbflags & VB_DISPTYPE_CRT2) {
3884 ivideo->currentvbflags |= VB_MIRROR_MODE;
3886 ivideo->currentvbflags |= VB_SINGLE_MODE;
3892 if(ivideo->currentvbflags & CRT2_TV) {
3893 if(ivideo->vbflags2 & VB2_SISBRIDGE) {
3894 ivideo->p2_1f = SiS_GetReg(SISPART2, 0x1f);
3895 ivideo->p2_20 = SiS_GetReg(SISPART2, 0x20);
3896 ivideo->p2_2b = SiS_GetReg(SISPART2, 0x2b);
3897 ivideo->p2_42 = SiS_GetReg(SISPART2, 0x42);
3898 ivideo->p2_43 = SiS_GetReg(SISPART2, 0x43);
3899 ivideo->p2_01 = SiS_GetReg(SISPART2, 0x01);
3900 ivideo->p2_02 = SiS_GetReg(SISPART2, 0x02);
3901 } else if(ivideo->vbflags2 & VB2_CHRONTEL) {
3902 if(ivideo->chronteltype == 1) {
3903 ivideo->tvx = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0a);
3904 ivideo->tvx |= (((SiS_GetCH700x(&ivideo->SiS_Pr, 0x08) & 0x02) >> 1) << 8);
3905 ivideo->tvy = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0b);
3906 ivideo->tvy |= ((SiS_GetCH700x(&ivideo->SiS_Pr, 0x08) & 0x01) << 8);
3911 if(ivideo->tvxpos) {
3912 sisfb_set_TVxposoffset(ivideo, ivideo->tvxpos);
3914 if(ivideo->tvypos) {
3915 sisfb_set_TVyposoffset(ivideo, ivideo->tvypos);
3919 sisfb_check_engine_and_sync(ivideo);
3922 if(ivideo->accel) {
3923 sisfb_engine_init(ivideo);
3925 ivideo->engineok = 0;
3930 sisfb_reset_mode(struct sis_video_info *ivideo)
3932 if(sisfb_set_mode(ivideo, 0))
3935 sisfb_set_pitch(ivideo);
3936 sisfb_set_base_CRT1(ivideo, ivideo->current_base);
3937 sisfb_set_base_CRT2(ivideo, ivideo->current_base);
3943 sisfb_handle_command(struct sis_video_info *ivideo, struct sisfb_cmd *sisfb_command)
3949 if(!ivideo->modechanged) {
3953 sisfb_command->sisfb_result[1] = ivideo->currentvbflags;
3954 sisfb_command->sisfb_result[2] = ivideo->vbflags2;
3959 if(!ivideo->modechanged) {
3963 sisfb_command->sisfb_result[1] = ivideo->sisfb_crt1off ? 0 : 1;
3965 } else if(ivideo->sisfblocked) {
3967 } else if((!(ivideo->currentvbflags & CRT2_ENABLE)) &&
3973 if( ((ivideo->currentvbflags & VB_DISPTYPE_CRT1) && mycrt1off) ||
3974 ((!(ivideo->currentvbflags & VB_DISPTYPE_CRT1)) && !mycrt1off) ) {
3975 ivideo->sisfb_crt1off = mycrt1off;
3976 if(sisfb_reset_mode(ivideo)) {
3980 sisfb_command->sisfb_result[1] = ivideo->sisfb_crt1off ? 0 : 1;
4091 struct sis_video_info *ivideo)
4109 if((readb(rom + 4) | (readb(rom + 5) << 8)) != ivideo->chip_vendor)
4112 if((readb(rom + 6) | (readb(rom + 7) << 8)) != ivideo->chip_id)
4120 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
4129 if(!ivideo->nbridge) {
4133 if(sisfb_check_rom(rom_base, ivideo)) {
4158 if (!sisfb_check_rom(rom_base, ivideo)) {
4177 static void sisfb_post_map_vram(struct sis_video_info *ivideo,
4183 ivideo->video_vbase = ioremap_wc(ivideo->video_base, (*mapsize));
4185 if(!ivideo->video_vbase) {
4189 while((!(ivideo->video_vbase = ioremap_wc(ivideo->video_base, (*mapsize))))) {
4194 if(ivideo->video_vbase) {
4203 static int sisfb_post_300_buswidth(struct sis_video_info *ivideo)
4205 void __iomem *FBAddress = ivideo->video_vbase;
4268 static int sisfb_post_300_rwtest(struct sis_video_info *ivideo, int iteration,
4272 void __iomem *FBAddr = ivideo->video_vbase;
4339 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
4343 buswidth = sisfb_post_300_buswidth(ivideo);
4350 if(sisfb_post_300_rwtest(ivideo,
4364 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
4365 unsigned char *bios = ivideo->SiS_Pr.VirtualRomBase;
4370 if(!ivideo->SiS_Pr.UseROM)
4385 if(ivideo->revision_id <= 0x13) {
4430 if(ivideo->revision_id >= 0x80)
4448 if(ivideo->revision_id >= 0x80)
4473 if(ivideo->revision_id >= 0x80)
4481 if (ivideo->SiS_Pr.UseROM && bios) {
4516 mapsize = ivideo->video_size;
4517 sisfb_post_map_vram(ivideo, &mapsize, 4);
4519 if(ivideo->video_vbase) {
4521 iounmap(ivideo->video_vbase);
4548 sisfb_sense_crt1(ivideo);
4551 ivideo->SiS_Pr.SiS_UseOEM = false;
4552 SiS_SetEnableDstn(&ivideo->SiS_Pr, false);
4553 SiS_SetEnableFstn(&ivideo->SiS_Pr, false);
4554 ivideo->curFSTN = ivideo->curDSTN = 0;
4555 ivideo->SiS_Pr.VideoMemorySize = 8 << 20;
4556 SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80);
4567 ivideo->modeprechange = 0x2e;
4579 static inline int sisfb_xgi_is21(struct sis_video_info *ivideo)
4581 return ivideo->chip_real_id == XGI_21;
4584 static void sisfb_post_xgi_delay(struct sis_video_info *ivideo, int delay)
4595 static int sisfb_find_host_bridge(struct sis_video_info *ivideo,
4615 static int sisfb_post_xgi_rwtest(struct sis_video_info *ivideo, int starta,
4621 writel(0, ivideo->video_vbase);
4626 writel(pos, ivideo->video_vbase + pos);
4629 sisfb_post_xgi_delay(ivideo, 150);
4631 if(readl(ivideo->video_vbase) != 0)
4637 if(readl(ivideo->video_vbase + pos) != pos)
4646 static int sisfb_post_xgi_ramsize(struct sis_video_info *ivideo)
4683 mapsize = ivideo->video_size;
4684 sisfb_post_map_vram(ivideo, &mapsize, 32);
4686 if(!ivideo->video_vbase) {
4699 if(ivideo->chip == XGI_20) {
4707 sisfb_post_xgi_delay(ivideo, 1);
4709 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize))
4714 sisfb_post_xgi_delay(ivideo, 1);
4715 if(sisfb_post_xgi_rwtest(ivideo, 23, 23, mapsize))
4721 sisfb_post_xgi_delay(ivideo, 1);
4723 if(sisfb_post_xgi_rwtest(ivideo, 22, 23, mapsize))
4731 sisfb_post_xgi_delay(ivideo, 1);
4733 if(sisfb_post_xgi_rwtest(ivideo, 22, 23, mapsize))
4738 sisfb_post_xgi_delay(ivideo, 1);
4739 if(sisfb_post_xgi_rwtest(ivideo, 22, 22, mapsize))
4745 sisfb_post_xgi_delay(ivideo, 1);
4747 if(sisfb_post_xgi_rwtest(ivideo, 21, 22, mapsize))
4763 if(ivideo->revision_id == 2) {
4768 sisfb_post_xgi_delay(ivideo, 1);
4769 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize))
4774 if(sisfb_post_xgi_rwtest(ivideo, 22, 23, mapsize))
4781 if(sisfb_post_xgi_rwtest(ivideo, 22, 23, mapsize))
4791 sisfb_post_xgi_delay(ivideo, 1);
4792 if(sisfb_post_xgi_rwtest(ivideo, 23, 25, mapsize))
4797 sisfb_post_xgi_delay(ivideo, 1);
4799 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize))
4806 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize)) {
4814 sisfb_post_xgi_delay(ivideo, 1);
4819 if(ivideo->revision_id == 2) {
4823 sisfb_post_xgi_delay(ivideo, 1);
4825 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize))
4834 sisfb_post_xgi_delay(ivideo, 1);
4836 if(sisfb_post_xgi_rwtest(ivideo, 24, 25, mapsize))
4842 sisfb_post_xgi_delay(ivideo, 1);
4849 sisfb_post_xgi_delay(ivideo, 1);
4851 j = (ivideo->chip == XGI_20) ? 5 : 9;
4852 k = (ivideo->chip == XGI_20) ? 12 : 4;
4857 reg = (ivideo->chip == XGI_20) ?
4860 sisfb_post_xgi_delay(ivideo, 50);
4862 ranksize = (ivideo->chip == XGI_20) ?
4868 if(ivideo->chip == XGI_20) {
4885 sisfb_post_xgi_delay(ivideo, 1);
4887 if (sisfb_post_xgi_rwtest(ivideo, j, ((reg >> 4) + channelab - 2 + 20), mapsize)) {
4893 iounmap(ivideo->video_vbase);
4898 static void sisfb_post_xgi_setclocks(struct sis_video_info *ivideo, u8 regb)
4927 if(ivideo->haveXGIROM) {
4928 v1 = ivideo->bios_abase[0x90 + index];
4929 v2 = ivideo->bios_abase[0x90 + index + 1];
4930 v3 = ivideo->bios_abase[0x90 + index + 2];
4935 sisfb_post_xgi_delay(ivideo, 0x43);
4936 sisfb_post_xgi_delay(ivideo, 0x43);
4937 sisfb_post_xgi_delay(ivideo, 0x43);
4940 if(ivideo->haveXGIROM) {
4941 v1 = ivideo->bios_abase[0xb8 + index];
4942 v2 = ivideo->bios_abase[0xb8 + index + 1];
4943 v3 = ivideo->bios_abase[0xb8 + index + 2];
4948 sisfb_post_xgi_delay(ivideo, 0x43);
4949 sisfb_post_xgi_delay(ivideo, 0x43);
4950 sisfb_post_xgi_delay(ivideo, 0x43);
4953 static void sisfb_post_xgi_ddr2_mrs_default(struct sis_video_info *ivideo,
4956 unsigned char *bios = ivideo->bios_abase;
4961 sisfb_post_xgi_delay(ivideo, 15);
4970 sisfb_post_xgi_delay(ivideo, 1);
4972 sisfb_post_xgi_setclocks(ivideo, regb);
4973 sisfb_post_xgi_delay(ivideo, 0x46);
4978 sisfb_post_xgi_delay(ivideo, 1);
4980 sisfb_post_xgi_delay(ivideo, 1);
4982 sisfb_post_xgi_delay(ivideo, 1);
4984 if (ivideo->haveXGIROM) {
4991 sisfb_post_xgi_delay(ivideo, 1);
4994 static void sisfb_post_xgi_ddr2_mrs_xg21(struct sis_video_info *ivideo)
4996 sisfb_post_xgi_setclocks(ivideo, 1);
4999 sisfb_post_xgi_delay(ivideo, 0x46);
5020 sisfb_post_xgi_delay(ivideo, 1);
5023 sisfb_post_xgi_delay(ivideo, 1);
5026 sisfb_post_xgi_delay(ivideo, 1);
5032 sisfb_post_xgi_delay(ivideo, 1);
5035 static void sisfb_post_xgi_ddr2(struct sis_video_info *ivideo, u8 regb)
5037 unsigned char *bios = ivideo->bios_abase;
5058 if (ivideo->haveXGIROM) {
5073 if (sisfb_xgi_is21(ivideo))
5074 sisfb_post_xgi_ddr2_mrs_xg21(ivideo);
5076 sisfb_post_xgi_ddr2_mrs_default(ivideo, regb);
5079 static u8 sisfb_post_xgi_ramtype(struct sis_video_info *ivideo)
5081 unsigned char *bios = ivideo->bios_abase;
5087 if (ivideo->haveXGIROM) {
5092 if (sisfb_xgi_is21(ivideo)) {
5098 } else if (ivideo->chip == XGI_20) {
5120 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
5121 unsigned char *bios = ivideo->bios_abase;
5210 if(ivideo->haveXGIROM) {
5218 if(ivideo->haveXGIROM) {
5226 if(ivideo->haveXGIROM) {
5238 if(ivideo->haveXGIROM) {
5245 if(ivideo->chip == XGI_40) {
5246 if(ivideo->revision_id == 2) {
5252 if(ivideo->revision_id == 0) { /* 40 *and* 20? */
5260 reg = (ivideo->chip == XGI_40) ? 0x20 : 0x00;
5263 if(ivideo->chip == XGI_20) {
5328 } else if(sisfb_find_host_bridge(ivideo, pdev, PCI_VENDOR_ID_SI)) {
5330 } else if(sisfb_find_host_bridge(ivideo, pdev, 0x1106) ||
5331 sisfb_find_host_bridge(ivideo, pdev, 0x1022) ||
5332 sisfb_find_host_bridge(ivideo, pdev, 0x700e) ||
5333 sisfb_find_host_bridge(ivideo, pdev, 0x10de)) {
5343 if(ivideo->revision_id == 2) {
5407 ramtype = sisfb_post_xgi_ramtype(ivideo);
5408 if (!sisfb_xgi_is21(ivideo) && ramtype) {
5418 if(ivideo->haveXGIROM) {
5424 if(ivideo->haveXGIROM) {
5433 if(ivideo->haveXGIROM) {
5434 index = (ivideo->chip == XGI_20) ? 0x31a : 0x3a6;
5462 if(ivideo->haveXGIROM) {
5463 index = (ivideo->chip == XGI_20) ? 0x35a : 0x3e6;
5490 if(ivideo->haveXGIROM) {
5500 if(ivideo->haveXGIROM) {
5501 index = (ivideo->chip == XGI_20) ? 0x45a : 0x4e6;
5518 if(ivideo->haveXGIROM) {
5530 if(ivideo->haveXGIROM) {
5540 if(ivideo->haveXGIROM) {
5548 if(ivideo->haveXGIROM) {
5560 if(ivideo->chip == XGI_40) {
5561 if( (ivideo->revision_id == 1) ||
5562 (ivideo->revision_id == 2) ) {
5573 if(ivideo->chip == XGI_20) {
5580 sisfb_post_xgi_setclocks(ivideo, regb);
5581 if((ivideo->chip == XGI_20) ||
5582 (ivideo->revision_id == 1) ||
5583 (ivideo->revision_id == 2)) {
5585 if(ivideo->haveXGIROM) {
5608 if(ivideo->chip == XGI_40) {
5615 if((ivideo->chip == XGI_20) ||
5616 (ivideo->revision_id == 2)) {
5623 if((ivideo->chip == XGI_20) || (bios[0x1cb] != 0x0c)) {
5624 sisfb_post_xgi_delay(ivideo, 0x43);
5625 sisfb_post_xgi_delay(ivideo, 0x43);
5626 sisfb_post_xgi_delay(ivideo, 0x43);
5628 if((ivideo->chip == XGI_20) ||
5629 (ivideo->revision_id == 2)) {
5634 } else if((ivideo->chip == XGI_40) && (bios[0x1cb] == 0x0c)) {
5639 sisfb_post_xgi_delay(ivideo, 4);
5641 if(ivideo->haveXGIROM) {
5643 index = (ivideo->chip == XGI_20) ? 0x4b2 : 0x53e;
5650 SiS_SetReg(SISSR, 0x19, ((ivideo->chip == XGI_20) ? 0x02 : 0x01));
5653 sisfb_post_xgi_delay(ivideo, 0x43);
5655 sisfb_post_xgi_delay(ivideo, 0x22);
5663 sisfb_post_xgi_ddr2(ivideo, regb);
5666 sisfb_post_xgi_setclocks(ivideo, regb);
5667 if((ivideo->chip == XGI_40) &&
5668 ((ivideo->revision_id == 1) ||
5669 (ivideo->revision_id == 2))) {
5684 if(ivideo->haveXGIROM) {
5691 if(ivideo->chip == XGI_40) {
5694 if((ivideo->chip == XGI_40) && (ivideo->revision_id == 2)) {
5701 if(ivideo->chip == XGI_40) {
5709 if((ivideo->chip == XGI_40) && (bios[0x1cb] != 0x0c)) {
5710 sisfb_post_xgi_delay(ivideo, 0x43);
5711 sisfb_post_xgi_delay(ivideo, 0x43);
5712 sisfb_post_xgi_delay(ivideo, 0x43);
5718 sisfb_post_xgi_delay(ivideo, 4);
5720 if(ivideo->haveXGIROM) {
5725 if(ivideo->chip == XGI_40) {
5732 sisfb_post_xgi_delay(ivideo, 0x43);
5733 if(ivideo->chip == XGI_40) {
5738 sisfb_post_xgi_delay(ivideo, 0x22);
5741 if(ivideo->chip == XGI_40) {
5753 if(ivideo->haveXGIROM) {
5760 if(ivideo->haveXGIROM) {
5766 if((v1 & 0x40) && (v2 & regd) && ivideo->haveXGIROM) {
5775 ivideo->SiS_Pr.SiS_UseOEM = false;
5776 SiS_SetEnableDstn(&ivideo->SiS_Pr, false);
5777 SiS_SetEnableFstn(&ivideo->SiS_Pr, false);
5778 ivideo->curFSTN = ivideo->curDSTN = 0;
5779 ivideo->SiS_Pr.VideoMemorySize = 8 << 20;
5780 SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80);
5786 err = sisfb_post_xgi_ramsize(ivideo);
5812 if(ivideo->chip == XGI_20) {
5817 sisfb_sense_crt1(ivideo);
5824 ivideo->SiS_Pr.SiS_UseOEM = false;
5825 SiS_SetEnableDstn(&ivideo->SiS_Pr, false);
5826 SiS_SetEnableFstn(&ivideo->SiS_Pr, false);
5827 ivideo->curFSTN = ivideo->curDSTN = 0;
5828 SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80);
5839 ivideo->modeprechange = 0x2e;
5841 if(ivideo->chip == XGI_40) {
5858 struct sis_video_info *ivideo = NULL;
5871 sis_fb_info = framebuffer_alloc(sizeof(*ivideo), &pdev->dev);
5875 ivideo = (struct sis_video_info *)sis_fb_info->par;
5876 ivideo->memyselfandi = sis_fb_info;
5878 ivideo->sisfb_id = SISFB_ID;
5881 ivideo->cardnumber = 0;
5884 ivideo->cardnumber = 1;
5886 ivideo->cardnumber++;
5889 strscpy(ivideo->myid, chipinfo->chip_name, sizeof(ivideo->myid));
5891 ivideo->warncount = 0;
5892 ivideo->chip_id = pdev->device;
5893 ivideo->chip_vendor = pdev->vendor;
5894 ivideo->revision_id = pdev->revision;
5895 ivideo->SiS_Pr.ChipRevision = ivideo->revision_id;
5897 ivideo->sisvga_enabled = reg16 & 0x01;
5898 ivideo->pcibus = pdev->bus->number;
5899 ivideo->pcislot = PCI_SLOT(pdev->devfn);
5900 ivideo->pcifunc = PCI_FUNC(pdev->devfn);
5901 ivideo->subsysvendor = pdev->subsystem_vendor;
5902 ivideo->subsysdevice = pdev->subsystem_device;
5910 ivideo->chip = chipinfo->chip;
5911 ivideo->chip_real_id = chipinfo->chip;
5912 ivideo->sisvga_engine = chipinfo->vgaengine;
5913 ivideo->hwcursor_size = chipinfo->hwcursor_size;
5914 ivideo->CRT2_write_enable = chipinfo->CRT2_write_enable;
5915 ivideo->mni = chipinfo->mni;
5917 ivideo->detectedpdc = 0xff;
5918 ivideo->detectedpdca = 0xff;
5919 ivideo->detectedlcda = 0xff;
5921 ivideo->sisfb_thismonitor.datavalid = false;
5923 ivideo->current_base = 0;
5925 ivideo->engineok = 0;
5927 ivideo->sisfb_was_boot_device = 0;
5930 if(ivideo->sisvga_enabled)
5931 ivideo->sisfb_was_boot_device = 1;
5940 ivideo->sisfb_parm_mem = sisfb_parm_mem;
5941 ivideo->sisfb_accel = sisfb_accel;
5942 ivideo->sisfb_ypan = sisfb_ypan;
5943 ivideo->sisfb_max = sisfb_max;
5944 ivideo->sisfb_userom = sisfb_userom;
5945 ivideo->sisfb_useoem = sisfb_useoem;
5946 ivideo->sisfb_mode_idx = sisfb_mode_idx;
5947 ivideo->sisfb_parm_rate = sisfb_parm_rate;
5948 ivideo->sisfb_crt1off = sisfb_crt1off;
5949 ivideo->sisfb_forcecrt1 = sisfb_forcecrt1;
5950 ivideo->sisfb_crt2type = sisfb_crt2type;
5951 ivideo->sisfb_crt2flags = sisfb_crt2flags;
5953 ivideo->sisfb_dstn = sisfb_dstn;
5954 ivideo->sisfb_fstn = sisfb_fstn;
5955 ivideo->sisfb_tvplug = sisfb_tvplug;
5956 ivideo->sisfb_tvstd = sisfb_tvstd;
5957 ivideo->tvxpos = sisfb_tvxposoffset;
5958 ivideo->tvypos = sisfb_tvyposoffset;
5959 ivideo->sisfb_nocrt2rate = sisfb_nocrt2rate;
5960 ivideo->refresh_rate = 0;
5961 if(ivideo->sisfb_parm_rate != -1) {
5962 ivideo->refresh_rate = ivideo->sisfb_parm_rate;
5965 ivideo->SiS_Pr.UsePanelScaler = sisfb_scalelcd;
5966 ivideo->SiS_Pr.CenterScreen = -1;
5967 ivideo->SiS_Pr.SiS_CustomT = sisfb_specialtiming;
5968 ivideo->SiS_Pr.LVDSHL = sisfb_lvdshl;
5970 ivideo->SiS_Pr.SiS_Backup70xx = 0xff;
5971 ivideo->SiS_Pr.SiS_CHOverScan = -1;
5972 ivideo->SiS_Pr.SiS_ChSW = false;
5973 ivideo->SiS_Pr.SiS_UseLCDA = false;
5974 ivideo->SiS_Pr.HaveEMI = false;
5975 ivideo->SiS_Pr.HaveEMILCD = false;
5976 ivideo->SiS_Pr.OverruleEMI = false;
5977 ivideo->SiS_Pr.SiS_SensibleSR11 = false;
5978 ivideo->SiS_Pr.SiS_MyCR63 = 0x63;
5979 ivideo->SiS_Pr.PDC = -1;
5980 ivideo->SiS_Pr.PDCA = -1;
5981 ivideo->SiS_Pr.DDCPortMixup = false;
5983 if(ivideo->chip >= SIS_330) {
5984 ivideo->SiS_Pr.SiS_MyCR63 = 0x53;
5985 if(ivideo->chip >= SIS_661) {
5986 ivideo->SiS_Pr.SiS_SensibleSR11 = true;
5991 memcpy(&ivideo->default_var, &my_default_var, sizeof(my_default_var));
5993 pci_set_drvdata(pdev, ivideo);
5996 if((ivideo->nbridge = sisfb_get_northbridge(ivideo->chip))) {
5997 switch(ivideo->nbridge->device) {
6000 ivideo->chip = SIS_730;
6001 strcpy(ivideo->myid, "SiS 730");
6006 /* ivideo->chip is ok */
6007 strcpy(ivideo->myid, "SiS 651");
6010 ivideo->chip = SIS_740;
6011 strcpy(ivideo->myid, "SiS 740");
6014 ivideo->chip = SIS_661;
6015 strcpy(ivideo->myid, "SiS 661");
6018 ivideo->chip = SIS_741;
6019 strcpy(ivideo->myid, "SiS 741");
6022 ivideo->chip = SIS_760;
6023 strcpy(ivideo->myid, "SiS 760");
6026 ivideo->chip = SIS_761;
6027 strcpy(ivideo->myid, "SiS 761");
6035 ivideo->SiS_Pr.ChipType = ivideo->chip;
6037 ivideo->SiS_Pr.ivideo = (void *)ivideo;
6040 if((ivideo->SiS_Pr.ChipType == SIS_315PRO) ||
6041 (ivideo->SiS_Pr.ChipType == SIS_315)) {
6042 ivideo->SiS_Pr.ChipType = SIS_315H;
6046 if(!ivideo->sisvga_enabled) {
6048 pci_dev_put(ivideo->nbridge);
6054 ivideo->video_base = pci_resource_start(pdev, 0);
6055 ivideo->video_size = pci_resource_len(pdev, 0);
6056 ivideo->mmio_base = pci_resource_start(pdev, 1);
6057 ivideo->mmio_size = pci_resource_len(pdev, 1);
6058 ivideo->SiS_Pr.RelIO = pci_resource_start(pdev, 2) + 0x30;
6059 ivideo->SiS_Pr.IOAddress = ivideo->vga_base = ivideo->SiS_Pr.RelIO;
6061 SiSRegInit(&ivideo->SiS_Pr, ivideo->SiS_Pr.IOAddress);
6065 if(ivideo->chip == SIS_630) {
6068 if(mychswtable[i].subsysVendor == ivideo->subsysvendor &&
6069 mychswtable[i].subsysCard == ivideo->subsysdevice) {
6070 ivideo->SiS_Pr.SiS_ChSW = true;
6075 ivideo->lpcdev = pci_get_device(PCI_VENDOR_ID_SI, 0x0008, NULL);
6084 if((ivideo->chip == SIS_760) && (ivideo->nbridge)) {
6085 ivideo->lpcdev = pci_get_slot(ivideo->nbridge->bus, (2 << 3));
6091 if( (!ivideo->sisvga_enabled)
6102 ivideo->modeprechange = 0x03;
6105 ivideo->modeprechange = reg & 0x7f;
6106 } else if(ivideo->sisvga_enabled) {
6110 ivideo->modeprechange = readb(tt + 0x49);
6117 ivideo->bios_abase = NULL;
6118 ivideo->SiS_Pr.VirtualRomBase = NULL;
6119 ivideo->SiS_Pr.UseROM = false;
6120 ivideo->haveXGIROM = ivideo->SiS_Pr.SiS_XGIROM = false;
6121 if(ivideo->sisfb_userom) {
6122 ivideo->SiS_Pr.VirtualRomBase = sisfb_find_rom(pdev);
6123 ivideo->bios_abase = ivideo->SiS_Pr.VirtualRomBase;
6124 ivideo->SiS_Pr.UseROM = (bool)(ivideo->SiS_Pr.VirtualRomBase);
6126 ivideo->SiS_Pr.UseROM ? "" : "not ");
6127 if((ivideo->SiS_Pr.UseROM) && (ivideo->chip >= XGI_20)) {
6128 ivideo->SiS_Pr.UseROM = false;
6129 ivideo->haveXGIROM = ivideo->SiS_Pr.SiS_XGIROM = true;
6130 if( (ivideo->revision_id == 2) &&
6131 (!(ivideo->bios_abase[0x1d1] & 0x01)) ) {
6132 ivideo->SiS_Pr.DDCPortMixup = true;
6140 if(ivideo->SiS_Pr.SiS_CustomT == CUT_NONE) {
6141 sisfb_detect_custom_timing(ivideo);
6145 if (ivideo->chip == XGI_20) {
6150 ivideo->chip_real_id = XGI_21;
6157 if( (!ivideo->sisvga_enabled)
6163 if(ivideo->sisvga_engine == SIS_300_VGA) {
6164 if(ivideo->chip == SIS_300) {
6166 ivideo->sisfb_can_post = 1;
6172 if (ivideo->sisvga_engine == SIS_315_VGA) {
6175 if (ivideo->chip == XGI_20) {
6177 ivideo->sisfb_can_post = 1;
6178 } else if ((ivideo->chip == XGI_40) && ivideo->haveXGIROM) {
6180 ivideo->sisfb_can_post = 1;
6194 ivideo->sisfb_card_posted = 1;
6197 if(sisfb_get_dram_size(ivideo)) {
6205 if((ivideo->sisfb_mode_idx < 0) ||
6206 ((sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]) != 0xFF)) {
6214 if(ivideo->sisvga_engine == SIS_300_VGA)
6218 ivideo->SiS_Pr.PDC = sisfb_pdc;
6221 if(ivideo->sisvga_engine == SIS_315_VGA) {
6223 ivideo->SiS_Pr.PDCA = sisfb_pdca & 0x1f;
6227 if(!request_mem_region(ivideo->video_base, ivideo->video_size, "sisfb FB")) {
6229 (int)(ivideo->video_size >> 20));
6235 if(!request_mem_region(ivideo->mmio_base, ivideo->mmio_size, "sisfb MMIO")) {
6241 ivideo->video_vbase = ioremap_wc(ivideo->video_base, ivideo->video_size);
6242 ivideo->SiS_Pr.VideoMemoryAddress = ivideo->video_vbase;
6243 if(!ivideo->video_vbase) {
6249 ivideo->mmio_vbase = ioremap(ivideo->mmio_base, ivideo->mmio_size);
6250 if(!ivideo->mmio_vbase) {
6253 error_0: iounmap(ivideo->video_vbase);
6254 error_1: release_mem_region(ivideo->video_base, ivideo->video_size);
6255 error_2: release_mem_region(ivideo->mmio_base, ivideo->mmio_size);
6256 error_3: vfree(ivideo->bios_abase);
6257 pci_dev_put(ivideo->lpcdev);
6258 pci_dev_put(ivideo->nbridge);
6259 if(!ivideo->sisvga_enabled)
6266 ivideo->video_base, (unsigned long)ivideo->video_vbase, ivideo->video_size / 1024);
6268 if(ivideo->video_offset) {
6270 ivideo->video_offset / 1024);
6274 ivideo->mmio_base, (unsigned long)ivideo->mmio_vbase, ivideo->mmio_size / 1024);
6278 if(ivideo->sisvga_engine == SIS_300_VGA) {
6279 ivideo->cmdQueueSize = TURBO_QUEUE_AREA_SIZE;
6281 if(ivideo->chip == XGI_20) {
6282 ivideo->cmdQueueSize = COMMAND_QUEUE_AREA_SIZE_Z7;
6284 ivideo->cmdQueueSize = COMMAND_QUEUE_AREA_SIZE;
6294 ivideo->hwcursor_vbase = ivideo->video_vbase
6295 + ivideo->video_size
6296 - ivideo->cmdQueueSize
6297 - ivideo->hwcursor_size;
6298 ivideo->caps |= HW_CURSOR_CAP;
6301 if((ivideo->havenoheap = sisfb_heap_init(ivideo))) {
6306 ivideo->SiS_Pr.VideoMemoryAddress += ivideo->video_offset;
6307 ivideo->SiS_Pr.VideoMemorySize = ivideo->sisfb_mem;
6309 ivideo->vbflags = 0;
6310 ivideo->lcddefmodeidx = DEFAULT_LCDMODE;
6311 ivideo->tvdefmodeidx = DEFAULT_TVMODE;
6312 ivideo->defmodeidx = DEFAULT_MODE;
6314 ivideo->newrom = 0;
6315 if(ivideo->chip < XGI_20) {
6316 if(ivideo->bios_abase) {
6317 ivideo->newrom = SiSDetermineROMLayout661(&ivideo->SiS_Pr);
6321 if((ivideo->sisfb_mode_idx < 0) ||
6322 ((sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]) != 0xFF)) {
6324 sisfb_sense_crt1(ivideo);
6326 sisfb_get_VB_type(ivideo);
6328 if(ivideo->vbflags2 & VB2_VIDEOBRIDGE) {
6329 sisfb_detect_VB_connect(ivideo);
6332 ivideo->currentvbflags = ivideo->vbflags & (VB_VIDEOBRIDGE | TV_STANDARD);
6335 if(ivideo->vbflags2 & VB2_VIDEOBRIDGE) {
6336 if(ivideo->sisfb_crt2type != -1) {
6337 if((ivideo->sisfb_crt2type == CRT2_LCD) &&
6338 (ivideo->vbflags & CRT2_LCD)) {
6339 ivideo->currentvbflags |= CRT2_LCD;
6340 } else if(ivideo->sisfb_crt2type != CRT2_LCD) {
6341 ivideo->currentvbflags |= ivideo->sisfb_crt2type;
6347 if((ivideo->sisvga_engine == SIS_300_VGA) &&
6348 (ivideo->vbflags2 & VB2_CHRONTEL)) {
6349 if(ivideo->vbflags & CRT2_LCD)
6350 ivideo->currentvbflags |= CRT2_LCD;
6351 else if(ivideo->vbflags & CRT2_TV)
6352 ivideo->currentvbflags |= CRT2_TV;
6353 else if(ivideo->vbflags & CRT2_VGA)
6354 ivideo->currentvbflags |= CRT2_VGA;
6356 if(ivideo->vbflags & CRT2_TV)
6357 ivideo->currentvbflags |= CRT2_TV;
6358 else if(ivideo->vbflags & CRT2_LCD)
6359 ivideo->currentvbflags |= CRT2_LCD;
6360 else if(ivideo->vbflags & CRT2_VGA)
6361 ivideo->currentvbflags |= CRT2_VGA;
6366 if(ivideo->vbflags & CRT2_LCD) {
6367 sisfb_detect_lcd_type(ivideo);
6370 sisfb_save_pdc_emi(ivideo);
6372 if(!ivideo->sisfb_crt1off) {
6373 sisfb_handle_ddc(ivideo, &ivideo->sisfb_thismonitor, 0);
6375 if((ivideo->vbflags2 & VB2_SISTMDSBRIDGE) &&
6376 (ivideo->vbflags & (CRT2_VGA | CRT2_LCD))) {
6377 sisfb_handle_ddc(ivideo, &ivideo->sisfb_thismonitor, 1);
6381 if(ivideo->sisfb_mode_idx >= 0) {
6382 int bu = ivideo->sisfb_mode_idx;
6383 ivideo->sisfb_mode_idx = sisfb_validate_mode(ivideo,
6384 ivideo->sisfb_mode_idx, ivideo->currentvbflags);
6385 if(bu != ivideo->sisfb_mode_idx) {
6393 if(ivideo->sisfb_mode_idx < 0) {
6394 switch(ivideo->currentvbflags & VB_DISPTYPE_DISP2) {
6396 ivideo->sisfb_mode_idx = ivideo->lcddefmodeidx;
6399 ivideo->sisfb_mode_idx = ivideo->tvdefmodeidx;
6402 ivideo->sisfb_mode_idx = ivideo->defmodeidx;
6407 ivideo->mode_no = sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni];
6409 if(ivideo->refresh_rate != 0) {
6410 sisfb_search_refresh_rate(ivideo, ivideo->refresh_rate,
6411 ivideo->sisfb_mode_idx);
6414 if(ivideo->rate_idx == 0) {
6415 ivideo->rate_idx = sisbios_mode[ivideo->sisfb_mode_idx].rate_idx;
6416 ivideo->refresh_rate = 60;
6419 if(ivideo->sisfb_thismonitor.datavalid) {
6420 if(!sisfb_verify_rate(ivideo, &ivideo->sisfb_thismonitor,
6421 ivideo->sisfb_mode_idx,
6422 ivideo->rate_idx,
6423 ivideo->refresh_rate)) {
6429 ivideo->video_bpp = sisbios_mode[ivideo->sisfb_mode_idx].bpp;
6430 ivideo->video_width = sisbios_mode[ivideo->sisfb_mode_idx].xres;
6431 ivideo->video_height = sisbios_mode[ivideo->sisfb_mode_idx].yres;
6433 sisfb_set_vparms(ivideo);
6436 ivideo->video_width, ivideo->video_height, ivideo->video_bpp,
6437 ivideo->refresh_rate);
6440 ivideo->default_var.xres = ivideo->default_var.xres_virtual = ivideo->video_width;
6441 ivideo->default_var.yres = ivideo->default_var.yres_virtual = ivideo->video_height;
6442 ivideo->default_var.bits_per_pixel = ivideo->video_bpp;
6444 sisfb_bpp_to_var(ivideo, &ivideo->default_var);
6446 ivideo->default_var.pixclock = (u32) (1000000000 /
6447 sisfb_mode_rate_to_dclock(&ivideo->SiS_Pr, ivideo->mode_no, ivideo->rate_idx));
6449 if(sisfb_mode_rate_to_ddata(&ivideo->SiS_Pr, ivideo->mode_no,
6450 ivideo->rate_idx, &ivideo->default_var)) {
6451 if((ivideo->default_var.vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
6452 ivideo->default_var.pixclock <<= 1;
6456 if(ivideo->sisfb_ypan) {
6458 ivideo->default_var.yres_virtual =
6459 sisfb_calc_maxyres(ivideo, &ivideo->default_var);
6460 if(ivideo->default_var.yres_virtual < ivideo->default_var.yres) {
6461 ivideo->default_var.yres_virtual = ivideo->default_var.yres;
6465 sisfb_calc_pitch(ivideo, &ivideo->default_var);
6467 ivideo->accel = 0;
6468 if(ivideo->sisfb_accel) {
6469 ivideo->accel = -1;
6471 ivideo->default_var.accel_flags |= FB_ACCELF_TEXT;
6474 sisfb_initaccel(ivideo);
6481 ((ivideo->accel) ? 0 : FBINFO_HWACCEL_DISABLED);
6483 sis_fb_info->var = ivideo->default_var;
6484 sis_fb_info->fix = ivideo->sisfb_fix;
6485 sis_fb_info->screen_base = ivideo->video_vbase + ivideo->video_offset;
6487 sis_fb_info->pseudo_palette = ivideo->pseudo_palette;
6491 printk(KERN_DEBUG "sisfb: Initial vbflags 0x%x\n", (int)ivideo->vbflags);
6493 ivideo->wc_cookie = arch_phys_wc_add(ivideo->video_base,
6494 ivideo->video_size);
6498 iounmap(ivideo->mmio_vbase);
6502 ivideo->registered = 1;
6505 ivideo->next = card_list;
6506 card_list = ivideo;
6509 ivideo->sisfb_accel ? "enabled" : "disabled",
6510 ivideo->sisfb_ypan ?
6511 (ivideo->sisfb_max ? "enabled (auto-max)" :
6517 ivideo->myid, VER_MAJOR, VER_MINOR, VER_LEVEL);
6532 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
6533 struct fb_info *sis_fb_info = ivideo->memyselfandi;
6534 int registered = ivideo->registered;
6535 int modechanged = ivideo->modechanged;
6538 iounmap(ivideo->mmio_vbase);
6539 iounmap(ivideo->video_vbase);
6542 release_mem_region(ivideo->video_base, ivideo->video_size);
6543 release_mem_region(ivideo->mmio_base, ivideo->mmio_size);
6545 vfree(ivideo->bios_abase);
6547 pci_dev_put(ivideo->lpcdev);
6549 pci_dev_put(ivideo->nbridge);
6551 arch_phys_wc_del(ivideo->wc_cookie);
6556 if(!ivideo->sisvga_enabled)
6560 if(ivideo->registered) {
6565 /* OK, our ivideo is gone for good from here. */