• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/drivers/video/sis/

Lines Matching defs:ivideo

70 static void sisfb_handle_command(struct sis_video_info *ivideo,
116 /* We don't know the hardware specs yet and there is no ivideo */
159 /* We don't know the hardware specs yet and there is no ivideo */
265 /* We don't know the hardware specs yet and there is no ivideo */
291 /* We don't know the hardware specs yet and there is no ivideo */
311 /* We don't know the hardware specs yet and there is no ivideo */
351 sisfb_detect_custom_timing(struct sis_video_info *ivideo)
359 if(ivideo->SiS_Pr.UseROM) {
360 biosver = ivideo->SiS_Pr.VirtualRomBase + 0x06;
361 biosdate = ivideo->SiS_Pr.VirtualRomBase + 0x2c;
363 chksum += ivideo->SiS_Pr.VirtualRomBase[i];
368 if( (mycustomttable[i].chipID == ivideo->chip) &&
370 (ivideo->SiS_Pr.UseROM &&
374 (ivideo->SiS_Pr.UseROM &&
378 (ivideo->SiS_Pr.UseROM &&
380 (mycustomttable[i].pcisubsysvendor == ivideo->subsysvendor) &&
381 (mycustomttable[i].pcisubsyscard == ivideo->subsysdevice) ) {
385 if(ivideo->SiS_Pr.UseROM) {
386 if(ivideo->SiS_Pr.VirtualRomBase[mycustomttable[i].biosFootprintAddr[j]] !=
395 ivideo->SiS_Pr.SiS_CustomT = mycustomttable[i].SpecialID;
511 sisfb_handle_ddc(struct sis_video_info *ivideo, struct sisfb_monitor *monitor, int crtno)
519 if(ivideo->vbflags & CRT2_LCD) realcrtno = 1;
520 else if(ivideo->vbflags & CRT2_VGA) realcrtno = 2;
524 if((ivideo->sisfb_crt1off) && (!crtno))
527 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, ivideo->sisvga_engine,
528 realcrtno, 0, &buffer[0], ivideo->vbflags2);
543 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, ivideo->sisvga_engine,
544 realcrtno, 1, &buffer[0], ivideo->vbflags2);
566 sisfb_verify_rate(struct sis_video_info *ivideo, struct sisfb_monitor *monitor,
579 switch(sisbios_mode[mode_idx].mode_no[ivideo->mni]) {
593 if(ivideo->sisvga_engine == SIS_315_VGA) return true;
602 if(sisfb_gettotalfrommode(&ivideo->SiS_Pr,
603 sisbios_mode[mode_idx].mode_no[ivideo->mni],
620 sisfb_validate_mode(struct sis_video_info *ivideo, int myindex, u32 vbflags)
625 if(ivideo->sisvga_engine == SIS_300_VGA) {
631 if(ivideo->sisvga_engine == SIS_315_VGA) {
642 xres = ivideo->lcdxres; yres = ivideo->lcdyres;
644 if((ivideo->SiS_Pr.SiS_CustomT != CUT_PANEL848) &&
645 (ivideo->SiS_Pr.SiS_CustomT != CUT_PANEL856)) {
652 if(ivideo->sisfb_fstn) {
664 if(SiS_GetModeID_LCD(ivideo->sisvga_engine, vbflags, sisbios_mode[myindex].xres,
665 sisbios_mode[myindex].yres, 0, ivideo->sisfb_fstn,
666 ivideo->SiS_Pr.SiS_CustomT, xres, yres, ivideo->vbflags2) < 0x14) {
672 if(SiS_GetModeID_TV(ivideo->sisvga_engine, vbflags, sisbios_mode[myindex].xres,
673 sisbios_mode[myindex].yres, 0, ivideo->vbflags2) < 0x14) {
679 if(SiS_GetModeID_VGA2(ivideo->sisvga_engine, vbflags, sisbios_mode[myindex].xres,
680 sisbios_mode[myindex].yres, 0, ivideo->vbflags2) < 0x14) {
690 sisfb_search_refresh_rate(struct sis_video_info *ivideo, unsigned int rate, int mode_idx)
696 ivideo->rate_idx = 0;
700 ivideo->rate_idx = sisfb_vrate[i].idx;
706 ivideo->rate_idx = sisfb_vrate[i].idx;
707 ivideo->refresh_rate = sisfb_vrate[i].refresh;
712 ivideo->rate_idx = sisfb_vrate[i-1].idx;
713 ivideo->refresh_rate = sisfb_vrate[i-1].refresh;
719 ivideo->rate_idx = sisfb_vrate[i].idx;
725 if(ivideo->rate_idx > 0) {
726 return ivideo->rate_idx;
735 sisfb_bridgeisslave(struct sis_video_info *ivideo)
739 if(!(ivideo->vbflags2 & VB2_VIDEOBRIDGE))
743 if( ((ivideo->sisvga_engine == SIS_300_VGA) && (P1_00 & 0xa0) == 0x20) ||
744 ((ivideo->sisvga_engine == SIS_315_VGA) && (P1_00 & 0x50) == 0x10) ) {
752 sisfballowretracecrt1(struct sis_video_info *ivideo)
768 sisfbcheckvretracecrt1(struct sis_video_info *ivideo)
770 if(!sisfballowretracecrt1(ivideo))
780 sisfbwaitretracecrt1(struct sis_video_info *ivideo)
784 if(!sisfballowretracecrt1(ivideo))
794 sisfbcheckvretracecrt2(struct sis_video_info *ivideo)
798 switch(ivideo->sisvga_engine) {
812 sisfb_CheckVBRetrace(struct sis_video_info *ivideo)
814 if(ivideo->currentvbflags & VB_DISPTYPE_DISP2) {
815 if(!sisfb_bridgeisslave(ivideo)) {
816 return sisfbcheckvretracecrt2(ivideo);
819 return sisfbcheckvretracecrt1(ivideo);
823 sisfb_setupvbblankflags(struct sis_video_info *ivideo, u32 *vcount, u32 *hcount)
830 if((ivideo->currentvbflags & VB_DISPTYPE_DISP2) && (!(sisfb_bridgeisslave(ivideo)))) {
837 switch(ivideo->sisvga_engine) {
852 } else if(sisfballowretracecrt1(ivideo)) {
873 sisfb_myblank(struct sis_video_info *ivideo, int blank)
928 if(ivideo->currentvbflags & VB_DISPTYPE_CRT1) {
930 if( (!ivideo->sisfb_thismonitor.datavalid) ||
931 ((ivideo->sisfb_thismonitor.datavalid) &&
932 (ivideo->sisfb_thismonitor.feature & 0xe0))) {
934 if(ivideo->sisvga_engine == SIS_315_VGA) {
935 setSISIDXREG(SISCR, ivideo->SiS_Pr.SiS_MyCR63, 0xbf, cr63);
938 if(!(sisfb_bridgeisslave(ivideo))) {
946 if(ivideo->currentvbflags & CRT2_LCD) {
948 if(ivideo->vbflags2 & VB2_SISLVDSBRIDGE) {
950 SiS_SiS30xBLOn(&ivideo->SiS_Pr);
952 SiS_SiS30xBLOff(&ivideo->SiS_Pr);
954 } else if(ivideo->sisvga_engine == SIS_315_VGA) {
956 if(ivideo->vbflags2 & VB2_CHRONTEL) {
958 SiS_Chrontel701xBLOn(&ivideo->SiS_Pr);
960 SiS_Chrontel701xBLOff(&ivideo->SiS_Pr);
966 if(((ivideo->sisvga_engine == SIS_300_VGA) &&
967 (ivideo->vbflags2 & (VB2_301|VB2_30xBDH|VB2_LVDS))) ||
968 ((ivideo->sisvga_engine == SIS_315_VGA) &&
969 ((ivideo->vbflags2 & (VB2_LVDS | VB2_CHRONTEL)) == VB2_LVDS))) {
973 if(ivideo->sisvga_engine == SIS_300_VGA) {
974 if((ivideo->vbflags2 & VB2_30xB) &&
975 (!(ivideo->vbflags2 & VB2_30xBDH))) {
978 } else if(ivideo->sisvga_engine == SIS_315_VGA) {
979 if((ivideo->vbflags2 & VB2_30xB) &&
980 (!(ivideo->vbflags2 & VB2_30xBDH))) {
985 } else if(ivideo->currentvbflags & CRT2_VGA) {
987 if(ivideo->vbflags2 & VB2_30xB) {
1002 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo;
1005 pci_read_config_dword(ivideo->nbridge, reg, &val);
1012 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo;
1014 pci_write_config_dword(ivideo->nbridge, reg, (u32)val);
1020 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo;
1023 if(!ivideo->lpcdev) return 0;
1025 pci_read_config_dword(ivideo->lpcdev, reg, &val);
1034 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo;
1036 pci_write_config_byte(ivideo->nbridge, reg, (u8)val);
1042 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo;
1045 if(!ivideo->lpcdev) return 0;
1047 pci_read_config_word(ivideo->lpcdev, reg, &val);
1061 sisfb_set_vparms(struct sis_video_info *ivideo)
1063 switch(ivideo->video_bpp) {
1065 ivideo->DstColor = 0x0000;
1066 ivideo->SiS310_AccelDepth = 0x00000000;
1067 ivideo->video_cmap_len = 256;
1070 ivideo->DstColor = 0x8000;
1071 ivideo->SiS310_AccelDepth = 0x00010000;
1072 ivideo->video_cmap_len = 16;
1075 ivideo->DstColor = 0xC000;
1076 ivideo->SiS310_AccelDepth = 0x00020000;
1077 ivideo->video_cmap_len = 16;
1080 ivideo->video_cmap_len = 16;
1081 printk(KERN_ERR "sisfb: Unsupported depth %d", ivideo->video_bpp);
1082 ivideo->accel = 0;
1087 sisfb_calc_maxyres(struct sis_video_info *ivideo, struct fb_var_screeninfo *var)
1089 int maxyres = ivideo->sisfb_mem / (var->xres_virtual * (var->bits_per_pixel >> 3));
1097 sisfb_calc_pitch(struct sis_video_info *ivideo, struct fb_var_screeninfo *var)
1099 ivideo->video_linelength = var->xres_virtual * (var->bits_per_pixel >> 3);
1100 ivideo->scrnpitchCRT1 = ivideo->video_linelength;
1101 if(!(ivideo->currentvbflags & CRT1_LCDA)) {
1103 ivideo->scrnpitchCRT1 <<= 1;
1109 sisfb_set_pitch(struct sis_video_info *ivideo)
1112 unsigned short HDisplay1 = ivideo->scrnpitchCRT1 >> 3;
1113 unsigned short HDisplay2 = ivideo->video_linelength >> 3;
1115 if(sisfb_bridgeisslave(ivideo)) isslavemode = true;
1118 if((ivideo->currentvbflags & VB_DISPTYPE_DISP1) || (isslavemode)) {
1124 if((ivideo->currentvbflags & VB_DISPTYPE_DISP2) && (!isslavemode)) {
1125 orSISIDXREG(SISPART1,ivideo->CRT2_write_enable,0x01);
1132 sisfb_bpp_to_var(struct sis_video_info *ivideo, struct fb_var_screeninfo *var)
1134 ivideo->video_cmap_len = sisfb_get_cmap_len(var);
1165 sisfb_set_mode(struct sis_video_info *ivideo, int clrscrn)
1167 unsigned short modeno = ivideo->mode_no;
1178 sisfb_pre_setmode(ivideo);
1180 if(!SiSSetMode(&ivideo->SiS_Pr, modeno)) {
1181 printk(KERN_ERR "sisfb: Setting mode[0x%x] failed\n", ivideo->mode_no);
1187 sisfb_post_setmode(ivideo);
1196 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1228 ivideo->refresh_rate = (unsigned int) (hrate * 2 / vtotal);
1230 ivideo->refresh_rate = 60;
1233 old_mode = ivideo->sisfb_mode_idx;
1234 ivideo->sisfb_mode_idx = 0;
1236 while( (sisbios_mode[ivideo->sisfb_mode_idx].mode_no[0] != 0) &&
1237 (sisbios_mode[ivideo->sisfb_mode_idx].xres <= var->xres) ) {
1238 if( (sisbios_mode[ivideo->sisfb_mode_idx].xres == var->xres) &&
1239 (sisbios_mode[ivideo->sisfb_mode_idx].yres == var->yres) &&
1240 (sisbios_mode[ivideo->sisfb_mode_idx].bpp == var->bits_per_pixel)) {
1241 ivideo->mode_no = sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni];
1245 ivideo->sisfb_mode_idx++;
1249 ivideo->sisfb_mode_idx = sisfb_validate_mode(ivideo,
1250 ivideo->sisfb_mode_idx, ivideo->currentvbflags);
1251 ivideo->mode_no = sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni];
1253 ivideo->sisfb_mode_idx = -1;
1256 if(ivideo->sisfb_mode_idx < 0) {
1259 ivideo->sisfb_mode_idx = old_mode;
1263 if(sisfb_search_refresh_rate(ivideo, ivideo->refresh_rate, ivideo->sisfb_mode_idx) == 0) {
1264 ivideo->rate_idx = sisbios_mode[ivideo->sisfb_mode_idx].rate_idx;
1265 ivideo->refresh_rate = 60;
1272 ivideo->accel = 0;
1281 if(!(info->flags & FBINFO_HWACCEL_DISABLED)) ivideo->accel = -1;
1283 if(var->accel_flags & FB_ACCELF_TEXT) ivideo->accel = -1;
1286 if((ret = sisfb_set_mode(ivideo, 1))) {
1290 ivideo->video_bpp = sisbios_mode[ivideo->sisfb_mode_idx].bpp;
1291 ivideo->video_width = sisbios_mode[ivideo->sisfb_mode_idx].xres;
1292 ivideo->video_height = sisbios_mode[ivideo->sisfb_mode_idx].yres;
1294 sisfb_calc_pitch(ivideo, var);
1295 sisfb_set_pitch(ivideo);
1297 sisfb_set_vparms(ivideo);
1299 ivideo->current_width = ivideo->video_width;
1300 ivideo->current_height = ivideo->video_height;
1301 ivideo->current_bpp = ivideo->video_bpp;
1302 ivideo->current_htotal = htotal;
1303 ivideo->current_vtotal = vtotal;
1304 ivideo->current_linelength = ivideo->video_linelength;
1305 ivideo->current_pixclock = var->pixclock;
1306 ivideo->current_refresh_rate = ivideo->refresh_rate;
1307 ivideo->sisfb_lastrates[ivideo->mode_no] = ivideo->refresh_rate;
1314 sisfb_set_base_CRT1(struct sis_video_info *ivideo, unsigned int base)
1321 if(ivideo->sisvga_engine == SIS_315_VGA) {
1327 sisfb_set_base_CRT2(struct sis_video_info *ivideo, unsigned int base)
1329 if(ivideo->currentvbflags & VB_DISPTYPE_DISP2) {
1330 orSISIDXREG(SISPART1, ivideo->CRT2_write_enable, 0x01);
1334 if(ivideo->sisvga_engine == SIS_315_VGA) {
1341 sisfb_pan_var(struct sis_video_info *ivideo, struct fb_var_screeninfo *var)
1350 ivideo->current_base = (var->yoffset * var->xres_virtual) + var->xoffset;
1357 ivideo->current_base >>= 1;
1361 ivideo->current_base >>= 2;
1365 ivideo->current_base += (ivideo->video_offset >> 2);
1367 sisfb_set_base_CRT1(ivideo, ivideo->current_base);
1368 sisfb_set_base_CRT2(ivideo, ivideo->current_base);
1389 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1400 if(ivideo->currentvbflags & VB_DISPTYPE_DISP2) {
1443 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1479 if((tidx = sisfb_validate_mode(ivideo, search_idx,
1480 ivideo->currentvbflags)) > 0) {
1495 if((tidx = sisfb_validate_mode(ivideo,search_idx,
1496 ivideo->currentvbflags)) > 0) {
1521 if( ((ivideo->vbflags2 & VB2_LVDS) ||
1522 ((ivideo->vbflags2 & VB2_30xBDH) && (ivideo->currentvbflags & CRT2_LCD))) &&
1527 } else if( (ivideo->current_htotal == htotal) &&
1528 (ivideo->current_vtotal == vtotal) &&
1529 (ivideo->current_pixclock == pixclock) ) {
1534 } else if( ( (ivideo->current_htotal != htotal) ||
1535 (ivideo->current_vtotal != vtotal) ) &&
1536 (ivideo->current_pixclock == var->pixclock) ) {
1538 if(ivideo->sisfb_lastrates[sisbios_mode[search_idx].mode_no[ivideo->mni]]) {
1540 ivideo->sisfb_lastrates[sisbios_mode[search_idx].mode_no[ivideo->mni]];
1541 } else if(ivideo->sisfb_parm_rate != -1) {
1543 refresh_rate = ivideo->sisfb_parm_rate;
1552 } else if(ivideo->current_refresh_rate) {
1553 refresh_rate = ivideo->current_refresh_rate;
1560 myrateindex = sisfb_search_refresh_rate(ivideo, refresh_rate, search_idx);
1565 var->pixclock = (u32) (1000000000 / sisfb_mode_rate_to_dclock(&ivideo->SiS_Pr,
1566 sisbios_mode[search_idx].mode_no[ivideo->mni],
1568 sisfb_mode_rate_to_ddata(&ivideo->SiS_Pr,
1569 sisbios_mode[search_idx].mode_no[ivideo->mni],
1576 if(ivideo->sisfb_thismonitor.datavalid) {
1577 if(!sisfb_verify_rate(ivideo, &ivideo->sisfb_thismonitor, search_idx,
1585 sisfb_bpp_to_var(ivideo, var);
1594 if(ivideo->sisfb_ypan) {
1595 maxyres = sisfb_calc_maxyres(ivideo, var);
1596 if(ivideo->sisfb_max) {
1637 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1653 if((err = sisfb_pan_var(ivideo, var)) < 0)
1665 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1667 return sisfb_myblank(ivideo, blank);
1681 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1718 sisvbblank.flags = sisfb_setupvbblankflags(ivideo, &sisvbblank.vcount, &sisvbblank.hcount);
1729 if(ivideo->warncount++ < 10)
1733 ivideo->sisfb_infoblock.sisfb_id = SISFB_ID;
1734 ivideo->sisfb_infoblock.sisfb_version = VER_MAJOR;
1735 ivideo->sisfb_infoblock.sisfb_revision = VER_MINOR;
1736 ivideo->sisfb_infoblock.sisfb_patchlevel = VER_LEVEL;
1737 ivideo->sisfb_infoblock.chip_id = ivideo->chip_id;
1738 ivideo->sisfb_infoblock.sisfb_pci_vendor = ivideo->chip_vendor;
1739 ivideo->sisfb_infoblock.memory = ivideo->video_size / 1024;
1740 ivideo->sisfb_infoblock.heapstart = ivideo->heapstart / 1024;
1741 if(ivideo->modechanged) {
1742 ivideo->sisfb_infoblock.fbvidmode = ivideo->mode_no;
1744 ivideo->sisfb_infoblock.fbvidmode = ivideo->modeprechange;
1746 ivideo->sisfb_infoblock.sisfb_caps = ivideo->caps;
1747 ivideo->sisfb_infoblock.sisfb_tqlen = ivideo->cmdQueueSize / 1024;
1748 ivideo->sisfb_infoblock.sisfb_pcibus = ivideo->pcibus;
1749 ivideo->sisfb_infoblock.sisfb_pcislot = ivideo->pcislot;
1750 ivideo->sisfb_infoblock.sisfb_pcifunc = ivideo->pcifunc;
1751 ivideo->sisfb_infoblock.sisfb_lcdpdc = ivideo->detectedpdc;
1752 ivideo->sisfb_infoblock.sisfb_lcdpdca = ivideo->detectedpdca;
1753 ivideo->sisfb_infoblock.sisfb_lcda = ivideo->detectedlcda;
1754 ivideo->sisfb_infoblock.sisfb_vbflags = ivideo->vbflags;
1755 ivideo->sisfb_infoblock.sisfb_currentvbflags = ivideo->currentvbflags;
1756 ivideo->sisfb_infoblock.sisfb_scalelcd = ivideo->SiS_Pr.UsePanelScaler;
1757 ivideo->sisfb_infoblock.sisfb_specialtiming = ivideo->SiS_Pr.SiS_CustomT;
1758 ivideo->sisfb_infoblock.sisfb_haveemi = ivideo->SiS_Pr.HaveEMI ? 1 : 0;
1759 ivideo->sisfb_infoblock.sisfb_haveemilcd = ivideo->SiS_Pr.HaveEMILCD ? 1 : 0;
1760 ivideo->sisfb_infoblock.sisfb_emi30 = ivideo->SiS_Pr.EMI_30;
1761 ivideo->sisfb_infoblock.sisfb_emi31 = ivideo->SiS_Pr.EMI_31;
1762 ivideo->sisfb_infoblock.sisfb_emi32 = ivideo->SiS_Pr.EMI_32;
1763 ivideo->sisfb_infoblock.sisfb_emi33 = ivideo->SiS_Pr.EMI_33;
1764 ivideo->sisfb_infoblock.sisfb_tvxpos = (u16)(ivideo->tvxpos + 32);
1765 ivideo->sisfb_infoblock.sisfb_tvypos = (u16)(ivideo->tvypos + 32);
1766 ivideo->sisfb_infoblock.sisfb_heapsize = ivideo->sisfb_heap_size / 1024;
1767 ivideo->sisfb_infoblock.sisfb_videooffset = ivideo->video_offset;
1768 ivideo->sisfb_infoblock.sisfb_curfstn = ivideo->curFSTN;
1769 ivideo->sisfb_infoblock.sisfb_curdstn = ivideo->curDSTN;
1770 ivideo->sisfb_infoblock.sisfb_vbflags2 = ivideo->vbflags2;
1771 ivideo->sisfb_infoblock.sisfb_can_post = ivideo->sisfb_can_post ? 1 : 0;
1772 ivideo->sisfb_infoblock.sisfb_card_posted = ivideo->sisfb_card_posted ? 1 : 0;
1773 ivideo->sisfb_infoblock.sisfb_was_boot_device = ivideo->sisfb_was_boot_device ? 1 : 0;
1775 if(copy_to_user((void __user *)arg, &ivideo->sisfb_infoblock,
1776 sizeof(ivideo->sisfb_infoblock)))
1782 if(ivideo->warncount++ < 10)
1786 if(sisfb_CheckVBRetrace(ivideo))
1792 if(ivideo->warncount++ < 10)
1796 if(ivideo->sisfb_max)
1802 if(ivideo->warncount++ < 10)
1809 ivideo->sisfb_max = (gpu32) ? 1 : 0;
1816 sisfb_set_TVxposoffset(ivideo, ((int)(gpu32 >> 16)) - 32);
1817 sisfb_set_TVyposoffset(ivideo, ((int)(gpu32 & 0xffff)) - 32);
1821 return put_user((u32)(((ivideo->tvxpos+32)<<16)|((ivideo->tvypos+32)&0xffff)),
1825 if(copy_from_user(&ivideo->sisfb_command, (void __user *)arg,
1829 sisfb_handle_command(ivideo, &ivideo->sisfb_command);
1831 if(copy_to_user((void __user *)arg, &ivideo->sisfb_command,
1841 ivideo->sisfblocked = (gpu32) ? 1 : 0;
1857 struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
1861 strcpy(fix->id, ivideo->myid);
1863 fix->smem_start = ivideo->video_base + ivideo->video_offset;
1864 fix->smem_len = ivideo->sisfb_mem;
1867 fix->visual = (ivideo->video_bpp == 8) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
1869 fix->ypanstep = (ivideo->sisfb_ypan) ? 1 : 0;
1871 fix->line_length = ivideo->video_linelength;
1872 fix->mmio_start = ivideo->mmio_base;
1873 fix->mmio_len = ivideo->mmio_size;
1874 if(ivideo->sisvga_engine == SIS_300_VGA) {
1876 } else if((ivideo->chip == SIS_330) ||
1877 (ivideo->chip == SIS_760) ||
1878 (ivideo->chip == SIS_761)) {
1880 } else if(ivideo->chip == XGI_20) {
1882 } else if(ivideo->chip >= XGI_40) {
1958 sisfb_get_dram_size(struct sis_video_info *ivideo)
1964 ivideo->video_size = 0;
1965 ivideo->UMAsize = ivideo->LFBsize = 0;
1967 switch(ivideo->chip) {
1971 ivideo->video_size = ((reg & 0x3F) + 1) << 20;
1976 if(!ivideo->nbridge)
1978 pci_read_config_byte(ivideo->nbridge, 0x63, &reg);
1979 ivideo->video_size = 1 << (((reg & 0x70) >> 4) + 21);
1987 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20;
1991 ivideo->video_size <<= 1;
1994 ivideo->video_size += (ivideo->video_size/2);
1999 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20;
2000 if(reg & 0x0c) ivideo->video_size <<= 1;
2006 ivideo->video_size = (((reg & 0x3f) + 1) << 2) << 20;
2011 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20;
2019 ivideo->video_size = (1 << reg) << 20;
2020 ivideo->UMAsize = ivideo->video_size;
2026 ivideo->LFBsize = (32 << 20);
2028 ivideo->LFBsize = (64 << 20);
2030 ivideo->video_size += ivideo->LFBsize;
2037 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20;
2038 if(ivideo->chip != XGI_20) {
2040 if(ivideo->revision_id == 2) {
2044 if(reg == 0x02) ivideo->video_size <<= 1;
2045 else if(reg == 0x03) ivideo->video_size <<= 2;
2058 sisfb_detect_VB_connect(struct sis_video_info *ivideo)
2063 if(ivideo->chip == XGI_20) {
2064 ivideo->sisfb_crt1off = 0;
2069 if(ivideo->sisvga_engine == SIS_300_VGA) {
2071 if((temp & 0x0F) && (ivideo->chip != SIS_300)) {
2073 if(!(ivideo->vbflags & (TV_PAL | TV_NTSC | TV_PALM | TV_PALN))) {
2076 ivideo->vbflags |= TV_PAL;
2078 ivideo->vbflags |= TV_NTSC;
2087 ivideo->sisfb_crt1off = 0;
2089 ivideo->sisfb_crt1off = (cr32 & 0xDF) ? 1 : 0;
2092 ivideo->vbflags &= ~(CRT2_TV | CRT2_LCD | CRT2_VGA);
2094 if(cr32 & SIS_VB_TV) ivideo->vbflags |= CRT2_TV;
2095 if(cr32 & SIS_VB_LCD) ivideo->vbflags |= CRT2_LCD;
2096 if(cr32 & SIS_VB_CRT2) ivideo->vbflags |= CRT2_VGA;
2103 if(ivideo->chip != SIS_550) {
2104 ivideo->sisfb_dstn = ivideo->sisfb_fstn = 0;
2107 if(ivideo->sisfb_tvplug != -1) {
2108 if( (ivideo->sisvga_engine != SIS_315_VGA) ||
2109 (!(ivideo->vbflags2 & VB2_SISYPBPRBRIDGE)) ) {
2110 if(ivideo->sisfb_tvplug & TV_YPBPR) {
2111 ivideo->sisfb_tvplug = -1;
2116 if(ivideo->sisfb_tvplug != -1) {
2117 if( (ivideo->sisvga_engine != SIS_315_VGA) ||
2118 (!(ivideo->vbflags2 & VB2_SISHIVISIONBRIDGE)) ) {
2119 if(ivideo->sisfb_tvplug & TV_HIVISION) {
2120 ivideo->sisfb_tvplug = -1;
2125 if(ivideo->sisfb_tvstd != -1) {
2126 if( (!(ivideo->vbflags2 & VB2_SISBRIDGE)) &&
2127 (!((ivideo->sisvga_engine == SIS_315_VGA) &&
2128 (ivideo->vbflags2 & VB2_CHRONTEL))) ) {
2129 if(ivideo->sisfb_tvstd & (TV_PALN | TV_PALN | TV_NTSCJ)) {
2130 ivideo->sisfb_tvstd = -1;
2137 if(ivideo->sisfb_tvplug != -1) {
2138 ivideo->vbflags |= ivideo->sisfb_tvplug;
2140 if(cr32 & SIS_VB_YPBPR) ivideo->vbflags |= (TV_YPBPR|TV_YPBPR525I); /* default: 480i */
2141 else if(cr32 & SIS_VB_HIVISION) ivideo->vbflags |= TV_HIVISION;
2142 else if(cr32 & SIS_VB_SCART) ivideo->vbflags |= TV_SCART;
2144 if(cr32 & SIS_VB_SVIDEO) ivideo->vbflags |= TV_SVIDEO;
2145 if(cr32 & SIS_VB_COMPOSITE) ivideo->vbflags |= TV_AVIDEO;
2149 if(!(ivideo->vbflags & (TV_YPBPR | TV_HIVISION))) {
2150 if(ivideo->sisfb_tvstd != -1) {
2151 ivideo->vbflags &= ~(TV_NTSC | TV_PAL | TV_PALM | TV_PALN | TV_NTSCJ);
2152 ivideo->vbflags |= ivideo->sisfb_tvstd;
2154 if(ivideo->vbflags & TV_SCART) {
2155 ivideo->vbflags &= ~(TV_NTSC | TV_PALM | TV_PALN | TV_NTSCJ);
2156 ivideo->vbflags |= TV_PAL;
2158 if(!(ivideo->vbflags & (TV_PAL | TV_NTSC | TV_PALM | TV_PALN | TV_NTSCJ))) {
2159 if(ivideo->sisvga_engine == SIS_300_VGA) {
2161 if(temp & 0x01) ivideo->vbflags |= TV_PAL;
2162 else ivideo->vbflags |= TV_NTSC;
2163 } else if((ivideo->chip <= SIS_315PRO) || (ivideo->chip >= SIS_330)) {
2165 if(temp & 0x01) ivideo->vbflags |= TV_PAL;
2166 else ivideo->vbflags |= TV_NTSC;
2169 if(temp & 0x20) ivideo->vbflags |= TV_PAL;
2170 else ivideo->vbflags |= TV_NTSC;
2176 if(ivideo->sisfb_forcecrt1 != -1) {
2177 ivideo->sisfb_crt1off = (ivideo->sisfb_forcecrt1) ? 0 : 1;
2184 sisfb_test_DDC1(struct sis_video_info *ivideo)
2189 old = SiS_ReadDDC1Bit(&ivideo->SiS_Pr);
2191 if(old != SiS_ReadDDC1Bit(&ivideo->SiS_Pr)) break;
2197 sisfb_sense_crt1(struct sis_video_info *ivideo)
2213 if(ivideo->sisvga_engine == SIS_315_VGA) {
2214 inSISIDXREG(SISCR,ivideo->SiS_Pr.SiS_MyCR63,cr63);
2216 andSISIDXREG(SISCR,ivideo->SiS_Pr.SiS_MyCR63,0xBF);
2230 for(i=0; i < 10; i++) sisfbwaitretracecrt1(ivideo);
2234 if(ivideo->chip >= SIS_330) {
2236 if(ivideo->chip >= SIS_340) {
2253 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags,
2254 ivideo->sisvga_engine, 0, 0, NULL, ivideo->vbflags2);
2258 if(sisfb_test_DDC1(ivideo)) temp = 1;
2267 if(ivideo->sisvga_engine == SIS_315_VGA) {
2268 setSISIDXREG(SISCR,ivideo->SiS_Pr.SiS_MyCR63,0xBF,cr63);
2279 SiS_SenseLCD(struct sis_video_info *ivideo)
2286 ivideo->SiS_Pr.PanelSelfDetected = false;
2289 if(!(ivideo->vbflags2 & VB2_SISTMDSBRIDGE))
2291 if(ivideo->vbflags2 & VB2_30xBDH)
2300 if(ivideo->SiS_Pr.DDCPortMixup)
2304 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, ivideo->sisvga_engine,
2305 realcrtno, 0, &buffer[0], ivideo->vbflags2);
2313 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags,
2314 ivideo->sisvga_engine, realcrtno, 1,
2315 &buffer[0], ivideo->vbflags2);
2342 if((yres == 1200) && (ivideo->vbflags2 & VB2_30xC))
2363 ivideo->SiS_Pr.PanelSelfDetected = true;
2367 SISDoSense(struct sis_video_info *ivideo, u16 type, u16 test)
2378 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x1500);
2387 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x1000);
2395 SiS_Sense30x(struct sis_video_info *ivideo)
2405 if(ivideo->vbflags2 & VB2_301) {
2411 } else if(ivideo->vbflags2 & (VB2_301B | VB2_302B)) {
2413 } else if(ivideo->vbflags2 & (VB2_301LV | VB2_302LV)) {
2415 } else if(ivideo->vbflags2 & (VB2_301C | VB2_302ELV | VB2_307T | VB2_307LV)) {
2421 if(ivideo->vbflags & (VB2_301LV|VB2_302LV|VB2_302ELV|VB2_307LV)) {
2426 if(ivideo->haveXGIROM) {
2427 biosflag = ivideo->bios_abase[0x58] & 0x03;
2428 } else if(ivideo->newrom) {
2429 if(ivideo->bios_abase[0x5d] & 0x04) biosflag |= 0x01;
2430 } else if(ivideo->sisvga_engine == SIS_300_VGA) {
2431 if(ivideo->bios_abase) {
2432 biosflag = ivideo->bios_abase[0xfe] & 0x03;
2436 if(ivideo->chip == SIS_300) {
2441 if(!(ivideo->vbflags2 & VB2_SISVGA2BRIDGE)) {
2449 if(ivideo->vbflags2 & VB2_30xC) {
2454 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x2000);
2460 if(ivideo->vbflags2 & VB2_SISYPBPRBRIDGE) {
2464 if(!(ivideo->vbflags2 & VB2_30xCLV)) {
2465 SISDoSense(ivideo, 0, 0);
2471 if(SISDoSense(ivideo, vga2, vga2_c)) {
2484 if(ivideo->vbflags2 & VB2_30xCLV) {
2488 if((ivideo->sisvga_engine == SIS_315_VGA) && (ivideo->vbflags2 & VB2_SISYPBPRBRIDGE)) {
2490 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x2000);
2491 if((result = SISDoSense(ivideo, svhs, 0x0604))) {
2492 if((result = SISDoSense(ivideo, cvbs, 0x0804))) {
2502 if(!(ivideo->vbflags & TV_YPBPR)) {
2503 if((result = SISDoSense(ivideo, svhs, svhs_c))) {
2508 if(SISDoSense(ivideo, cvbs, cvbs_c)) {
2515 SISDoSense(ivideo, 0, 0);
2521 if(ivideo->vbflags2 & VB2_30xCLV) {
2536 SiS_SenseCh(struct sis_video_info *ivideo)
2547 if(ivideo->chip < SIS_315H) {
2550 ivideo->SiS_Pr.SiS_IF_DEF_CH70xx = 1; /* Chrontel 700x */
2551 SiS_SetChrontelGPIO(&ivideo->SiS_Pr, 0x9c); /* Set general purpose IO for Chrontel communication */
2552 SiS_DDC2Delay(&ivideo->SiS_Pr, 1000);
2553 temp1 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x25);
2555 temp2 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0e);
2557 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0e, 0x0b);
2558 SiS_DDC2Delay(&ivideo->SiS_Pr, 300);
2560 temp2 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x25);
2565 temp1 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0e);
2568 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0e,0x0b);
2569 SiS_DDC2Delay(&ivideo->SiS_Pr, 300);
2573 SiS_SetCH700x(&ivideo->SiS_Pr, 0x10, 0x01);
2574 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96);
2575 SiS_SetCH700x(&ivideo->SiS_Pr, 0x10, 0x00);
2576 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96);
2577 temp1 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x10);
2581 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96);
2594 ivideo->vbflags |= TV_SVIDEO;
2599 ivideo->vbflags |= TV_AVIDEO;
2603 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x0e, 0x01, 0xF8);
2607 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x0e, 0x01, 0xF8);
2611 SiS_SetChrontelGPIO(&ivideo->SiS_Pr, 0x00);
2617 ivideo->SiS_Pr.SiS_IF_DEF_CH70xx = 2; /* Chrontel 7019 */
2618 temp1 = SiS_GetCH701x(&ivideo->SiS_Pr, 0x49);
2619 SiS_SetCH701x(&ivideo->SiS_Pr, 0x49, 0x20);
2620 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96);
2621 temp2 = SiS_GetCH701x(&ivideo->SiS_Pr, 0x20);
2623 SiS_SetCH701x(&ivideo->SiS_Pr, 0x20, temp2);
2624 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96);
2626 SiS_SetCH701x(&ivideo->SiS_Pr, 0x20, temp2);
2627 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96);
2628 temp2 = SiS_GetCH701x(&ivideo->SiS_Pr, 0x20);
2629 SiS_SetCH701x(&ivideo->SiS_Pr, 0x49, temp1);
2638 ivideo->vbflags |= TV_AVIDEO;
2644 ivideo->vbflags |= TV_SVIDEO;
2661 sisfb_get_VB_type(struct sis_video_info *ivideo)
2669 if(ivideo->chip == XGI_20)
2677 ivideo->vbflags |= VB_301; /* Deprecated */
2678 ivideo->vbflags2 |= VB2_301;
2681 ivideo->vbflags |= VB_301B; /* Deprecated */
2682 ivideo->vbflags2 |= VB2_301B;
2685 ivideo->vbflags |= VB_30xBDH; /* Deprecated */
2686 ivideo->vbflags2 |= VB2_30xBDH;
2692 ivideo->vbflags |= VB_301C; /* Deprecated */
2693 ivideo->vbflags2 |= VB2_301C;
2696 ivideo->vbflags |= VB_301LV; /* Deprecated */
2697 ivideo->vbflags2 |= VB2_301LV;
2702 ivideo->vbflags |= VB_302LV; /* Deprecated */
2703 ivideo->vbflags2 |= VB2_302LV;
2706 ivideo->vbflags |= VB_301C; /* Deprecated */
2707 ivideo->vbflags2 |= VB2_301C;
2713 ivideo->vbflags |= VB_302B; /* Deprecated */
2714 ivideo->vbflags2 |= VB2_302B;
2719 if((!(ivideo->vbflags2 & VB2_VIDEOBRIDGE)) && (ivideo->chip != SIS_300)) {
2723 if(ivideo->sisvga_engine == SIS_300_VGA) {
2727 ivideo->vbflags |= VB_LVDS; /* Deprecated */
2728 ivideo->vbflags2 |= VB2_LVDS;
2731 ivideo->vbflags |= (VB_LVDS | VB_TRUMPION); /* Deprecated */
2732 ivideo->vbflags2 |= (VB2_LVDS | VB2_TRUMPION);
2735 ivideo->vbflags |= VB_CHRONTEL; /* Deprecated */
2736 ivideo->vbflags2 |= VB2_CHRONTEL;
2739 ivideo->vbflags |= (VB_LVDS | VB_CHRONTEL); /* Deprecated */
2740 ivideo->vbflags2 |= (VB2_LVDS | VB2_CHRONTEL);
2743 if(ivideo->vbflags2 & VB2_CHRONTEL) ivideo->chronteltype = 1;
2745 } else if(ivideo->chip < SIS_661) {
2749 ivideo->vbflags |= VB_LVDS; /* Deprecated */
2750 ivideo->vbflags2 |= VB2_LVDS;
2753 ivideo->vbflags |= (VB_LVDS | VB_CHRONTEL); /* Deprecated */
2754 ivideo->vbflags2 |= (VB2_LVDS | VB2_CHRONTEL);
2757 if(ivideo->vbflags2 & VB2_CHRONTEL) ivideo->chronteltype = 2;
2759 } else if(ivideo->chip >= SIS_661) {
2765 ivideo->vbflags |= VB_LVDS; /* Deprecated */
2766 ivideo->vbflags2 |= VB2_LVDS;
2769 ivideo->vbflags |= (VB_LVDS | VB_CHRONTEL); /* Deprecated */
2770 ivideo->vbflags2 |= (VB2_LVDS | VB2_CHRONTEL);
2773 ivideo->vbflags |= (VB_LVDS | VB_CONEXANT); /* Deprecated */
2774 ivideo->vbflags2 |= (VB2_LVDS | VB2_CONEXANT);
2777 if(ivideo->vbflags2 & VB2_CHRONTEL) ivideo->chronteltype = 2;
2780 if(ivideo->vbflags2 & VB2_LVDS) {
2783 if((ivideo->sisvga_engine == SIS_300_VGA) && (ivideo->vbflags2 & VB2_TRUMPION)) {
2786 if(ivideo->vbflags2 & VB2_CHRONTEL) {
2789 if((ivideo->chip >= SIS_661) && (ivideo->vbflags2 & VB2_CONEXANT)) {
2794 if(ivideo->vbflags2 & VB2_SISBRIDGE) {
2795 SiS_SenseLCD(ivideo);
2796 SiS_Sense30x(ivideo);
2797 } else if(ivideo->vbflags2 & VB2_CHRONTEL) {
2798 SiS_SenseCh(ivideo);
2805 sisfb_engine_init(struct sis_video_info *ivideo)
2812 ivideo->caps &= ~(TURBO_QUEUE_CAP |
2818 if(ivideo->sisvga_engine == SIS_300_VGA) {
2822 tqueue_pos = (ivideo->video_size - ivideo->cmdQueueSize) / (64 * 1024);
2832 ivideo->caps |= TURBO_QUEUE_CAP;
2837 if(ivideo->sisvga_engine == SIS_315_VGA) {
2841 if(ivideo->chip == XGI_20) {
2842 switch(ivideo->cmdQueueSize) {
2851 switch(ivideo->cmdQueueSize) {
2870 if((ivideo->chip >= XGI_40) && ivideo->modechanged) {
2876 if(!((templ = MMIO_IN32(ivideo->mmio_vbase, 0x8240)) & (1 << 10))) {
2878 MMIO_OUT32(ivideo->mmio_vbase, Q_WRITE_PTR, 0);
2882 tempq = MMIO_IN32(ivideo->mmio_vbase, Q_READ_PTR);
2883 MMIO_OUT32(ivideo->mmio_vbase, Q_WRITE_PTR, tempq);
2885 tempq = (u32)(ivideo->video_size - ivideo->cmdQueueSize);
2886 MMIO_OUT32(ivideo->mmio_vbase, Q_BASE_ADDR, tempq);
2888 writel(0x16800000 + 0x8240, ivideo->video_vbase + tempq);
2889 writel(templ | (1 << 10), ivideo->video_vbase + tempq + 4);
2890 writel(0x168F0000, ivideo->video_vbase + tempq + 8);
2891 writel(0x168F0000, ivideo->video_vbase + tempq + 12);
2893 MMIO_OUT32(ivideo->mmio_vbase, Q_WRITE_PTR, (tempq + 16));
2895 sisfb_syncaccel(ivideo);
2902 tempq = MMIO_IN32(ivideo->mmio_vbase, MMIO_QUEUE_READPORT);
2903 MMIO_OUT32(ivideo->mmio_vbase, MMIO_QUEUE_WRITEPORT, tempq);
2908 tempq = (u32)(ivideo->video_size - ivideo->cmdQueueSize);
2909 MMIO_OUT32(ivideo->mmio_vbase, MMIO_QUEUE_PHYBASE, tempq);
2911 ivideo->caps |= MMIO_CMD_QUEUE_CAP;
2915 ivideo->engineok = 1;
2919 sisfb_detect_lcd_type(struct sis_video_info *ivideo)
2926 if(ivideo->sisvga_engine == SIS_300_VGA) {
2927 ivideo->CRT2LCDType = sis300paneltype[reg];
2928 } else if(ivideo->chip >= SIS_661) {
2929 ivideo->CRT2LCDType = sis661paneltype[reg];
2931 ivideo->CRT2LCDType = sis310paneltype[reg];
2932 if((ivideo->chip == SIS_550) && (sisfb_fstn)) {
2933 if((ivideo->CRT2LCDType != LCD_320x240_2) &&
2934 (ivideo->CRT2LCDType != LCD_320x240_3)) {
2935 ivideo->CRT2LCDType = LCD_320x240;
2940 if(ivideo->CRT2LCDType == LCD_UNKNOWN) {
2942 ivideo->CRT2LCDType = LCD_1024x768;
2949 if(ivideo->CRT2LCDType == sis_lcd_data[i].lcdtype) {
2950 ivideo->lcdxres = sis_lcd_data[i].xres;
2951 ivideo->lcdyres = sis_lcd_data[i].yres;
2952 ivideo->lcddefmodeidx = sis_lcd_data[i].default_mode_idx;
2958 if(ivideo->SiS_Pr.SiS_CustomT == CUT_BARCO1366) {
2959 ivideo->lcdxres = 1360; ivideo->lcdyres = 1024;
2960 ivideo->lcddefmodeidx = DEFAULT_MODE_1360;
2961 } else if(ivideo->SiS_Pr.SiS_CustomT == CUT_PANEL848) {
2962 ivideo->lcdxres = 848; ivideo->lcdyres = 480;
2963 ivideo->lcddefmodeidx = DEFAULT_MODE_848;
2964 } else if(ivideo->SiS_Pr.SiS_CustomT == CUT_PANEL856) {
2965 ivideo->lcdxres = 856; ivideo->lcdyres = 480;
2966 ivideo->lcddefmodeidx = DEFAULT_MODE_856;
2971 ivideo->lcdxres, ivideo->lcdyres);
2975 sisfb_save_pdc_emi(struct sis_video_info *ivideo)
2979 if(ivideo->sisvga_engine == SIS_300_VGA) {
2980 if(ivideo->vbflags2 & (VB2_LVDS | VB2_30xBDH)) {
2985 inSISIDXREG(SISPART1,0x13,ivideo->detectedpdc);
2986 ivideo->detectedpdc &= 0x3c;
2987 if(ivideo->SiS_Pr.PDC == -1) {
2989 ivideo->SiS_Pr.PDC = ivideo->detectedpdc;
2992 ivideo->detectedpdc);
2994 if((ivideo->SiS_Pr.PDC != -1) &&
2995 (ivideo->SiS_Pr.PDC != ivideo->detectedpdc)) {
2997 ivideo->SiS_Pr.PDC);
3004 if(ivideo->sisvga_engine == SIS_315_VGA) {
3007 if(ivideo->vbflags2 & VB2_SISLCDABRIDGE) {
3011 ivideo->SiS_Pr.SiS_UseLCDA = true;
3012 ivideo->detectedlcda = 0x03;
3017 if(ivideo->vbflags2 & VB2_SISLVDSBRIDGE) {
3020 if((tmp & 0x20) || (ivideo->detectedlcda != 0xff)) {
3024 ivideo->detectedpdc = (pdc & 0x0f) << 1;
3025 ivideo->detectedpdca = (pdc & 0xf0) >> 3;
3027 ivideo->detectedpdc |= ((pdc >> 7) & 0x01);
3029 ivideo->detectedpdca |= ((pdc >> 6) & 0x01);
3030 if(ivideo->newrom) {
3032 if(ivideo->detectedlcda != 0xff) {
3033 ivideo->detectedpdc = 0xff;
3035 ivideo->detectedpdca = 0xff;
3038 if(ivideo->SiS_Pr.PDC == -1) {
3039 if(ivideo->detectedpdc != 0xff) {
3040 ivideo->SiS_Pr.PDC = ivideo->detectedpdc;
3043 if(ivideo->SiS_Pr.PDCA == -1) {
3044 if(ivideo->detectedpdca != 0xff) {
3045 ivideo->SiS_Pr.PDCA = ivideo->detectedpdca;
3048 if(ivideo->detectedpdc != 0xff) {
3051 ivideo->detectedpdc);
3053 if(ivideo->detectedpdca != 0xff) {
3056 ivideo->detectedpdca);
3061 if(ivideo->vbflags2 & VB2_SISEMIBRIDGE) {
3062 inSISIDXREG(SISPART4,0x30,ivideo->SiS_Pr.EMI_30);
3063 inSISIDXREG(SISPART4,0x31,ivideo->SiS_Pr.EMI_31);
3064 inSISIDXREG(SISPART4,0x32,ivideo->SiS_Pr.EMI_32);
3065 inSISIDXREG(SISPART4,0x33,ivideo->SiS_Pr.EMI_33);
3066 ivideo->SiS_Pr.HaveEMI = true;
3067 if((tmp & 0x20) || (ivideo->detectedlcda != 0xff)) {
3068 ivideo->SiS_Pr.HaveEMILCD = true;
3074 if(ivideo->vbflags2 & VB2_30xBLV) {
3075 if((ivideo->SiS_Pr.PDC != -1) &&
3076 (ivideo->SiS_Pr.PDC != ivideo->detectedpdc)) {
3078 ivideo->SiS_Pr.PDC);
3080 if((ivideo->SiS_Pr.PDCA != -1) &&
3081 (ivideo->SiS_Pr.PDCA != ivideo->detectedpdca)) {
3083 ivideo->SiS_Pr.PDCA);
3094 sisfb_getheapstart(struct sis_video_info *ivideo)
3096 u32 ret = ivideo->sisfb_parm_mem * 1024;
3097 u32 maxoffs = ivideo->video_size - ivideo->hwcursor_size - ivideo->cmdQueueSize;
3119 if(ivideo->sisvga_engine == SIS_300_VGA) {
3120 if(ivideo->video_size > 0x1000000) {
3122 } else if(ivideo->video_size > 0x800000) {
3127 } else if(ivideo->UMAsize && ivideo->LFBsize) {
3133 if((!ret) || (ret > maxoffs) || (ivideo->cardnumber != 0))
3140 sisfb_getheapsize(struct sis_video_info *ivideo)
3142 u32 max = ivideo->video_size - ivideo->hwcursor_size - ivideo->cmdQueueSize;
3145 if(ivideo->UMAsize && ivideo->LFBsize) {
3146 if( (!ivideo->sisfb_parm_mem) ||
3147 ((ivideo->sisfb_parm_mem * 1024) > max) ||
3148 ((max - (ivideo->sisfb_parm_mem * 1024)) < ivideo->UMAsize) ) {
3149 ret = ivideo->UMAsize;
3150 max -= ivideo->UMAsize;
3152 ret = max - (ivideo->sisfb_parm_mem * 1024);
3153 max = ivideo->sisfb_parm_mem * 1024;
3155 ivideo->video_offset = ret;
3156 ivideo->sisfb_mem = max;
3158 ret = max - ivideo->heapstart;
3159 ivideo->sisfb_mem = ivideo->heapstart;
3166 sisfb_heap_init(struct sis_video_info *ivideo)
3170 ivideo->video_offset = 0;
3171 if(ivideo->sisfb_parm_mem) {
3172 if( (ivideo->sisfb_parm_mem < (2 * 1024 * 1024)) ||
3173 (ivideo->sisfb_parm_mem > ivideo->video_size) ) {
3174 ivideo->sisfb_parm_mem = 0;
3178 ivideo->heapstart = sisfb_getheapstart(ivideo);
3179 ivideo->sisfb_heap_size = sisfb_getheapsize(ivideo);
3181 ivideo->sisfb_heap_start = ivideo->video_vbase + ivideo->heapstart;
3182 ivideo->sisfb_heap_end = ivideo->sisfb_heap_start + ivideo->sisfb_heap_size;
3185 (int)(ivideo->heapstart / 1024), (int)(ivideo->sisfb_heap_size / 1024));
3187 ivideo->sisfb_heap.vinfo = ivideo;
3189 ivideo->sisfb_heap.poha_chain = NULL;
3190 ivideo->sisfb_heap.poh_freelist = NULL;
3192 poh = sisfb_poh_new_node(&ivideo->sisfb_heap);
3196 poh->poh_next = &ivideo->sisfb_heap.oh_free;
3197 poh->poh_prev = &ivideo->sisfb_heap.oh_free;
3198 poh->size = ivideo->sisfb_heap_size;
3199 poh->offset = ivideo->heapstart;
3201 ivideo->sisfb_heap.oh_free.poh_next = poh;
3202 ivideo->sisfb_heap.oh_free.poh_prev = poh;
3203 ivideo->sisfb_heap.oh_free.size = 0;
3204 ivideo->sisfb_heap.max_freesize = poh->size;
3206 ivideo->sisfb_heap.oh_used.poh_next = &ivideo->sisfb_heap.oh_used;
3207 ivideo->sisfb_heap.oh_used.poh_prev = &ivideo->sisfb_heap.oh_used;
3208 ivideo->sisfb_heap.oh_used.size = SENTINEL;
3210 if(ivideo->cardnumber == 0) {
3214 sisfb_heap = &ivideo->sisfb_heap;
3406 sis_int_malloc(struct sis_video_info *ivideo, struct sis_memreq *req)
3410 if((ivideo) && (ivideo->sisfb_id == SISFB_ID) && (!ivideo->havenoheap))
3411 poh = sisfb_poh_allocate(&ivideo->sisfb_heap, (u32)req->size);
3420 (poh->offset + ivideo->video_vbase));
3427 struct sis_video_info *ivideo = sisfb_heap->vinfo;
3429 if(&ivideo->sisfb_heap == sisfb_heap)
3430 sis_int_malloc(ivideo, req);
3438 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
3440 sis_int_malloc(ivideo, req);
3446 sis_int_free(struct sis_video_info *ivideo, u32 base)
3450 if((!ivideo) || (ivideo->sisfb_id != SISFB_ID) || (ivideo->havenoheap))
3453 poh = sisfb_poh_free(&ivideo->sisfb_heap, base);
3464 struct sis_video_info *ivideo = sisfb_heap->vinfo;
3466 sis_int_free(ivideo, base);
3472 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
3474 sis_int_free(ivideo, base);
3480 sisfb_check_engine_and_sync(struct sis_video_info *ivideo)
3486 * ivideo->accel here, as this might have
3494 if(ivideo->sisvga_engine == SIS_300_VGA) {
3499 sisfb_syncaccel(ivideo);
3503 if(ivideo->sisvga_engine == SIS_315_VGA) {
3510 sisfb_syncaccel(ivideo);
3518 sisfb_pre_setmode(struct sis_video_info *ivideo)
3523 ivideo->currentvbflags &= (VB_VIDEOBRIDGE | VB_DISPTYPE_DISP2);
3531 cr33 = ivideo->rate_idx & 0x0F;
3534 if(ivideo->sisvga_engine == SIS_315_VGA) {
3535 if(ivideo->chip >= SIS_661) {
3546 if(ivideo->sisvga_engine == SIS_300_VGA) {
3552 SiS_SetEnableDstn(&ivideo->SiS_Pr, false);
3553 SiS_SetEnableFstn(&ivideo->SiS_Pr, false);
3554 ivideo->curFSTN = ivideo->curDSTN = 0;
3556 switch(ivideo->currentvbflags & VB_DISPTYPE_DISP2) {
3560 if((ivideo->vbflags & TV_YPBPR) && (ivideo->vbflags2 & VB2_SISYPBPRBRIDGE)) {
3562 if(ivideo->chip >= SIS_661) {
3564 if(ivideo->vbflags & TV_YPBPR525P) cr35 |= 0x20;
3565 else if(ivideo->vbflags & TV_YPBPR750P) cr35 |= 0x40;
3566 else if(ivideo->vbflags & TV_YPBPR1080I) cr35 |= 0x60;
3569 ivideo->currentvbflags |= (TV_YPBPR | (ivideo->vbflags & TV_YPBPRALL));
3570 } else if(ivideo->sisvga_engine == SIS_315_VGA) {
3573 if(ivideo->vbflags & TV_YPBPR525P) cr38 |= 0x10;
3574 else if(ivideo->vbflags & TV_YPBPR750P) cr38 |= 0x20;
3575 else if(ivideo->vbflags & TV_YPBPR1080I) cr38 |= 0x30;
3577 ivideo->currentvbflags |= (TV_YPBPR | (ivideo->vbflags & TV_YPBPRALL));
3580 } else if((ivideo->vbflags & TV_HIVISION) &&
3581 (ivideo->vbflags2 & VB2_SISHIVISIONBRIDGE)) {
3582 if(ivideo->chip >= SIS_661) {
3591 ivideo->currentvbflags |= TV_HIVISION;
3592 } else if(ivideo->vbflags & TV_SCART) {
3596 ivideo->currentvbflags |= TV_SCART;
3598 if(ivideo->vbflags & TV_SVIDEO) {
3600 ivideo->currentvbflags |= TV_SVIDEO;
3602 if(ivideo->vbflags & TV_AVIDEO) {
3604 ivideo->currentvbflags |= TV_AVIDEO;
3609 if(ivideo->vbflags & (TV_AVIDEO | TV_SVIDEO)) {
3610 if(ivideo->vbflags & TV_PAL) {
3612 ivideo->currentvbflags |= TV_PAL;
3613 if(ivideo->vbflags & TV_PALM) {
3615 ivideo->currentvbflags |= TV_PALM;
3616 } else if(ivideo->vbflags & TV_PALN) {
3618 ivideo->currentvbflags |= TV_PALN;
3622 ivideo->currentvbflags |= TV_NTSC;
3623 if(ivideo->vbflags & TV_NTSCJ) {
3625 ivideo->currentvbflags |= TV_NTSCJ;
3634 SiS_SetEnableDstn(&ivideo->SiS_Pr, ivideo->sisfb_dstn);
3635 SiS_SetEnableFstn(&ivideo->SiS_Pr, ivideo->sisfb_fstn);
3636 ivideo->curFSTN = ivideo->sisfb_fstn;
3637 ivideo->curDSTN = ivideo->sisfb_dstn;
3643 if(ivideo->sisfb_nocrt2rate) {
3644 cr33 |= (sisbios_mode[ivideo->sisfb_mode_idx].rate_idx << 4);
3646 cr33 |= ((ivideo->rate_idx & 0x0F) << 4);
3658 if(ivideo->chip >= SIS_661) {
3665 } else if(ivideo->chip != SIS_300) {
3670 ivideo->SiS_Pr.SiS_UseOEM = ivideo->sisfb_useoem;
3672 sisfb_check_engine_and_sync(ivideo);
3678 sisfb_fixup_SR11(struct sis_video_info *ivideo)
3682 if(ivideo->chip >= SIS_661) {
3698 sisfb_set_TVxposoffset(struct sis_video_info *ivideo, int val)
3702 ivideo->tvxpos = val;
3704 if(ivideo->sisfblocked) return;
3705 if(!ivideo->modechanged) return;
3707 if(ivideo->currentvbflags & CRT2_TV) {
3709 if(ivideo->vbflags2 & VB2_CHRONTEL) {
3711 int x = ivideo->tvx;
3713 switch(ivideo->chronteltype) {
3718 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0a, (x & 0xff));
3719 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x08, ((x & 0x0100) >> 7), 0xFD);
3726 } else if(ivideo->vbflags2 & VB2_SISBRIDGE) {
3731 p2_1f = ivideo->p2_1f;
3732 p2_20 = ivideo->p2_20;
3733 p2_2b = ivideo->p2_2b;
3734 p2_42 = ivideo->p2_42;
3735 p2_43 = ivideo->p2_43;
3756 sisfb_set_TVyposoffset(struct sis_video_info *ivideo, int val)
3760 ivideo->tvypos = val;
3762 if(ivideo->sisfblocked) return;
3763 if(!ivideo->modechanged) return;
3765 if(ivideo->currentvbflags & CRT2_TV) {
3767 if(ivideo->vbflags2 & VB2_CHRONTEL) {
3769 int y = ivideo->tvy;
3771 switch(ivideo->chronteltype) {
3776 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0b, (y & 0xff));
3777 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x08, ((y & 0x0100) >> 8), 0xFE);
3784 } else if(ivideo->vbflags2 & VB2_SISBRIDGE) {
3788 p2_01 = ivideo->p2_01;
3789 p2_02 = ivideo->p2_02;
3793 if(!(ivideo->currentvbflags & (TV_HIVISION | TV_YPBPR))) {
3806 sisfb_post_setmode(struct sis_video_info *ivideo)
3820 sisfb_fixup_SR11(ivideo);
3824 ivideo->modechanged = 1;
3827 if(ivideo->vbflags2 & VB2_VIDEOBRIDGE) {
3828 if(sisfb_bridgeisslave(ivideo)) doit = false;
3830 ivideo->sisfb_crt1off = 0;
3833 if(ivideo->sisvga_engine == SIS_300_VGA) {
3834 if((ivideo->sisfb_crt1off) && (doit)) {
3845 if(ivideo->sisvga_engine == SIS_315_VGA) {
3846 if((ivideo->sisfb_crt1off) && (doit)) {
3855 setSISIDXREG(SISCR, ivideo->SiS_Pr.SiS_MyCR63, ~0x40, reg);
3861 ivideo->currentvbflags &= ~VB_DISPTYPE_CRT1;
3862 ivideo->currentvbflags |= VB_SINGLE_MODE;
3864 ivideo->currentvbflags |= VB_DISPTYPE_CRT1;
3865 if(ivideo->currentvbflags & VB_DISPTYPE_CRT2) {
3866 ivideo->currentvbflags |= VB_MIRROR_MODE;
3868 ivideo->currentvbflags |= VB_SINGLE_MODE;
3874 if(ivideo->currentvbflags & CRT2_TV) {
3875 if(ivideo->vbflags2 & VB2_SISBRIDGE) {
3876 inSISIDXREG(SISPART2,0x1f,ivideo->p2_1f);
3877 inSISIDXREG(SISPART2,0x20,ivideo->p2_20);
3878 inSISIDXREG(SISPART2,0x2b,ivideo->p2_2b);
3879 inSISIDXREG(SISPART2,0x42,ivideo->p2_42);
3880 inSISIDXREG(SISPART2,0x43,ivideo->p2_43);
3881 inSISIDXREG(SISPART2,0x01,ivideo->p2_01);
3882 inSISIDXREG(SISPART2,0x02,ivideo->p2_02);
3883 } else if(ivideo->vbflags2 & VB2_CHRONTEL) {
3884 if(ivideo->chronteltype == 1) {
3885 ivideo->tvx = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0a);
3886 ivideo->tvx |= (((SiS_GetCH700x(&ivideo->SiS_Pr, 0x08) & 0x02) >> 1) << 8);
3887 ivideo->tvy = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0b);
3888 ivideo->tvy |= ((SiS_GetCH700x(&ivideo->SiS_Pr, 0x08) & 0x01) << 8);
3893 if(ivideo->tvxpos) {
3894 sisfb_set_TVxposoffset(ivideo, ivideo->tvxpos);
3896 if(ivideo->tvypos) {
3897 sisfb_set_TVyposoffset(ivideo, ivideo->tvypos);
3901 sisfb_check_engine_and_sync(ivideo);
3904 if(ivideo->accel) {
3905 sisfb_engine_init(ivideo);
3907 ivideo->engineok = 0;
3912 sisfb_reset_mode(struct sis_video_info *ivideo)
3914 if(sisfb_set_mode(ivideo, 0))
3917 sisfb_set_pitch(ivideo);
3918 sisfb_set_base_CRT1(ivideo, ivideo->current_base);
3919 sisfb_set_base_CRT2(ivideo, ivideo->current_base);
3925 sisfb_handle_command(struct sis_video_info *ivideo, struct sisfb_cmd *sisfb_command)
3931 if(!ivideo->modechanged) {
3935 sisfb_command->sisfb_result[1] = ivideo->currentvbflags;
3936 sisfb_command->sisfb_result[2] = ivideo->vbflags2;
3941 if(!ivideo->modechanged) {
3945 sisfb_command->sisfb_result[1] = ivideo->sisfb_crt1off ? 0 : 1;
3947 } else if(ivideo->sisfblocked) {
3949 } else if((!(ivideo->currentvbflags & CRT2_ENABLE)) &&
3955 if( ((ivideo->currentvbflags & VB_DISPTYPE_CRT1) && mycrt1off) ||
3956 ((!(ivideo->currentvbflags & VB_DISPTYPE_CRT1)) && !mycrt1off) ) {
3957 ivideo->sisfb_crt1off = mycrt1off;
3958 if(sisfb_reset_mode(ivideo)) {
3962 sisfb_command->sisfb_result[1] = ivideo->sisfb_crt1off ? 0 : 1;
4074 sisfb_check_rom(SIS_IOTYPE1 *rom_base, struct sis_video_info *ivideo)
4092 if((readb(rom + 4) | (readb(rom + 5) << 8)) != ivideo->chip_vendor)
4095 if((readb(rom + 6) | (readb(rom + 7) << 8)) != ivideo->chip_id)
4104 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
4115 if(!ivideo->nbridge) {
4119 if(sisfb_check_rom(rom_base, ivideo)) {
4147 if(!sisfb_check_rom(rom_base, ivideo)) {
4164 (ivideo->video_base & PCI_ROM_ADDRESS_MASK) | PCI_ROM_ADDRESS_ENABLE);
4166 rom_base = ioremap(ivideo->video_base, 65536);
4168 if(sisfb_check_rom(rom_base, ivideo)) {
4183 sisfb_post_map_vram(struct sis_video_info *ivideo, unsigned int *mapsize,
4186 ivideo->video_vbase = ioremap(ivideo->video_base, (*mapsize));
4188 if(!ivideo->video_vbase) {
4192 while((!(ivideo->video_vbase = ioremap(ivideo->video_base, (*mapsize))))) {
4197 if(ivideo->video_vbase) {
4207 sisfb_post_300_buswidth(struct sis_video_info *ivideo)
4209 SIS_IOTYPE1 *FBAddress = ivideo->video_vbase;
4253 sisfb_post_300_rwtest(struct sis_video_info *ivideo, int iteration, int buswidth,
4257 SIS_IOTYPE1 *FBAddr = ivideo->video_vbase;
4341 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
4345 buswidth = sisfb_post_300_buswidth(ivideo);
4352 if(sisfb_post_300_rwtest(ivideo,
4367 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
4368 unsigned char *bios = ivideo->SiS_Pr.VirtualRomBase;
4373 if(!ivideo->SiS_Pr.UseROM)
4388 if(ivideo->revision_id <= 0x13) {
4433 if(ivideo->revision_id >= 0x80)
4451 if(ivideo->revision_id >= 0x80)
4476 if(ivideo->revision_id >= 0x80)
4484 if(ivideo->SiS_Pr.UseROM) {
4520 sisfb_post_map_vram(ivideo, &mapsize, 4);
4522 if(ivideo->video_vbase) {
4524 iounmap(ivideo->video_vbase);
4551 sisfb_sense_crt1(ivideo);
4554 ivideo->SiS_Pr.SiS_UseOEM = false;
4555 SiS_SetEnableDstn(&ivideo->SiS_Pr, false);
4556 SiS_SetEnableFstn(&ivideo->SiS_Pr, false);
4557 ivideo->curFSTN = ivideo->curDSTN = 0;
4558 ivideo->SiS_Pr.VideoMemorySize = 8 << 20;
4559 SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80);
4570 ivideo->modeprechange = 0x2e;
4577 sisfb_post_xgi_delay(struct sis_video_info *ivideo, int delay)
4589 sisfb_find_host_bridge(struct sis_video_info *ivideo, struct pci_dev *mypdev,
4609 sisfb_post_xgi_rwtest(struct sis_video_info *ivideo, int starta,
4615 writel(0, ivideo->video_vbase);
4620 writel(pos, ivideo->video_vbase + pos);
4623 sisfb_post_xgi_delay(ivideo, 150);
4625 if(readl(ivideo->video_vbase) != 0)
4631 if(readl(ivideo->video_vbase + pos) != pos)
4641 sisfb_post_xgi_ramsize(struct sis_video_info *ivideo)
4679 sisfb_post_map_vram(ivideo, &mapsize, 32);
4681 if(!ivideo->video_vbase) {
4694 if(ivideo->chip == XGI_20) {
4702 sisfb_post_xgi_delay(ivideo, 1);
4704 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize))
4709 sisfb_post_xgi_delay(ivideo, 1);
4710 if(sisfb_post_xgi_rwtest(ivideo, 23, 23, mapsize))
4716 sisfb_post_xgi_delay(ivideo, 1);
4718 if(sisfb_post_xgi_rwtest(ivideo, 22, 23, mapsize))
4726 sisfb_post_xgi_delay(ivideo, 1);
4728 if(sisfb_post_xgi_rwtest(ivideo, 22, 23, mapsize))
4733 sisfb_post_xgi_delay(ivideo, 1);
4734 if(sisfb_post_xgi_rwtest(ivideo, 22, 22, mapsize))
4740 sisfb_post_xgi_delay(ivideo, 1);
4742 if(sisfb_post_xgi_rwtest(ivideo, 21, 22, mapsize))
4758 if(ivideo->revision_id == 2) {
4763 sisfb_post_xgi_delay(ivideo, 1);
4764 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize))
4769 if(sisfb_post_xgi_rwtest(ivideo, 22, 23, mapsize))
4776 if(sisfb_post_xgi_rwtest(ivideo, 22, 23, mapsize))
4786 sisfb_post_xgi_delay(ivideo, 1);
4787 if(sisfb_post_xgi_rwtest(ivideo, 23, 25, mapsize))
4792 sisfb_post_xgi_delay(ivideo, 1);
4794 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize))
4801 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize)) {
4809 sisfb_post_xgi_delay(ivideo, 1);
4814 if(ivideo->revision_id == 2) {
4818 sisfb_post_xgi_delay(ivideo, 1);
4820 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize))
4829 sisfb_post_xgi_delay(ivideo, 1);
4831 if(sisfb_post_xgi_rwtest(ivideo, 24, 25, mapsize))
4837 sisfb_post_xgi_delay(ivideo, 1);
4844 sisfb_post_xgi_delay(ivideo, 1);
4846 j = (ivideo->chip == XGI_20) ? 5 : 9;
4847 k = (ivideo->chip == XGI_20) ? 12 : 4;
4851 reg = (ivideo->chip == XGI_20) ?
4854 sisfb_post_xgi_delay(ivideo, 50);
4856 ranksize = (ivideo->chip == XGI_20) ?
4862 if(ivideo->chip == XGI_20) {
4879 sisfb_post_xgi_delay(ivideo, 1);
4881 if(sisfb_post_xgi_rwtest(ivideo, j, ((reg >> 4) + channelab - 2 + 20), mapsize))
4885 iounmap(ivideo->video_vbase);
4889 sisfb_post_xgi_setclocks(struct sis_video_info *ivideo, u8 regb)
4918 if(ivideo->haveXGIROM) {
4919 v1 = ivideo->bios_abase[0x90 + index];
4920 v2 = ivideo->bios_abase[0x90 + index + 1];
4921 v3 = ivideo->bios_abase[0x90 + index + 2];
4926 sisfb_post_xgi_delay(ivideo, 0x43);
4927 sisfb_post_xgi_delay(ivideo, 0x43);
4928 sisfb_post_xgi_delay(ivideo, 0x43);
4931 if(ivideo->haveXGIROM) {
4932 v1 = ivideo->bios_abase[0xb8 + index];
4933 v2 = ivideo->bios_abase[0xb8 + index + 1];
4934 v3 = ivideo->bios_abase[0xb8 + index + 2];
4939 sisfb_post_xgi_delay(ivideo, 0x43);
4940 sisfb_post_xgi_delay(ivideo, 0x43);
4941 sisfb_post_xgi_delay(ivideo, 0x43);
4947 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
4948 unsigned char *bios = ivideo->bios_abase;
5037 if(ivideo->haveXGIROM) {
5045 if(ivideo->haveXGIROM) {
5053 if(ivideo->haveXGIROM) {
5065 if(ivideo->haveXGIROM) {
5072 if(ivideo->chip == XGI_40) {
5073 if(ivideo->revision_id == 2) {
5079 if(ivideo->revision_id == 0) { /* 40 *and* 20? */
5087 reg = (ivideo->chip == XGI_40) ? 0x20 : 0x00;
5090 if(ivideo->chip == XGI_20) {
5155 } else if(sisfb_find_host_bridge(ivideo, pdev, PCI_VENDOR_ID_SI)) {
5157 } else if(sisfb_find_host_bridge(ivideo, pdev, 0x1106) ||
5158 sisfb_find_host_bridge(ivideo, pdev, 0x1022) ||
5159 sisfb_find_host_bridge(ivideo, pdev, 0x700e) ||
5160 sisfb_find_host_bridge(ivideo, pdev, 0x10de)) {
5170 if(ivideo->revision_id == 2) {
5231 if(ivideo->haveXGIROM) {
5237 if(ivideo->haveXGIROM) {
5246 if(ivideo->haveXGIROM) {
5247 index = (ivideo->chip == XGI_20) ? 0x31a : 0x3a6;
5275 if(ivideo->haveXGIROM) {
5276 index = (ivideo->chip == XGI_20) ? 0x35a : 0x3e6;
5303 if(ivideo->haveXGIROM) {
5313 if(ivideo->haveXGIROM) {
5314 index = (ivideo->chip == XGI_20) ? 0x45a : 0x4e6;
5331 if(ivideo->haveXGIROM) {
5343 if(ivideo->haveXGIROM) {
5353 if(ivideo->haveXGIROM) {
5361 if(ivideo->haveXGIROM) {
5373 if(ivideo->chip == XGI_40) {
5374 if( (ivideo->revision_id == 1) ||
5375 (ivideo->revision_id == 2) ) {
5383 if(ivideo->chip == XGI_20) {
5389 if(ivideo->haveXGIROM) {
5394 if(ivideo->chip == XGI_20) {
5415 sisfb_post_xgi_setclocks(ivideo, regb);
5416 if((ivideo->chip == XGI_20) ||
5417 (ivideo->revision_id == 1) ||
5418 (ivideo->revision_id == 2)) {
5420 if(ivideo->haveXGIROM) {
5443 if(ivideo->chip == XGI_40) {
5450 if((ivideo->chip == XGI_20) ||
5451 (ivideo->revision_id == 2)) {
5458 if((ivideo->chip == XGI_20) || (bios[0x1cb] != 0x0c)) {
5459 sisfb_post_xgi_delay(ivideo, 0x43);
5460 sisfb_post_xgi_delay(ivideo, 0x43);
5461 sisfb_post_xgi_delay(ivideo, 0x43);
5463 if((ivideo->chip == XGI_20) ||
5464 (ivideo->revision_id == 2)) {
5469 } else if((ivideo->chip == XGI_40) && (bios[0x1cb] == 0x0c)) {
5474 sisfb_post_xgi_delay(ivideo, 4);
5476 if(ivideo->haveXGIROM) {
5478 index = (ivideo->chip == XGI_20) ? 0x4b2 : 0x53e;
5485 outSISIDXREG(SISSR, 0x19, ((ivideo->chip == XGI_20) ? 0x02 : 0x01));
5488 sisfb_post_xgi_delay(ivideo, 0x43);
5490 sisfb_post_xgi_delay(ivideo, 0x22);
5504 if(ivideo->haveXGIROM) {
5522 sisfb_post_xgi_delay(ivideo, 15);
5531 sisfb_post_xgi_delay(ivideo, 1);
5533 sisfb_post_xgi_setclocks(ivideo, regb);
5534 sisfb_post_xgi_delay(ivideo, 0x46);
5539 sisfb_post_xgi_delay(ivideo, 1);
5541 sisfb_post_xgi_delay(ivideo, 1);
5543 sisfb_post_xgi_delay(ivideo, 1);
5545 if(ivideo->haveXGIROM) {
5552 sisfb_post_xgi_delay(ivideo, 1);
5555 sisfb_post_xgi_setclocks(ivideo, regb);
5556 if((ivideo->chip == XGI_40) &&
5557 ((ivideo->revision_id == 1) ||
5558 (ivideo->revision_id == 2))) {
5573 if(ivideo->haveXGIROM) {
5580 if(ivideo->chip == XGI_40) {
5583 if((ivideo->chip == XGI_40) && (ivideo->revision_id == 2)) {
5590 if(ivideo->chip == XGI_40) {
5598 if((ivideo->chip == XGI_40) && (bios[0x1cb] != 0x0c)) {
5599 sisfb_post_xgi_delay(ivideo, 0x43);
5600 sisfb_post_xgi_delay(ivideo, 0x43);
5601 sisfb_post_xgi_delay(ivideo, 0x43);
5607 sisfb_post_xgi_delay(ivideo, 4);
5609 if(ivideo->haveXGIROM) {
5614 if(ivideo->chip == XGI_40) {
5621 sisfb_post_xgi_delay(ivideo, 0x43);
5622 if(ivideo->chip == XGI_40) {
5627 sisfb_post_xgi_delay(ivideo, 0x22);
5630 if(ivideo->chip == XGI_40) {
5642 if(ivideo->haveXGIROM) {
5649 if(ivideo->haveXGIROM) {
5655 if((v1 & 0x40) && (v2 & regd) && ivideo->haveXGIROM) {
5663 ivideo->SiS_Pr.SiS_UseOEM = false;
5664 SiS_SetEnableDstn(&ivideo->SiS_Pr, false);
5665 SiS_SetEnableFstn(&ivideo->SiS_Pr, false);
5666 ivideo->curFSTN = ivideo->curDSTN = 0;
5667 ivideo->SiS_Pr.VideoMemorySize = 8 << 20;
5668 SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80);
5674 sisfb_post_xgi_ramsize(ivideo);
5682 if(ivideo->chip == XGI_20) {
5687 sisfb_sense_crt1(ivideo);
5694 ivideo->SiS_Pr.SiS_UseOEM = false;
5695 SiS_SetEnableDstn(&ivideo->SiS_Pr, false);
5696 SiS_SetEnableFstn(&ivideo->SiS_Pr, false);
5697 ivideo->curFSTN = ivideo->curDSTN = 0;
5698 SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80);
5709 ivideo->modeprechange = 0x2e;
5711 if(ivideo->chip == XGI_40) {
5729 struct sis_video_info *ivideo = NULL;
5738 sis_fb_info = framebuffer_alloc(sizeof(*ivideo), &pdev->dev);
5742 ivideo = (struct sis_video_info *)sis_fb_info->par;
5743 ivideo->memyselfandi = sis_fb_info;
5745 ivideo->sisfb_id = SISFB_ID;
5748 ivideo->cardnumber = 0;
5751 ivideo->cardnumber = 1;
5753 ivideo->cardnumber++;
5756 strncpy(ivideo->myid, chipinfo->chip_name, 30);
5758 ivideo->warncount = 0;
5759 ivideo->chip_id = pdev->device;
5760 ivideo->chip_vendor = pdev->vendor;
5761 pci_read_config_byte(pdev, PCI_REVISION_ID, &ivideo->revision_id);
5762 ivideo->SiS_Pr.ChipRevision = ivideo->revision_id;
5764 ivideo->sisvga_enabled = reg16 & 0x01;
5765 ivideo->pcibus = pdev->bus->number;
5766 ivideo->pcislot = PCI_SLOT(pdev->devfn);
5767 ivideo->pcifunc = PCI_FUNC(pdev->devfn);
5768 ivideo->subsysvendor = pdev->subsystem_vendor;
5769 ivideo->subsysdevice = pdev->subsystem_device;
5771 ivideo->ioctl32registered = 0;
5780 ivideo->chip = chipinfo->chip;
5781 ivideo->sisvga_engine = chipinfo->vgaengine;
5782 ivideo->hwcursor_size = chipinfo->hwcursor_size;
5783 ivideo->CRT2_write_enable = chipinfo->CRT2_write_enable;
5784 ivideo->mni = chipinfo->mni;
5786 ivideo->detectedpdc = 0xff;
5787 ivideo->detectedpdca = 0xff;
5788 ivideo->detectedlcda = 0xff;
5790 ivideo->sisfb_thismonitor.datavalid = false;
5792 ivideo->current_base = 0;
5794 ivideo->engineok = 0;
5796 ivideo->sisfb_was_boot_device = 0;
5799 if(ivideo->sisvga_enabled)
5800 ivideo->sisfb_was_boot_device = 1;
5810 ivideo->sisfb_parm_mem = sisfb_parm_mem;
5811 ivideo->sisfb_accel = sisfb_accel;
5812 ivideo->sisfb_ypan = sisfb_ypan;
5813 ivideo->sisfb_max = sisfb_max;
5814 ivideo->sisfb_userom = sisfb_userom;
5815 ivideo->sisfb_useoem = sisfb_useoem;
5816 ivideo->sisfb_mode_idx = sisfb_mode_idx;
5817 ivideo->sisfb_parm_rate = sisfb_parm_rate;
5818 ivideo->sisfb_crt1off = sisfb_crt1off;
5819 ivideo->sisfb_forcecrt1 = sisfb_forcecrt1;
5820 ivideo->sisfb_crt2type = sisfb_crt2type;
5821 ivideo->sisfb_crt2flags = sisfb_crt2flags;
5823 ivideo->sisfb_dstn = sisfb_dstn;
5824 ivideo->sisfb_fstn = sisfb_fstn;
5825 ivideo->sisfb_tvplug = sisfb_tvplug;
5826 ivideo->sisfb_tvstd = sisfb_tvstd;
5827 ivideo->tvxpos = sisfb_tvxposoffset;
5828 ivideo->tvypos = sisfb_tvyposoffset;
5829 ivideo->sisfb_nocrt2rate = sisfb_nocrt2rate;
5830 ivideo->refresh_rate = 0;
5831 if(ivideo->sisfb_parm_rate != -1) {
5832 ivideo->refresh_rate = ivideo->sisfb_parm_rate;
5835 ivideo->SiS_Pr.UsePanelScaler = sisfb_scalelcd;
5836 ivideo->SiS_Pr.CenterScreen = -1;
5837 ivideo->SiS_Pr.SiS_CustomT = sisfb_specialtiming;
5838 ivideo->SiS_Pr.LVDSHL = sisfb_lvdshl;
5840 ivideo->SiS_Pr.SiS_Backup70xx = 0xff;
5841 ivideo->SiS_Pr.SiS_CHOverScan = -1;
5842 ivideo->SiS_Pr.SiS_ChSW = false;
5843 ivideo->SiS_Pr.SiS_UseLCDA = false;
5844 ivideo->SiS_Pr.HaveEMI = false;
5845 ivideo->SiS_Pr.HaveEMILCD = false;
5846 ivideo->SiS_Pr.OverruleEMI = false;
5847 ivideo->SiS_Pr.SiS_SensibleSR11 = false;
5848 ivideo->SiS_Pr.SiS_MyCR63 = 0x63;
5849 ivideo->SiS_Pr.PDC = -1;
5850 ivideo->SiS_Pr.PDCA = -1;
5851 ivideo->SiS_Pr.DDCPortMixup = false;
5853 if(ivideo->chip >= SIS_330) {
5854 ivideo->SiS_Pr.SiS_MyCR63 = 0x53;
5855 if(ivideo->chip >= SIS_661) {
5856 ivideo->SiS_Pr.SiS_SensibleSR11 = true;
5861 memcpy(&ivideo->default_var, &my_default_var, sizeof(my_default_var));
5863 pci_set_drvdata(pdev, ivideo);
5866 if((ivideo->nbridge = sisfb_get_northbridge(ivideo->chip))) {
5867 switch(ivideo->nbridge->device) {
5870 ivideo->chip = SIS_730;
5871 strcpy(ivideo->myid, "SiS 730");
5876 /* ivideo->chip is ok */
5877 strcpy(ivideo->myid, "SiS 651");
5880 ivideo->chip = SIS_740;
5881 strcpy(ivideo->myid, "SiS 740");
5884 ivideo->chip = SIS_661;
5885 strcpy(ivideo->myid, "SiS 661");
5888 ivideo->chip = SIS_741;
5889 strcpy(ivideo->myid, "SiS 741");
5892 ivideo->chip = SIS_760;
5893 strcpy(ivideo->myid, "SiS 760");
5896 ivideo->chip = SIS_761;
5897 strcpy(ivideo->myid, "SiS 761");
5905 ivideo->SiS_Pr.ChipType = ivideo->chip;
5907 ivideo->SiS_Pr.ivideo = (void *)ivideo;
5910 if((ivideo->SiS_Pr.ChipType == SIS_315PRO) ||
5911 (ivideo->SiS_Pr.ChipType == SIS_315)) {
5912 ivideo->SiS_Pr.ChipType = SIS_315H;
5916 if(!ivideo->sisvga_enabled) {
5918 if(ivideo->nbridge) pci_dev_put(ivideo->nbridge);
5925 ivideo->video_base = pci_resource_start(pdev, 0);
5926 ivideo->mmio_base = pci_resource_start(pdev, 1);
5927 ivideo->mmio_size = pci_resource_len(pdev, 1);
5928 ivideo->SiS_Pr.RelIO = pci_resource_start(pdev, 2) + 0x30;
5929 ivideo->SiS_Pr.IOAddress = ivideo->vga_base = ivideo->SiS_Pr.RelIO;
5931 SiSRegInit(&ivideo->SiS_Pr, ivideo->SiS_Pr.IOAddress);
5935 if(ivideo->chip == SIS_630) {
5938 if(mychswtable[i].subsysVendor == ivideo->subsysvendor &&
5939 mychswtable[i].subsysCard == ivideo->subsysdevice) {
5940 ivideo->SiS_Pr.SiS_ChSW = true;
5945 ivideo->lpcdev = pci_get_device(PCI_VENDOR_ID_SI, 0x0008, NULL);
5954 if((ivideo->chip == SIS_760) && (ivideo->nbridge)) {
5955 ivideo->lpcdev = pci_get_slot(ivideo->nbridge->bus, (2 << 3));
5961 if( (!ivideo->sisvga_enabled)
5972 ivideo->modeprechange = 0x03;
5975 ivideo->modeprechange = reg & 0x7f;
5976 } else if(ivideo->sisvga_enabled) {
5980 ivideo->modeprechange = readb(tt + 0x49);
5987 ivideo->bios_abase = NULL;
5988 ivideo->SiS_Pr.VirtualRomBase = NULL;
5989 ivideo->SiS_Pr.UseROM = false;
5990 ivideo->haveXGIROM = ivideo->SiS_Pr.SiS_XGIROM = false;
5991 if(ivideo->sisfb_userom) {
5992 ivideo->SiS_Pr.VirtualRomBase = sisfb_find_rom(pdev);
5993 ivideo->bios_abase = ivideo->SiS_Pr.VirtualRomBase;
5994 ivideo->SiS_Pr.UseROM = (bool)(ivideo->SiS_Pr.VirtualRomBase);
5996 ivideo->SiS_Pr.UseROM ? "" : "not ");
5997 if((ivideo->SiS_Pr.UseROM) && (ivideo->chip >= XGI_20)) {
5998 ivideo->SiS_Pr.UseROM = false;
5999 ivideo->haveXGIROM = ivideo->SiS_Pr.SiS_XGIROM = true;
6000 if( (ivideo->revision_id == 2) &&
6001 (!(ivideo->bios_abase[0x1d1] & 0x01)) ) {
6002 ivideo->SiS_Pr.DDCPortMixup = true;
6010 if(ivideo->SiS_Pr.SiS_CustomT == CUT_NONE) {
6011 sisfb_detect_custom_timing(ivideo);
6015 if( (!ivideo->sisvga_enabled)
6021 if(ivideo->sisvga_engine == SIS_300_VGA) {
6022 if(ivideo->chip == SIS_300) {
6024 ivideo->sisfb_can_post = 1;
6030 if(ivideo->sisvga_engine == SIS_315_VGA) {
6032 /* if((ivideo->chip == SIS_315H) ||
6033 (ivideo->chip == SIS_315) ||
6034 (ivideo->chip == SIS_315PRO) ||
6035 (ivideo->chip == SIS_330)) {
6037 } else */ if(ivideo->chip == XGI_20) {
6039 ivideo->sisfb_can_post = 1;
6040 } else if((ivideo->chip == XGI_40) && ivideo->haveXGIROM) {
6042 ivideo->sisfb_can_post = 1;
6056 ivideo->sisfb_card_posted = 1;
6059 if(sisfb_get_dram_size(ivideo)) {
6067 if((ivideo->sisfb_mode_idx < 0) ||
6068 ((sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]) != 0xFF)) {
6076 if(ivideo->sisvga_engine == SIS_300_VGA)
6080 ivideo->SiS_Pr.PDC = sisfb_pdc;
6083 if(ivideo->sisvga_engine == SIS_315_VGA) {
6085 ivideo->SiS_Pr.PDCA = sisfb_pdca & 0x1f;
6089 if(!request_mem_region(ivideo->video_base, ivideo->video_size, "sisfb FB")) {
6091 (int)(ivideo->video_size >> 20));
6097 if(!request_mem_region(ivideo->mmio_base, ivideo->mmio_size, "sisfb MMIO")) {
6103 ivideo->video_vbase = ioremap(ivideo->video_base, ivideo->video_size);
6104 ivideo->SiS_Pr.VideoMemoryAddress = ivideo->video_vbase;
6105 if(!ivideo->video_vbase) {
6111 ivideo->mmio_vbase = ioremap(ivideo->mmio_base, ivideo->mmio_size);
6112 if(!ivideo->mmio_vbase) {
6115 error_0: iounmap(ivideo->video_vbase);
6116 error_1: release_mem_region(ivideo->video_base, ivideo->video_size);
6117 error_2: release_mem_region(ivideo->mmio_base, ivideo->mmio_size);
6118 error_3: vfree(ivideo->bios_abase);
6119 if(ivideo->lpcdev)
6120 pci_dev_put(ivideo->lpcdev);
6121 if(ivideo->nbridge)
6122 pci_dev_put(ivideo->nbridge);
6124 if(!ivideo->sisvga_enabled)
6131 ivideo->video_base, (unsigned long)ivideo->video_vbase, ivideo->video_size / 1024);
6133 if(ivideo->video_offset) {
6135 ivideo->video_offset / 1024);
6139 ivideo->mmio_base, (unsigned long)ivideo->mmio_vbase, ivideo->mmio_size / 1024);
6143 if(ivideo->sisvga_engine == SIS_300_VGA) {
6144 ivideo->cmdQueueSize = TURBO_QUEUE_AREA_SIZE;
6146 if(ivideo->chip == XGI_20) {
6147 ivideo->cmdQueueSize = COMMAND_QUEUE_AREA_SIZE_Z7;
6149 ivideo->cmdQueueSize = COMMAND_QUEUE_AREA_SIZE;
6159 ivideo->hwcursor_vbase = ivideo->video_vbase
6160 + ivideo->video_size
6161 - ivideo->cmdQueueSize
6162 - ivideo->hwcursor_size;
6163 ivideo->caps |= HW_CURSOR_CAP;
6166 if((ivideo->havenoheap = sisfb_heap_init(ivideo))) {
6171 ivideo->SiS_Pr.VideoMemoryAddress += ivideo->video_offset;
6172 ivideo->SiS_Pr.VideoMemorySize = ivideo->sisfb_mem;
6174 ivideo->mtrr = -1;
6176 ivideo->vbflags = 0;
6177 ivideo->lcddefmodeidx = DEFAULT_LCDMODE;
6178 ivideo->tvdefmodeidx = DEFAULT_TVMODE;
6179 ivideo->defmodeidx = DEFAULT_MODE;
6181 ivideo->newrom = 0;
6182 if(ivideo->chip < XGI_20) {
6183 if(ivideo->bios_abase) {
6184 ivideo->newrom = SiSDetermineROMLayout661(&ivideo->SiS_Pr);
6188 if((ivideo->sisfb_mode_idx < 0) ||
6189 ((sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]) != 0xFF)) {
6191 sisfb_sense_crt1(ivideo);
6193 sisfb_get_VB_type(ivideo);
6195 if(ivideo->vbflags2 & VB2_VIDEOBRIDGE) {
6196 sisfb_detect_VB_connect(ivideo);
6199 ivideo->currentvbflags = ivideo->vbflags & (VB_VIDEOBRIDGE | TV_STANDARD);
6202 if(ivideo->vbflags2 & VB2_VIDEOBRIDGE) {
6203 if(ivideo->sisfb_crt2type != -1) {
6204 if((ivideo->sisfb_crt2type == CRT2_LCD) &&
6205 (ivideo->vbflags & CRT2_LCD)) {
6206 ivideo->currentvbflags |= CRT2_LCD;
6207 } else if(ivideo->sisfb_crt2type != CRT2_LCD) {
6208 ivideo->currentvbflags |= ivideo->sisfb_crt2type;
6214 if((ivideo->sisvga_engine == SIS_300_VGA) &&
6215 (ivideo->vbflags2 & VB2_CHRONTEL)) {
6216 if(ivideo->vbflags & CRT2_LCD)
6217 ivideo->currentvbflags |= CRT2_LCD;
6218 else if(ivideo->vbflags & CRT2_TV)
6219 ivideo->currentvbflags |= CRT2_TV;
6220 else if(ivideo->vbflags & CRT2_VGA)
6221 ivideo->currentvbflags |= CRT2_VGA;
6223 if(ivideo->vbflags & CRT2_TV)
6224 ivideo->currentvbflags |= CRT2_TV;
6225 else if(ivideo->vbflags & CRT2_LCD)
6226 ivideo->currentvbflags |= CRT2_LCD;
6227 else if(ivideo->vbflags & CRT2_VGA)
6228 ivideo->currentvbflags |= CRT2_VGA;
6233 if(ivideo->vbflags & CRT2_LCD) {
6234 sisfb_detect_lcd_type(ivideo);
6237 sisfb_save_pdc_emi(ivideo);
6239 if(!ivideo->sisfb_crt1off) {
6240 sisfb_handle_ddc(ivideo, &ivideo->sisfb_thismonitor, 0);
6242 if((ivideo->vbflags2 & VB2_SISTMDSBRIDGE) &&
6243 (ivideo->vbflags & (CRT2_VGA | CRT2_LCD))) {
6244 sisfb_handle_ddc(ivideo, &ivideo->sisfb_thismonitor, 1);
6248 if(ivideo->sisfb_mode_idx >= 0) {
6249 int bu = ivideo->sisfb_mode_idx;
6250 ivideo->sisfb_mode_idx = sisfb_validate_mode(ivideo,
6251 ivideo->sisfb_mode_idx, ivideo->currentvbflags);
6252 if(bu != ivideo->sisfb_mode_idx) {
6260 if(ivideo->sisfb_mode_idx < 0) {
6261 switch(ivideo->currentvbflags & VB_DISPTYPE_DISP2) {
6263 ivideo->sisfb_mode_idx = ivideo->lcddefmodeidx;
6266 ivideo->sisfb_mode_idx = ivideo->tvdefmodeidx;
6269 ivideo->sisfb_mode_idx = ivideo->defmodeidx;
6274 ivideo->mode_no = sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni];
6276 if(ivideo->refresh_rate != 0) {
6277 sisfb_search_refresh_rate(ivideo, ivideo->refresh_rate,
6278 ivideo->sisfb_mode_idx);
6281 if(ivideo->rate_idx == 0) {
6282 ivideo->rate_idx = sisbios_mode[ivideo->sisfb_mode_idx].rate_idx;
6283 ivideo->refresh_rate = 60;
6286 if(ivideo->sisfb_thismonitor.datavalid) {
6287 if(!sisfb_verify_rate(ivideo, &ivideo->sisfb_thismonitor,
6288 ivideo->sisfb_mode_idx,
6289 ivideo->rate_idx,
6290 ivideo->refresh_rate)) {
6296 ivideo->video_bpp = sisbios_mode[ivideo->sisfb_mode_idx].bpp;
6297 ivideo->video_width = sisbios_mode[ivideo->sisfb_mode_idx].xres;
6298 ivideo->video_height = sisbios_mode[ivideo->sisfb_mode_idx].yres;
6300 sisfb_set_vparms(ivideo);
6303 ivideo->video_width, ivideo->video_height, ivideo->video_bpp,
6304 ivideo->refresh_rate);
6307 ivideo->default_var.xres = ivideo->default_var.xres_virtual = ivideo->video_width;
6308 ivideo->default_var.yres = ivideo->default_var.yres_virtual = ivideo->video_height;
6309 ivideo->default_var.bits_per_pixel = ivideo->video_bpp;
6311 sisfb_bpp_to_var(ivideo, &ivideo->default_var);
6313 ivideo->default_var.pixclock = (u32) (1000000000 /
6314 sisfb_mode_rate_to_dclock(&ivideo->SiS_Pr, ivideo->mode_no, ivideo->rate_idx));
6316 if(sisfb_mode_rate_to_ddata(&ivideo->SiS_Pr, ivideo->mode_no,
6317 ivideo->rate_idx, &ivideo->default_var)) {
6318 if((ivideo->default_var.vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
6319 ivideo->default_var.pixclock <<= 1;
6323 if(ivideo->sisfb_ypan) {
6325 ivideo->default_var.yres_virtual =
6326 sisfb_calc_maxyres(ivideo, &ivideo->default_var);
6327 if(ivideo->default_var.yres_virtual < ivideo->default_var.yres) {
6328 ivideo->default_var.yres_virtual = ivideo->default_var.yres;
6332 sisfb_calc_pitch(ivideo, &ivideo->default_var);
6334 ivideo->accel = 0;
6335 if(ivideo->sisfb_accel) {
6336 ivideo->accel = -1;
6338 ivideo->default_var.accel_flags |= FB_ACCELF_TEXT;
6341 sisfb_initaccel(ivideo);
6349 ((ivideo->accel) ? 0 : FBINFO_HWACCEL_DISABLED);
6353 sis_fb_info->var = ivideo->default_var;
6354 sis_fb_info->fix = ivideo->sisfb_fix;
6355 sis_fb_info->screen_base = ivideo->video_vbase + ivideo->video_offset;
6358 sis_fb_info->pseudo_palette = ivideo->pseudo_palette;
6362 printk(KERN_DEBUG "sisfb: Initial vbflags 0x%x\n", (int)ivideo->vbflags);
6365 ivideo->mtrr = mtrr_add(ivideo->video_base, ivideo->video_size,
6367 if(ivideo->mtrr < 0) {
6375 iounmap(ivideo->mmio_vbase);
6379 ivideo->registered = 1;
6382 ivideo->next = card_list;
6383 card_list = ivideo;
6405 ivideo->ioctl32registered = 1;
6410 ivideo->sisfb_accel ? "enabled" : "disabled",
6411 ivideo->sisfb_ypan ?
6412 (ivideo->sisfb_max ? "enabled (auto-max)" :
6418 sis_fb_info->node, ivideo->myid, VER_MAJOR, VER_MINOR, VER_LEVEL);
6433 struct sis_video_info *ivideo = pci_get_drvdata(pdev);
6434 struct fb_info *sis_fb_info = ivideo->memyselfandi;
6435 int registered = ivideo->registered;
6436 int modechanged = ivideo->modechanged;
6439 if(ivideo->ioctl32registered) {
6460 iounmap(ivideo->mmio_vbase);
6461 iounmap(ivideo->video_vbase);
6464 release_mem_region(ivideo->video_base, ivideo->video_size);
6465 release_mem_region(ivideo->mmio_base, ivideo->mmio_size);
6467 vfree(ivideo->bios_abase);
6469 if(ivideo->lpcdev)
6470 pci_dev_put(ivideo->lpcdev);
6472 if(ivideo->nbridge)
6473 pci_dev_put(ivideo->nbridge);
6477 if(ivideo->mtrr >= 0)
6478 mtrr_del(ivideo->mtrr, ivideo->video_base, ivideo->video_size);
6486 if(!ivideo->sisvga_enabled)
6490 if(ivideo->registered) {
6495 /* OK, our ivideo is gone for good from here. */