Lines Matching +full:pdc +full:- +full:global
1 // SPDX-License-Identifier: GPL-2.0-or-later
8 * Copyright (C) 2001-2005 Thomas Winischhofer, Vienna, Austria.
19 * which is (c) 1998 Gerd Knorr <kraxel@goldbach.in-berlin.de>
53 /* ---------------------- Prototypes ------------------------- */
106 /* ------------------ Internal helper routines ----------------- */
113 sisfb_accel = -1; in sisfb_setdefaultparms()
114 sisfb_ypan = -1; in sisfb_setdefaultparms()
115 sisfb_max = -1; in sisfb_setdefaultparms()
116 sisfb_userom = -1; in sisfb_setdefaultparms()
117 sisfb_useoem = -1; in sisfb_setdefaultparms()
118 sisfb_mode_idx = -1; in sisfb_setdefaultparms()
119 sisfb_parm_rate = -1; in sisfb_setdefaultparms()
121 sisfb_forcecrt1 = -1; in sisfb_setdefaultparms()
122 sisfb_crt2type = -1; in sisfb_setdefaultparms()
126 sisfb_scalelcd = -1; in sisfb_setdefaultparms()
128 sisfb_lvdshl = -1; in sisfb_setdefaultparms()
131 sisfb_tvplug = -1; in sisfb_setdefaultparms()
132 sisfb_tvstd = -1; in sisfb_setdefaultparms()
142 /* ------------- Parameter parsing -------------- */
162 if( (sisbios_mode[i-1].vesa_mode_no_1 == vesamode) || in sisfb_search_vesamode()
163 (sisbios_mode[i-1].vesa_mode_no_2 == vesamode) ) { in sisfb_search_vesamode()
165 if(sisbios_mode[i-1].mode_no[1] == 0x50 || in sisfb_search_vesamode()
166 sisbios_mode[i-1].mode_no[1] == 0x56 || in sisfb_search_vesamode()
167 sisbios_mode[i-1].mode_no[1] == 0x53) in sisfb_search_vesamode()
170 if(sisbios_mode[i-1].mode_no[1] == 0x5a || in sisfb_search_vesamode()
171 sisbios_mode[i-1].mode_no[1] == 0x5b) in sisfb_search_vesamode()
174 sisfb_mode_idx = i - 1; in sisfb_search_vesamode()
241 if(sisbios_mode[i-1].mode_no[1] == 0x50 || in sisfb_search_mode()
242 sisbios_mode[i-1].mode_no[1] == 0x56 || in sisfb_search_mode()
243 sisbios_mode[i-1].mode_no[1] == 0x53) in sisfb_search_mode()
246 if(sisbios_mode[i-1].mode_no[1] == 0x5a || in sisfb_search_mode()
247 sisbios_mode[i-1].mode_no[1] == 0x5b) in sisfb_search_mode()
250 sisfb_mode_idx = i - 1; in sisfb_search_mode()
280 "sisfb: Using vga mode %s pre-set by kernel as default\n", in sisfb_get_vga_mode_from_kernel()
299 while(sis_crt2type[i].type_no != -1) { in sisfb_search_crt2type()
326 while(sis_tvtype[i].type_no != -1) { in sisfb_search_tvstd()
378 /* ----------- Various detection routines ----------- */
388 if(ivideo->SiS_Pr.UseROM) { in sisfb_detect_custom_timing()
389 biosver = ivideo->SiS_Pr.VirtualRomBase + 0x06; in sisfb_detect_custom_timing()
390 biosdate = ivideo->SiS_Pr.VirtualRomBase + 0x2c; in sisfb_detect_custom_timing()
392 chksum += ivideo->SiS_Pr.VirtualRomBase[i]; in sisfb_detect_custom_timing()
397 if( (mycustomttable[i].chipID == ivideo->chip) && in sisfb_detect_custom_timing()
399 (ivideo->SiS_Pr.UseROM && in sisfb_detect_custom_timing()
403 (ivideo->SiS_Pr.UseROM && in sisfb_detect_custom_timing()
407 (ivideo->SiS_Pr.UseROM && in sisfb_detect_custom_timing()
409 (mycustomttable[i].pcisubsysvendor == ivideo->subsysvendor) && in sisfb_detect_custom_timing()
410 (mycustomttable[i].pcisubsyscard == ivideo->subsysdevice) ) { in sisfb_detect_custom_timing()
414 if(ivideo->SiS_Pr.UseROM) { in sisfb_detect_custom_timing()
415 if(ivideo->SiS_Pr.VirtualRomBase[mycustomttable[i].biosFootprintAddr[j]] != in sisfb_detect_custom_timing()
424 ivideo->SiS_Pr.SiS_CustomT = mycustomttable[i].SpecialID; in sisfb_detect_custom_timing()
456 monitor->feature = buffer[0x18]; in sisfb_interpret_edid()
474 monitor->hmin = buffer[j + 7]; in sisfb_interpret_edid()
475 monitor->hmax = buffer[j + 8]; in sisfb_interpret_edid()
476 monitor->vmin = buffer[j + 5]; in sisfb_interpret_edid()
477 monitor->vmax = buffer[j + 6]; in sisfb_interpret_edid()
478 monitor->dclockmax = buffer[j + 9] * 10 * 1000; in sisfb_interpret_edid()
479 monitor->datavalid = true; in sisfb_interpret_edid()
486 if(!monitor->datavalid) { in sisfb_interpret_edid()
492 monitor->hmin = 65535; monitor->hmax = 0; in sisfb_interpret_edid()
493 monitor->vmin = 65535; monitor->vmax = 0; in sisfb_interpret_edid()
494 monitor->dclockmax = 0; in sisfb_interpret_edid()
498 if(monitor->hmin > sisfb_ddcsmodes[i].h) monitor->hmin = sisfb_ddcsmodes[i].h; in sisfb_interpret_edid()
499 if(monitor->hmax < sisfb_ddcsmodes[i].h) monitor->hmax = sisfb_ddcsmodes[i].h + 1; in sisfb_interpret_edid()
500 if(monitor->vmin > sisfb_ddcsmodes[i].v) monitor->vmin = sisfb_ddcsmodes[i].v; in sisfb_interpret_edid()
501 if(monitor->vmax < sisfb_ddcsmodes[i].v) monitor->vmax = sisfb_ddcsmodes[i].v; in sisfb_interpret_edid()
502 if(monitor->dclockmax < sisfb_ddcsmodes[i].d) monitor->dclockmax = sisfb_ddcsmodes[i].d; in sisfb_interpret_edid()
520 if(monitor->hmin > sisfb_ddcfmodes[j].h) monitor->hmin = sisfb_ddcfmodes[j].h; in sisfb_interpret_edid()
521 if(monitor->hmax < sisfb_ddcfmodes[j].h) monitor->hmax = sisfb_ddcfmodes[j].h + 1; in sisfb_interpret_edid()
522 if(monitor->vmin > sisfb_ddcsmodes[j].v) monitor->vmin = sisfb_ddcsmodes[j].v; in sisfb_interpret_edid()
523 if(monitor->vmax < sisfb_ddcsmodes[j].v) monitor->vmax = sisfb_ddcsmodes[j].v; in sisfb_interpret_edid()
524 if(monitor->dclockmax < sisfb_ddcsmodes[j].d) monitor->dclockmax = sisfb_ddcsmodes[j].d; in sisfb_interpret_edid()
530 if((monitor->hmin <= monitor->hmax) && (monitor->vmin <= monitor->vmax)) { in sisfb_interpret_edid()
531 monitor->datavalid = true; in sisfb_interpret_edid()
535 return monitor->datavalid; in sisfb_interpret_edid()
544 monitor->datavalid = false; in sisfb_handle_ddc()
547 if(ivideo->vbflags & CRT2_LCD) realcrtno = 1; in sisfb_handle_ddc()
548 else if(ivideo->vbflags & CRT2_VGA) realcrtno = 2; in sisfb_handle_ddc()
552 if((ivideo->sisfb_crt1off) && (!crtno)) in sisfb_handle_ddc()
555 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, ivideo->sisvga_engine, in sisfb_handle_ddc()
556 realcrtno, 0, &buffer[0], ivideo->vbflags2); in sisfb_handle_ddc()
567 (temp & 0x10) ? "FPDI-2" : ""); in sisfb_handle_ddc()
571 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, ivideo->sisvga_engine, in sisfb_handle_ddc()
572 realcrtno, 1, &buffer[0], ivideo->vbflags2); in sisfb_handle_ddc()
573 } while((temp) && i--); in sisfb_handle_ddc()
576 printk(KERN_INFO "sisfb: Monitor range H %d-%dKHz, V %d-%dHz, Max. dotclock %dMHz\n", in sisfb_handle_ddc()
577 monitor->hmin, monitor->hmax, monitor->vmin, monitor->vmax, in sisfb_handle_ddc()
578 monitor->dclockmax / 1000); in sisfb_handle_ddc()
586 printk(KERN_INFO "sisfb: VESA D&P and FPDI-2 not supported yet\n"); in sisfb_handle_ddc()
591 /* -------------- Mode validation --------------- */
600 if(!monitor->datavalid) in sisfb_verify_rate()
607 switch(sisbios_mode[mode_idx].mode_no[ivideo->mni]) { in sisfb_verify_rate()
621 if(ivideo->sisvga_engine == SIS_315_VGA) return true; in sisfb_verify_rate()
625 if(rate < (monitor->vmin - 1)) in sisfb_verify_rate()
627 if(rate > (monitor->vmax + 1)) in sisfb_verify_rate()
630 if(sisfb_gettotalfrommode(&ivideo->SiS_Pr, in sisfb_verify_rate()
631 sisbios_mode[mode_idx].mode_no[ivideo->mni], in sisfb_verify_rate()
634 if(dclock > (monitor->dclockmax + 1000)) in sisfb_verify_rate()
637 if(hsync < (monitor->hmin - 1)) in sisfb_verify_rate()
639 if(hsync > (monitor->hmax + 1)) in sisfb_verify_rate()
653 if (ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_validate_mode()
655 return -1 ; in sisfb_validate_mode()
659 if (ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_validate_mode()
661 return -1; in sisfb_validate_mode()
670 xres = ivideo->lcdxres; yres = ivideo->lcdyres; in sisfb_validate_mode()
672 if ((ivideo->SiS_Pr.SiS_CustomT != CUT_PANEL848) && in sisfb_validate_mode()
673 (ivideo->SiS_Pr.SiS_CustomT != CUT_PANEL856)) { in sisfb_validate_mode()
675 return -1; in sisfb_validate_mode()
677 return -1; in sisfb_validate_mode()
680 if (ivideo->sisfb_fstn) { in sisfb_validate_mode()
686 case 0x53: return -1; in sisfb_validate_mode()
692 if (SiS_GetModeID_LCD(ivideo->sisvga_engine, vbflags, sisbios_mode[myindex].xres, in sisfb_validate_mode()
693 sisbios_mode[myindex].yres, 0, ivideo->sisfb_fstn, in sisfb_validate_mode()
694 ivideo->SiS_Pr.SiS_CustomT, xres, yres, ivideo->vbflags2) < 0x14) { in sisfb_validate_mode()
695 return -1; in sisfb_validate_mode()
700 if (SiS_GetModeID_TV(ivideo->sisvga_engine, vbflags, sisbios_mode[myindex].xres, in sisfb_validate_mode()
701 sisbios_mode[myindex].yres, 0, ivideo->vbflags2) < 0x14) { in sisfb_validate_mode()
702 return -1; in sisfb_validate_mode()
707 if (SiS_GetModeID_VGA2(ivideo->sisvga_engine, vbflags, sisbios_mode[myindex].xres, in sisfb_validate_mode()
708 sisbios_mode[myindex].yres, 0, ivideo->vbflags2) < 0x14) { in sisfb_validate_mode()
709 return -1; in sisfb_validate_mode()
724 ivideo->rate_idx = 0; in sisfb_search_refresh_rate()
728 ivideo->rate_idx = sisfb_vrate[i].idx; in sisfb_search_refresh_rate()
731 if((sisfb_vrate[i].refresh - rate) <= 3) { in sisfb_search_refresh_rate()
734 ivideo->rate_idx = sisfb_vrate[i].idx; in sisfb_search_refresh_rate()
735 ivideo->refresh_rate = sisfb_vrate[i].refresh; in sisfb_search_refresh_rate()
737 ((rate - sisfb_vrate[i-1].refresh) <= 2)) { in sisfb_search_refresh_rate()
739 rate, sisfb_vrate[i-1].refresh); in sisfb_search_refresh_rate()
740 ivideo->rate_idx = sisfb_vrate[i-1].idx; in sisfb_search_refresh_rate()
741 ivideo->refresh_rate = sisfb_vrate[i-1].refresh; in sisfb_search_refresh_rate()
744 } else if((rate - sisfb_vrate[i].refresh) <= 2) { in sisfb_search_refresh_rate()
747 ivideo->rate_idx = sisfb_vrate[i].idx; in sisfb_search_refresh_rate()
753 if(ivideo->rate_idx > 0) { in sisfb_search_refresh_rate()
754 return ivideo->rate_idx; in sisfb_search_refresh_rate()
767 if(!(ivideo->vbflags2 & VB2_VIDEOBRIDGE)) in sisfb_bridgeisslave()
771 if( ((ivideo->sisvga_engine == SIS_300_VGA) && (P1_00 & 0xa0) == 0x20) || in sisfb_bridgeisslave()
772 ((ivideo->sisvga_engine == SIS_315_VGA) && (P1_00 & 0x50) == 0x10) ) { in sisfb_bridgeisslave()
816 while ((!(SiS_GetRegByte(SISINPSTAT) & 0x08)) && --watchdog); in sisfbwaitretracecrt1()
818 while ((SiS_GetRegByte(SISINPSTAT) & 0x08) && --watchdog); in sisfbwaitretracecrt1()
826 switch(ivideo->sisvga_engine) { in sisfbcheckvretracecrt2()
842 if(ivideo->currentvbflags & VB_DISPTYPE_DISP2) { in sisfb_CheckVBRetrace()
858 if((ivideo->currentvbflags & VB_DISPTYPE_DISP2) && (!(sisfb_bridgeisslave(ivideo)))) { in sisfb_setupvbblankflags()
865 switch(ivideo->sisvga_engine) { in sisfb_setupvbblankflags()
956 if(ivideo->currentvbflags & VB_DISPTYPE_CRT1) { in sisfb_myblank()
958 if( (!ivideo->sisfb_thismonitor.datavalid) || in sisfb_myblank()
959 ((ivideo->sisfb_thismonitor.datavalid) && in sisfb_myblank()
960 (ivideo->sisfb_thismonitor.feature & 0xe0))) { in sisfb_myblank()
962 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_myblank()
963 SiS_SetRegANDOR(SISCR, ivideo->SiS_Pr.SiS_MyCR63, 0xbf, cr63); in sisfb_myblank()
974 if(ivideo->currentvbflags & CRT2_LCD) { in sisfb_myblank()
976 if(ivideo->vbflags2 & VB2_SISLVDSBRIDGE) { in sisfb_myblank()
978 SiS_SiS30xBLOn(&ivideo->SiS_Pr); in sisfb_myblank()
980 SiS_SiS30xBLOff(&ivideo->SiS_Pr); in sisfb_myblank()
982 } else if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_myblank()
984 if(ivideo->vbflags2 & VB2_CHRONTEL) { in sisfb_myblank()
986 SiS_Chrontel701xBLOn(&ivideo->SiS_Pr); in sisfb_myblank()
988 SiS_Chrontel701xBLOff(&ivideo->SiS_Pr); in sisfb_myblank()
994 if(((ivideo->sisvga_engine == SIS_300_VGA) && in sisfb_myblank()
995 (ivideo->vbflags2 & (VB2_301|VB2_30xBDH|VB2_LVDS))) || in sisfb_myblank()
996 ((ivideo->sisvga_engine == SIS_315_VGA) && in sisfb_myblank()
997 ((ivideo->vbflags2 & (VB2_LVDS | VB2_CHRONTEL)) == VB2_LVDS))) { in sisfb_myblank()
1001 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_myblank()
1002 if((ivideo->vbflags2 & VB2_30xB) && in sisfb_myblank()
1003 (!(ivideo->vbflags2 & VB2_30xBDH))) { in sisfb_myblank()
1006 } else if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_myblank()
1007 if((ivideo->vbflags2 & VB2_30xB) && in sisfb_myblank()
1008 (!(ivideo->vbflags2 & VB2_30xBDH))) { in sisfb_myblank()
1013 } else if(ivideo->currentvbflags & CRT2_VGA) { in sisfb_myblank()
1015 if(ivideo->vbflags2 & VB2_30xB) { in sisfb_myblank()
1024 /* ------------- Callbacks from init.c/init301.c -------------- */
1030 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo; in sisfb_read_nbridge_pci_dword()
1033 pci_read_config_dword(ivideo->nbridge, reg, &val); in sisfb_read_nbridge_pci_dword()
1040 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo; in sisfb_write_nbridge_pci_dword()
1042 pci_write_config_dword(ivideo->nbridge, reg, (u32)val); in sisfb_write_nbridge_pci_dword()
1048 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo; in sisfb_read_lpc_pci_dword()
1051 if(!ivideo->lpcdev) return 0; in sisfb_read_lpc_pci_dword()
1053 pci_read_config_dword(ivideo->lpcdev, reg, &val); in sisfb_read_lpc_pci_dword()
1062 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo; in sisfb_write_nbridge_pci_byte()
1064 pci_write_config_byte(ivideo->nbridge, reg, (u8)val); in sisfb_write_nbridge_pci_byte()
1070 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo; in sisfb_read_mio_pci_word()
1073 if(!ivideo->lpcdev) return 0; in sisfb_read_mio_pci_word()
1075 pci_read_config_word(ivideo->lpcdev, reg, &val); in sisfb_read_mio_pci_word()
1080 /* ----------- FBDev related routines for all series ----------- */
1085 return (var->bits_per_pixel == 8) ? 256 : 16; in sisfb_get_cmap_len()
1091 switch(ivideo->video_bpp) { in sisfb_set_vparms()
1093 ivideo->DstColor = 0x0000; in sisfb_set_vparms()
1094 ivideo->SiS310_AccelDepth = 0x00000000; in sisfb_set_vparms()
1095 ivideo->video_cmap_len = 256; in sisfb_set_vparms()
1098 ivideo->DstColor = 0x8000; in sisfb_set_vparms()
1099 ivideo->SiS310_AccelDepth = 0x00010000; in sisfb_set_vparms()
1100 ivideo->video_cmap_len = 16; in sisfb_set_vparms()
1103 ivideo->DstColor = 0xC000; in sisfb_set_vparms()
1104 ivideo->SiS310_AccelDepth = 0x00020000; in sisfb_set_vparms()
1105 ivideo->video_cmap_len = 16; in sisfb_set_vparms()
1108 ivideo->video_cmap_len = 16; in sisfb_set_vparms()
1109 printk(KERN_ERR "sisfb: Unsupported depth %d", ivideo->video_bpp); in sisfb_set_vparms()
1110 ivideo->accel = 0; in sisfb_set_vparms()
1117 int maxyres = ivideo->sisfb_mem / (var->xres_virtual * (var->bits_per_pixel >> 3)); in sisfb_calc_maxyres()
1127 ivideo->video_linelength = var->xres_virtual * (var->bits_per_pixel >> 3); in sisfb_calc_pitch()
1128 ivideo->scrnpitchCRT1 = ivideo->video_linelength; in sisfb_calc_pitch()
1129 if(!(ivideo->currentvbflags & CRT1_LCDA)) { in sisfb_calc_pitch()
1130 if((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) { in sisfb_calc_pitch()
1131 ivideo->scrnpitchCRT1 <<= 1; in sisfb_calc_pitch()
1140 unsigned short HDisplay1 = ivideo->scrnpitchCRT1 >> 3; in sisfb_set_pitch()
1141 unsigned short HDisplay2 = ivideo->video_linelength >> 3; in sisfb_set_pitch()
1146 if((ivideo->currentvbflags & VB_DISPTYPE_DISP1) || (isslavemode)) { in sisfb_set_pitch()
1152 if((ivideo->currentvbflags & VB_DISPTYPE_DISP2) && (!isslavemode)) { in sisfb_set_pitch()
1153 SiS_SetRegOR(SISPART1, ivideo->CRT2_write_enable, 0x01); in sisfb_set_pitch()
1162 ivideo->video_cmap_len = sisfb_get_cmap_len(var); in sisfb_bpp_to_var()
1164 switch(var->bits_per_pixel) { in sisfb_bpp_to_var()
1166 var->red.offset = var->green.offset = var->blue.offset = 0; in sisfb_bpp_to_var()
1167 var->red.length = var->green.length = var->blue.length = 8; in sisfb_bpp_to_var()
1170 var->red.offset = 11; in sisfb_bpp_to_var()
1171 var->red.length = 5; in sisfb_bpp_to_var()
1172 var->green.offset = 5; in sisfb_bpp_to_var()
1173 var->green.length = 6; in sisfb_bpp_to_var()
1174 var->blue.offset = 0; in sisfb_bpp_to_var()
1175 var->blue.length = 5; in sisfb_bpp_to_var()
1176 var->transp.offset = 0; in sisfb_bpp_to_var()
1177 var->transp.length = 0; in sisfb_bpp_to_var()
1180 var->red.offset = 16; in sisfb_bpp_to_var()
1181 var->red.length = 8; in sisfb_bpp_to_var()
1182 var->green.offset = 8; in sisfb_bpp_to_var()
1183 var->green.length = 8; in sisfb_bpp_to_var()
1184 var->blue.offset = 0; in sisfb_bpp_to_var()
1185 var->blue.length = 8; in sisfb_bpp_to_var()
1186 var->transp.offset = 24; in sisfb_bpp_to_var()
1187 var->transp.length = 8; in sisfb_bpp_to_var()
1195 unsigned short modeno = ivideo->mode_no; in sisfb_set_mode()
1204 if(!SiSSetMode(&ivideo->SiS_Pr, modeno)) { in sisfb_set_mode()
1205 printk(KERN_ERR "sisfb: Setting mode[0x%x] failed\n", ivideo->mode_no); in sisfb_set_mode()
1206 return -EINVAL; in sisfb_set_mode()
1220 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_do_set_var()
1227 htotal = var->left_margin + var->xres + var->right_margin + var->hsync_len; in sisfb_do_set_var()
1229 vtotal = var->upper_margin + var->lower_margin + var->vsync_len; in sisfb_do_set_var()
1231 pixclock = var->pixclock; in sisfb_do_set_var()
1233 if((var->vmode & FB_VMODE_MASK) == FB_VMODE_NONINTERLACED) { in sisfb_do_set_var()
1234 vtotal += var->yres; in sisfb_do_set_var()
1236 } else if((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) { in sisfb_do_set_var()
1237 vtotal += var->yres; in sisfb_do_set_var()
1239 } else if((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) { in sisfb_do_set_var()
1240 vtotal += var->yres; in sisfb_do_set_var()
1242 } else vtotal += var->yres; in sisfb_do_set_var()
1246 return -EINVAL; in sisfb_do_set_var()
1252 ivideo->refresh_rate = (unsigned int) (hrate * 2 / vtotal); in sisfb_do_set_var()
1254 ivideo->refresh_rate = 60; in sisfb_do_set_var()
1257 old_mode = ivideo->sisfb_mode_idx; in sisfb_do_set_var()
1258 ivideo->sisfb_mode_idx = 0; in sisfb_do_set_var()
1260 while( (sisbios_mode[ivideo->sisfb_mode_idx].mode_no[0] != 0) && in sisfb_do_set_var()
1261 (sisbios_mode[ivideo->sisfb_mode_idx].xres <= var->xres) ) { in sisfb_do_set_var()
1262 if( (sisbios_mode[ivideo->sisfb_mode_idx].xres == var->xres) && in sisfb_do_set_var()
1263 (sisbios_mode[ivideo->sisfb_mode_idx].yres == var->yres) && in sisfb_do_set_var()
1264 (sisbios_mode[ivideo->sisfb_mode_idx].bpp == var->bits_per_pixel)) { in sisfb_do_set_var()
1265 ivideo->mode_no = sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]; in sisfb_do_set_var()
1269 ivideo->sisfb_mode_idx++; in sisfb_do_set_var()
1273 ivideo->sisfb_mode_idx = sisfb_validate_mode(ivideo, in sisfb_do_set_var()
1274 ivideo->sisfb_mode_idx, ivideo->currentvbflags); in sisfb_do_set_var()
1276 ivideo->sisfb_mode_idx = -1; in sisfb_do_set_var()
1279 if(ivideo->sisfb_mode_idx < 0) { in sisfb_do_set_var()
1280 printk(KERN_ERR "sisfb: Mode %dx%dx%d not supported\n", var->xres, in sisfb_do_set_var()
1281 var->yres, var->bits_per_pixel); in sisfb_do_set_var()
1282 ivideo->sisfb_mode_idx = old_mode; in sisfb_do_set_var()
1283 return -EINVAL; in sisfb_do_set_var()
1286 ivideo->mode_no = sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]; in sisfb_do_set_var()
1288 if(sisfb_search_refresh_rate(ivideo, ivideo->refresh_rate, ivideo->sisfb_mode_idx) == 0) { in sisfb_do_set_var()
1289 ivideo->rate_idx = sisbios_mode[ivideo->sisfb_mode_idx].rate_idx; in sisfb_do_set_var()
1290 ivideo->refresh_rate = 60; in sisfb_do_set_var()
1297 ivideo->accel = 0; in sisfb_do_set_var()
1300 if(var->accel_flags & FB_ACCELF_TEXT) { in sisfb_do_set_var()
1301 info->flags &= ~FBINFO_HWACCEL_DISABLED; in sisfb_do_set_var()
1303 info->flags |= FBINFO_HWACCEL_DISABLED; in sisfb_do_set_var()
1306 if(!(info->flags & FBINFO_HWACCEL_DISABLED)) ivideo->accel = -1; in sisfb_do_set_var()
1308 if(var->accel_flags & FB_ACCELF_TEXT) ivideo->accel = -1; in sisfb_do_set_var()
1315 ivideo->video_bpp = sisbios_mode[ivideo->sisfb_mode_idx].bpp; in sisfb_do_set_var()
1316 ivideo->video_width = sisbios_mode[ivideo->sisfb_mode_idx].xres; in sisfb_do_set_var()
1317 ivideo->video_height = sisbios_mode[ivideo->sisfb_mode_idx].yres; in sisfb_do_set_var()
1324 ivideo->current_width = ivideo->video_width; in sisfb_do_set_var()
1325 ivideo->current_height = ivideo->video_height; in sisfb_do_set_var()
1326 ivideo->current_bpp = ivideo->video_bpp; in sisfb_do_set_var()
1327 ivideo->current_htotal = htotal; in sisfb_do_set_var()
1328 ivideo->current_vtotal = vtotal; in sisfb_do_set_var()
1329 ivideo->current_linelength = ivideo->video_linelength; in sisfb_do_set_var()
1330 ivideo->current_pixclock = var->pixclock; in sisfb_do_set_var()
1331 ivideo->current_refresh_rate = ivideo->refresh_rate; in sisfb_do_set_var()
1332 ivideo->sisfb_lastrates[ivideo->mode_no] = ivideo->refresh_rate; in sisfb_do_set_var()
1346 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_set_base_CRT1()
1354 if(ivideo->currentvbflags & VB_DISPTYPE_DISP2) { in sisfb_set_base_CRT2()
1355 SiS_SetRegOR(SISPART1, ivideo->CRT2_write_enable, 0x01); in sisfb_set_base_CRT2()
1359 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_set_base_CRT2()
1369 ivideo->current_base = var->yoffset * info->var.xres_virtual in sisfb_pan_var()
1370 + var->xoffset; in sisfb_pan_var()
1373 switch (info->var.bits_per_pixel) { in sisfb_pan_var()
1377 ivideo->current_base >>= 1; in sisfb_pan_var()
1381 ivideo->current_base >>= 2; in sisfb_pan_var()
1385 ivideo->current_base += (ivideo->video_offset >> 2); in sisfb_pan_var()
1387 sisfb_set_base_CRT1(ivideo, ivideo->current_base); in sisfb_pan_var()
1388 sisfb_set_base_CRT2(ivideo, ivideo->current_base); in sisfb_pan_var()
1409 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_setcolreg()
1411 if(regno >= sisfb_get_cmap_len(&info->var)) in sisfb_setcolreg()
1414 switch(info->var.bits_per_pixel) { in sisfb_setcolreg()
1420 if(ivideo->currentvbflags & VB_DISPTYPE_DISP2) { in sisfb_setcolreg()
1431 ((u32 *)(info->pseudo_palette))[regno] = in sisfb_setcolreg()
1443 ((u32 *)(info->pseudo_palette))[regno] = in sisfb_setcolreg()
1455 if((err = sisfb_do_set_var(&info->var, 1, info))) in sisfb_set_par()
1458 sisfb_get_fix(&info->fix, -1, info); in sisfb_set_par()
1466 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_check_var()
1474 htotal = var->left_margin + var->xres + var->right_margin + var->hsync_len; in sisfb_check_var()
1476 vtotal = var->upper_margin + var->lower_margin + var->vsync_len; in sisfb_check_var()
1478 if (!var->pixclock) in sisfb_check_var()
1479 return -EINVAL; in sisfb_check_var()
1480 pixclock = var->pixclock; in sisfb_check_var()
1482 if((var->vmode & FB_VMODE_MASK) == FB_VMODE_NONINTERLACED) { in sisfb_check_var()
1483 vtotal += var->yres; in sisfb_check_var()
1485 } else if((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) { in sisfb_check_var()
1486 vtotal += var->yres; in sisfb_check_var()
1488 } else if((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) { in sisfb_check_var()
1489 vtotal += var->yres; in sisfb_check_var()
1492 vtotal += var->yres; in sisfb_check_var()
1500 (sisbios_mode[search_idx].xres <= var->xres) ) { in sisfb_check_var()
1501 if( (sisbios_mode[search_idx].xres == var->xres) && in sisfb_check_var()
1502 (sisbios_mode[search_idx].yres == var->yres) && in sisfb_check_var()
1503 (sisbios_mode[search_idx].bpp == var->bits_per_pixel)) { in sisfb_check_var()
1505 ivideo->currentvbflags)) > 0) { in sisfb_check_var()
1517 if( (var->xres <= sisbios_mode[search_idx].xres) && in sisfb_check_var()
1518 (var->yres <= sisbios_mode[search_idx].yres) && in sisfb_check_var()
1519 (var->bits_per_pixel == sisbios_mode[search_idx].bpp) ) { in sisfb_check_var()
1521 ivideo->currentvbflags)) > 0) { in sisfb_check_var()
1532 var->xres, var->yres, var->bits_per_pixel, in sisfb_check_var()
1535 var->bits_per_pixel); in sisfb_check_var()
1536 var->xres = sisbios_mode[search_idx].xres; in sisfb_check_var()
1537 var->yres = sisbios_mode[search_idx].yres; in sisfb_check_var()
1541 var->xres, var->yres, var->bits_per_pixel); in sisfb_check_var()
1542 return -EINVAL; in sisfb_check_var()
1546 if( ((ivideo->vbflags2 & VB2_LVDS) || in sisfb_check_var()
1547 ((ivideo->vbflags2 & VB2_30xBDH) && (ivideo->currentvbflags & CRT2_LCD))) && in sisfb_check_var()
1548 (var->bits_per_pixel == 8) ) { in sisfb_check_var()
1549 /* Slave modes on LVDS and 301B-DH */ in sisfb_check_var()
1552 } else if( (ivideo->current_htotal == htotal) && in sisfb_check_var()
1553 (ivideo->current_vtotal == vtotal) && in sisfb_check_var()
1554 (ivideo->current_pixclock == pixclock) ) { in sisfb_check_var()
1555 /* x=x & y=y & c=c -> assume depth change */ in sisfb_check_var()
1559 } else if( ( (ivideo->current_htotal != htotal) || in sisfb_check_var()
1560 (ivideo->current_vtotal != vtotal) ) && in sisfb_check_var()
1561 (ivideo->current_pixclock == var->pixclock) ) { in sisfb_check_var()
1562 /* x!=x | y!=y & c=c -> invalid pixclock */ in sisfb_check_var()
1563 if(ivideo->sisfb_lastrates[sisbios_mode[search_idx].mode_no[ivideo->mni]]) { in sisfb_check_var()
1565 ivideo->sisfb_lastrates[sisbios_mode[search_idx].mode_no[ivideo->mni]]; in sisfb_check_var()
1566 } else if(ivideo->sisfb_parm_rate != -1) { in sisfb_check_var()
1567 /* Sic, sisfb_parm_rate - want to know originally desired rate here */ in sisfb_check_var()
1568 refresh_rate = ivideo->sisfb_parm_rate; in sisfb_check_var()
1577 } else if(ivideo->current_refresh_rate) { in sisfb_check_var()
1578 refresh_rate = ivideo->current_refresh_rate; in sisfb_check_var()
1590 var->pixclock = (u32) (1000000000 / sisfb_mode_rate_to_dclock(&ivideo->SiS_Pr, in sisfb_check_var()
1591 sisbios_mode[search_idx].mode_no[ivideo->mni], in sisfb_check_var()
1593 sisfb_mode_rate_to_ddata(&ivideo->SiS_Pr, in sisfb_check_var()
1594 sisbios_mode[search_idx].mode_no[ivideo->mni], in sisfb_check_var()
1596 if((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) { in sisfb_check_var()
1597 var->pixclock <<= 1; in sisfb_check_var()
1601 if(ivideo->sisfb_thismonitor.datavalid) { in sisfb_check_var()
1602 if(!sisfb_verify_rate(ivideo, &ivideo->sisfb_thismonitor, search_idx, in sisfb_check_var()
1612 if(var->xres > var->xres_virtual) in sisfb_check_var()
1613 var->xres_virtual = var->xres; in sisfb_check_var()
1615 if(ivideo->sisfb_ypan) { in sisfb_check_var()
1617 if(ivideo->sisfb_max) { in sisfb_check_var()
1618 var->yres_virtual = maxyres; in sisfb_check_var()
1620 if(var->yres_virtual > maxyres) { in sisfb_check_var()
1621 var->yres_virtual = maxyres; in sisfb_check_var()
1624 if(var->yres_virtual <= var->yres) { in sisfb_check_var()
1625 var->yres_virtual = var->yres; in sisfb_check_var()
1628 if(var->yres != var->yres_virtual) { in sisfb_check_var()
1629 var->yres_virtual = var->yres; in sisfb_check_var()
1631 var->xoffset = 0; in sisfb_check_var()
1632 var->yoffset = 0; in sisfb_check_var()
1636 if(var->xoffset > var->xres_virtual - var->xres) { in sisfb_check_var()
1637 var->xoffset = var->xres_virtual - var->xres - 1; in sisfb_check_var()
1640 if(var->yoffset > var->yres_virtual - var->yres) { in sisfb_check_var()
1641 var->yoffset = var->yres_virtual - var->yres - 1; in sisfb_check_var()
1645 var->red.msb_right = in sisfb_check_var()
1646 var->green.msb_right = in sisfb_check_var()
1647 var->blue.msb_right = in sisfb_check_var()
1648 var->transp.offset = in sisfb_check_var()
1649 var->transp.length = in sisfb_check_var()
1650 var->transp.msb_right = 0; in sisfb_check_var()
1658 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_pan_display()
1661 if (var->vmode & FB_VMODE_YWRAP) in sisfb_pan_display()
1662 return -EINVAL; in sisfb_pan_display()
1664 if (var->xoffset + info->var.xres > info->var.xres_virtual || in sisfb_pan_display()
1665 var->yoffset + info->var.yres > info->var.yres_virtual) in sisfb_pan_display()
1666 return -EINVAL; in sisfb_pan_display()
1672 info->var.xoffset = var->xoffset; in sisfb_pan_display()
1673 info->var.yoffset = var->yoffset; in sisfb_pan_display()
1681 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_blank()
1686 /* ----------- FBDev related routines for all series ---------- */
1691 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_ioctl()
1703 return -EPERM; in sisfb_ioctl()
1706 return -EFAULT; in sisfb_ioctl()
1712 return -EFAULT; in sisfb_ioctl()
1718 return -EPERM; in sisfb_ioctl()
1721 return -EFAULT; in sisfb_ioctl()
1734 return -EFAULT; in sisfb_ioctl()
1742 if(ivideo->warncount++ < 10) in sisfb_ioctl()
1744 "sisfb: Deprecated ioctl call received - update your application!\n"); in sisfb_ioctl()
1747 ivideo->sisfb_infoblock.sisfb_id = SISFB_ID; in sisfb_ioctl()
1748 ivideo->sisfb_infoblock.sisfb_version = VER_MAJOR; in sisfb_ioctl()
1749 ivideo->sisfb_infoblock.sisfb_revision = VER_MINOR; in sisfb_ioctl()
1750 ivideo->sisfb_infoblock.sisfb_patchlevel = VER_LEVEL; in sisfb_ioctl()
1751 ivideo->sisfb_infoblock.chip_id = ivideo->chip_id; in sisfb_ioctl()
1752 ivideo->sisfb_infoblock.sisfb_pci_vendor = ivideo->chip_vendor; in sisfb_ioctl()
1753 ivideo->sisfb_infoblock.memory = ivideo->video_size / 1024; in sisfb_ioctl()
1754 ivideo->sisfb_infoblock.heapstart = ivideo->heapstart / 1024; in sisfb_ioctl()
1755 if(ivideo->modechanged) { in sisfb_ioctl()
1756 ivideo->sisfb_infoblock.fbvidmode = ivideo->mode_no; in sisfb_ioctl()
1758 ivideo->sisfb_infoblock.fbvidmode = ivideo->modeprechange; in sisfb_ioctl()
1760 ivideo->sisfb_infoblock.sisfb_caps = ivideo->caps; in sisfb_ioctl()
1761 ivideo->sisfb_infoblock.sisfb_tqlen = ivideo->cmdQueueSize / 1024; in sisfb_ioctl()
1762 ivideo->sisfb_infoblock.sisfb_pcibus = ivideo->pcibus; in sisfb_ioctl()
1763 ivideo->sisfb_infoblock.sisfb_pcislot = ivideo->pcislot; in sisfb_ioctl()
1764 ivideo->sisfb_infoblock.sisfb_pcifunc = ivideo->pcifunc; in sisfb_ioctl()
1765 ivideo->sisfb_infoblock.sisfb_lcdpdc = ivideo->detectedpdc; in sisfb_ioctl()
1766 ivideo->sisfb_infoblock.sisfb_lcdpdca = ivideo->detectedpdca; in sisfb_ioctl()
1767 ivideo->sisfb_infoblock.sisfb_lcda = ivideo->detectedlcda; in sisfb_ioctl()
1768 ivideo->sisfb_infoblock.sisfb_vbflags = ivideo->vbflags; in sisfb_ioctl()
1769 ivideo->sisfb_infoblock.sisfb_currentvbflags = ivideo->currentvbflags; in sisfb_ioctl()
1770 ivideo->sisfb_infoblock.sisfb_scalelcd = ivideo->SiS_Pr.UsePanelScaler; in sisfb_ioctl()
1771 ivideo->sisfb_infoblock.sisfb_specialtiming = ivideo->SiS_Pr.SiS_CustomT; in sisfb_ioctl()
1772 ivideo->sisfb_infoblock.sisfb_haveemi = ivideo->SiS_Pr.HaveEMI ? 1 : 0; in sisfb_ioctl()
1773 ivideo->sisfb_infoblock.sisfb_haveemilcd = ivideo->SiS_Pr.HaveEMILCD ? 1 : 0; in sisfb_ioctl()
1774 ivideo->sisfb_infoblock.sisfb_emi30 = ivideo->SiS_Pr.EMI_30; in sisfb_ioctl()
1775 ivideo->sisfb_infoblock.sisfb_emi31 = ivideo->SiS_Pr.EMI_31; in sisfb_ioctl()
1776 ivideo->sisfb_infoblock.sisfb_emi32 = ivideo->SiS_Pr.EMI_32; in sisfb_ioctl()
1777 ivideo->sisfb_infoblock.sisfb_emi33 = ivideo->SiS_Pr.EMI_33; in sisfb_ioctl()
1778 ivideo->sisfb_infoblock.sisfb_tvxpos = (u16)(ivideo->tvxpos + 32); in sisfb_ioctl()
1779 ivideo->sisfb_infoblock.sisfb_tvypos = (u16)(ivideo->tvypos + 32); in sisfb_ioctl()
1780 ivideo->sisfb_infoblock.sisfb_heapsize = ivideo->sisfb_heap_size / 1024; in sisfb_ioctl()
1781 ivideo->sisfb_infoblock.sisfb_videooffset = ivideo->video_offset; in sisfb_ioctl()
1782 ivideo->sisfb_infoblock.sisfb_curfstn = ivideo->curFSTN; in sisfb_ioctl()
1783 ivideo->sisfb_infoblock.sisfb_curdstn = ivideo->curDSTN; in sisfb_ioctl()
1784 ivideo->sisfb_infoblock.sisfb_vbflags2 = ivideo->vbflags2; in sisfb_ioctl()
1785 ivideo->sisfb_infoblock.sisfb_can_post = ivideo->sisfb_can_post ? 1 : 0; in sisfb_ioctl()
1786 ivideo->sisfb_infoblock.sisfb_card_posted = ivideo->sisfb_card_posted ? 1 : 0; in sisfb_ioctl()
1787 ivideo->sisfb_infoblock.sisfb_was_boot_device = ivideo->sisfb_was_boot_device ? 1 : 0; in sisfb_ioctl()
1789 if(copy_to_user((void __user *)arg, &ivideo->sisfb_infoblock, in sisfb_ioctl()
1790 sizeof(ivideo->sisfb_infoblock))) in sisfb_ioctl()
1791 return -EFAULT; in sisfb_ioctl()
1796 if(ivideo->warncount++ < 10) in sisfb_ioctl()
1798 "sisfb: Deprecated ioctl call received - update your application!\n"); in sisfb_ioctl()
1807 if(ivideo->warncount++ < 10) in sisfb_ioctl()
1809 "sisfb: Deprecated ioctl call received - update your application!\n"); in sisfb_ioctl()
1812 if(ivideo->sisfb_max) in sisfb_ioctl()
1818 if(ivideo->warncount++ < 10) in sisfb_ioctl()
1820 "sisfb: Deprecated ioctl call received - update your application!\n"); in sisfb_ioctl()
1824 return -EFAULT; in sisfb_ioctl()
1826 ivideo->sisfb_max = (gpu32) ? 1 : 0; in sisfb_ioctl()
1831 return -EFAULT; in sisfb_ioctl()
1833 sisfb_set_TVxposoffset(ivideo, ((int)(gpu32 >> 16)) - 32); in sisfb_ioctl()
1834 sisfb_set_TVyposoffset(ivideo, ((int)(gpu32 & 0xffff)) - 32); in sisfb_ioctl()
1838 return put_user((u32)(((ivideo->tvxpos+32)<<16)|((ivideo->tvypos+32)&0xffff)), in sisfb_ioctl()
1842 if(copy_from_user(&ivideo->sisfb_command, (void __user *)arg, in sisfb_ioctl()
1844 return -EFAULT; in sisfb_ioctl()
1846 sisfb_handle_command(ivideo, &ivideo->sisfb_command); in sisfb_ioctl()
1848 if(copy_to_user((void __user *)arg, &ivideo->sisfb_command, in sisfb_ioctl()
1850 return -EFAULT; in sisfb_ioctl()
1856 return -EFAULT; in sisfb_ioctl()
1858 ivideo->sisfblocked = (gpu32) ? 1 : 0; in sisfb_ioctl()
1863 return -ENOIOCTLCMD; in sisfb_ioctl()
1865 return -EINVAL; in sisfb_ioctl()
1874 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_get_fix()
1878 strscpy(fix->id, ivideo->myid, sizeof(fix->id)); in sisfb_get_fix()
1880 mutex_lock(&info->mm_lock); in sisfb_get_fix()
1881 fix->smem_start = ivideo->video_base + ivideo->video_offset; in sisfb_get_fix()
1882 fix->smem_len = ivideo->sisfb_mem; in sisfb_get_fix()
1883 mutex_unlock(&info->mm_lock); in sisfb_get_fix()
1884 fix->type = FB_TYPE_PACKED_PIXELS; in sisfb_get_fix()
1885 fix->type_aux = 0; in sisfb_get_fix()
1886 fix->visual = (ivideo->video_bpp == 8) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR; in sisfb_get_fix()
1887 fix->xpanstep = 1; in sisfb_get_fix()
1888 fix->ypanstep = (ivideo->sisfb_ypan) ? 1 : 0; in sisfb_get_fix()
1889 fix->ywrapstep = 0; in sisfb_get_fix()
1890 fix->line_length = ivideo->video_linelength; in sisfb_get_fix()
1891 fix->mmio_start = ivideo->mmio_base; in sisfb_get_fix()
1892 fix->mmio_len = ivideo->mmio_size; in sisfb_get_fix()
1893 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_get_fix()
1894 fix->accel = FB_ACCEL_SIS_GLAMOUR; in sisfb_get_fix()
1895 } else if((ivideo->chip == SIS_330) || in sisfb_get_fix()
1896 (ivideo->chip == SIS_760) || in sisfb_get_fix()
1897 (ivideo->chip == SIS_761)) { in sisfb_get_fix()
1898 fix->accel = FB_ACCEL_SIS_XABRE; in sisfb_get_fix()
1899 } else if(ivideo->chip == XGI_20) { in sisfb_get_fix()
1900 fix->accel = FB_ACCEL_XGI_VOLARI_Z; in sisfb_get_fix()
1901 } else if(ivideo->chip >= XGI_40) { in sisfb_get_fix()
1902 fix->accel = FB_ACCEL_XGI_VOLARI_V; in sisfb_get_fix()
1904 fix->accel = FB_ACCEL_SIS_GLAMOUR_2; in sisfb_get_fix()
1910 /* ---------------- fb_ops structures ----------------- */
1931 /* ---------------- Chip generation dependent routines ---------------- */
1978 ivideo->video_size = 0; in sisfb_get_dram_size()
1979 ivideo->UMAsize = ivideo->LFBsize = 0; in sisfb_get_dram_size()
1981 switch(ivideo->chip) { in sisfb_get_dram_size()
1985 ivideo->video_size = ((reg & 0x3F) + 1) << 20; in sisfb_get_dram_size()
1990 if(!ivideo->nbridge) in sisfb_get_dram_size()
1991 return -1; in sisfb_get_dram_size()
1992 pci_read_config_byte(ivideo->nbridge, 0x63, ®); in sisfb_get_dram_size()
1993 ivideo->video_size = 1 << (((reg & 0x70) >> 4) + 21); in sisfb_get_dram_size()
2001 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20; in sisfb_get_dram_size()
2005 ivideo->video_size <<= 1; in sisfb_get_dram_size()
2008 ivideo->video_size += (ivideo->video_size/2); in sisfb_get_dram_size()
2013 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20; in sisfb_get_dram_size()
2014 if(reg & 0x0c) ivideo->video_size <<= 1; in sisfb_get_dram_size()
2020 ivideo->video_size = (((reg & 0x3f) + 1) << 2) << 20; in sisfb_get_dram_size()
2025 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20; in sisfb_get_dram_size()
2033 ivideo->video_size = (1 << reg) << 20; in sisfb_get_dram_size()
2034 ivideo->UMAsize = ivideo->video_size; in sisfb_get_dram_size()
2040 ivideo->LFBsize = (32 << 20); in sisfb_get_dram_size()
2042 ivideo->LFBsize = (64 << 20); in sisfb_get_dram_size()
2044 ivideo->video_size += ivideo->LFBsize; in sisfb_get_dram_size()
2051 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20; in sisfb_get_dram_size()
2052 if(ivideo->chip != XGI_20) { in sisfb_get_dram_size()
2054 if(ivideo->revision_id == 2) { in sisfb_get_dram_size()
2058 if(reg == 0x02) ivideo->video_size <<= 1; in sisfb_get_dram_size()
2059 else if(reg == 0x03) ivideo->video_size <<= 2; in sisfb_get_dram_size()
2064 return -1; in sisfb_get_dram_size()
2069 /* -------------- video bridge device detection --------------- */
2076 if(ivideo->chip == XGI_20) { in sisfb_detect_VB_connect()
2077 ivideo->sisfb_crt1off = 0; in sisfb_detect_VB_connect()
2082 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_detect_VB_connect()
2084 if((temp & 0x0F) && (ivideo->chip != SIS_300)) { in sisfb_detect_VB_connect()
2086 if(!(ivideo->vbflags & (TV_PAL | TV_NTSC | TV_PALM | TV_PALN))) { in sisfb_detect_VB_connect()
2089 ivideo->vbflags |= TV_PAL; in sisfb_detect_VB_connect()
2091 ivideo->vbflags |= TV_NTSC; in sisfb_detect_VB_connect()
2100 ivideo->sisfb_crt1off = 0; in sisfb_detect_VB_connect()
2102 ivideo->sisfb_crt1off = (cr32 & 0xDF) ? 1 : 0; in sisfb_detect_VB_connect()
2105 ivideo->vbflags &= ~(CRT2_TV | CRT2_LCD | CRT2_VGA); in sisfb_detect_VB_connect()
2107 if(cr32 & SIS_VB_TV) ivideo->vbflags |= CRT2_TV; in sisfb_detect_VB_connect()
2108 if(cr32 & SIS_VB_LCD) ivideo->vbflags |= CRT2_LCD; in sisfb_detect_VB_connect()
2109 if(cr32 & SIS_VB_CRT2) ivideo->vbflags |= CRT2_VGA; in sisfb_detect_VB_connect()
2116 if(ivideo->chip != SIS_550) { in sisfb_detect_VB_connect()
2117 ivideo->sisfb_dstn = ivideo->sisfb_fstn = 0; in sisfb_detect_VB_connect()
2120 if(ivideo->sisfb_tvplug != -1) { in sisfb_detect_VB_connect()
2121 if( (ivideo->sisvga_engine != SIS_315_VGA) || in sisfb_detect_VB_connect()
2122 (!(ivideo->vbflags2 & VB2_SISYPBPRBRIDGE)) ) { in sisfb_detect_VB_connect()
2123 if(ivideo->sisfb_tvplug & TV_YPBPR) { in sisfb_detect_VB_connect()
2124 ivideo->sisfb_tvplug = -1; in sisfb_detect_VB_connect()
2129 if(ivideo->sisfb_tvplug != -1) { in sisfb_detect_VB_connect()
2130 if( (ivideo->sisvga_engine != SIS_315_VGA) || in sisfb_detect_VB_connect()
2131 (!(ivideo->vbflags2 & VB2_SISHIVISIONBRIDGE)) ) { in sisfb_detect_VB_connect()
2132 if(ivideo->sisfb_tvplug & TV_HIVISION) { in sisfb_detect_VB_connect()
2133 ivideo->sisfb_tvplug = -1; in sisfb_detect_VB_connect()
2138 if(ivideo->sisfb_tvstd != -1) { in sisfb_detect_VB_connect()
2139 if( (!(ivideo->vbflags2 & VB2_SISBRIDGE)) && in sisfb_detect_VB_connect()
2140 (!((ivideo->sisvga_engine == SIS_315_VGA) && in sisfb_detect_VB_connect()
2141 (ivideo->vbflags2 & VB2_CHRONTEL))) ) { in sisfb_detect_VB_connect()
2142 if(ivideo->sisfb_tvstd & (TV_PALM | TV_PALN | TV_NTSCJ)) { in sisfb_detect_VB_connect()
2143 ivideo->sisfb_tvstd = -1; in sisfb_detect_VB_connect()
2150 if(ivideo->sisfb_tvplug != -1) { in sisfb_detect_VB_connect()
2151 ivideo->vbflags |= ivideo->sisfb_tvplug; in sisfb_detect_VB_connect()
2153 if(cr32 & SIS_VB_YPBPR) ivideo->vbflags |= (TV_YPBPR|TV_YPBPR525I); /* default: 480i */ in sisfb_detect_VB_connect()
2154 else if(cr32 & SIS_VB_HIVISION) ivideo->vbflags |= TV_HIVISION; in sisfb_detect_VB_connect()
2155 else if(cr32 & SIS_VB_SCART) ivideo->vbflags |= TV_SCART; in sisfb_detect_VB_connect()
2157 if(cr32 & SIS_VB_SVIDEO) ivideo->vbflags |= TV_SVIDEO; in sisfb_detect_VB_connect()
2158 if(cr32 & SIS_VB_COMPOSITE) ivideo->vbflags |= TV_AVIDEO; in sisfb_detect_VB_connect()
2162 if(!(ivideo->vbflags & (TV_YPBPR | TV_HIVISION))) { in sisfb_detect_VB_connect()
2163 if(ivideo->sisfb_tvstd != -1) { in sisfb_detect_VB_connect()
2164 ivideo->vbflags &= ~(TV_NTSC | TV_PAL | TV_PALM | TV_PALN | TV_NTSCJ); in sisfb_detect_VB_connect()
2165 ivideo->vbflags |= ivideo->sisfb_tvstd; in sisfb_detect_VB_connect()
2167 if(ivideo->vbflags & TV_SCART) { in sisfb_detect_VB_connect()
2168 ivideo->vbflags &= ~(TV_NTSC | TV_PALM | TV_PALN | TV_NTSCJ); in sisfb_detect_VB_connect()
2169 ivideo->vbflags |= TV_PAL; in sisfb_detect_VB_connect()
2171 if(!(ivideo->vbflags & (TV_PAL | TV_NTSC | TV_PALM | TV_PALN | TV_NTSCJ))) { in sisfb_detect_VB_connect()
2172 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_detect_VB_connect()
2174 if(temp & 0x01) ivideo->vbflags |= TV_PAL; in sisfb_detect_VB_connect()
2175 else ivideo->vbflags |= TV_NTSC; in sisfb_detect_VB_connect()
2176 } else if((ivideo->chip <= SIS_315PRO) || (ivideo->chip >= SIS_330)) { in sisfb_detect_VB_connect()
2178 if(temp & 0x01) ivideo->vbflags |= TV_PAL; in sisfb_detect_VB_connect()
2179 else ivideo->vbflags |= TV_NTSC; in sisfb_detect_VB_connect()
2182 if(temp & 0x20) ivideo->vbflags |= TV_PAL; in sisfb_detect_VB_connect()
2183 else ivideo->vbflags |= TV_NTSC; in sisfb_detect_VB_connect()
2189 if(ivideo->sisfb_forcecrt1 != -1) { in sisfb_detect_VB_connect()
2190 ivideo->sisfb_crt1off = (ivideo->sisfb_forcecrt1) ? 0 : 1; in sisfb_detect_VB_connect()
2194 /* ------------------ Sensing routines ------------------ */
2201 old = SiS_ReadDDC1Bit(&ivideo->SiS_Pr); in sisfb_test_DDC1()
2203 if(old != SiS_ReadDDC1Bit(&ivideo->SiS_Pr)) break; in sisfb_test_DDC1()
2204 } while(count--); in sisfb_test_DDC1()
2205 return (count != -1); in sisfb_test_DDC1()
2226 if (ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_sense_crt1()
2227 cr63 = SiS_GetReg(SISCR, ivideo->SiS_Pr.SiS_MyCR63); in sisfb_sense_crt1()
2229 SiS_SetRegAND(SISCR, ivideo->SiS_Pr.SiS_MyCR63, 0xBF); in sisfb_sense_crt1()
2248 if (ivideo->chip >= SIS_330) { in sisfb_sense_crt1()
2250 if (ivideo->chip >= SIS_340) in sisfb_sense_crt1()
2272 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, in sisfb_sense_crt1()
2273 ivideo->sisvga_engine, 0, 0, NULL, ivideo->vbflags2); in sisfb_sense_crt1()
2274 } while (((temp == 0) || (temp == 0xffff)) && i--); in sisfb_sense_crt1()
2286 if (ivideo->sisvga_engine == SIS_315_VGA) in sisfb_sense_crt1()
2287 SiS_SetRegANDOR(SISCR, ivideo->SiS_Pr.SiS_MyCR63, 0xBF, cr63); in sisfb_sense_crt1()
2302 ivideo->SiS_Pr.PanelSelfDetected = false; in SiS_SenseLCD()
2305 if (!(ivideo->vbflags2 & VB2_SISTMDSBRIDGE)) in SiS_SenseLCD()
2307 if (ivideo->vbflags2 & VB2_30xBDH) in SiS_SenseLCD()
2316 if (ivideo->SiS_Pr.DDCPortMixup) in SiS_SenseLCD()
2320 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, ivideo->sisvga_engine, in SiS_SenseLCD()
2321 realcrtno, 0, &buffer[0], ivideo->vbflags2); in SiS_SenseLCD()
2329 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, in SiS_SenseLCD()
2330 ivideo->sisvga_engine, realcrtno, 1, in SiS_SenseLCD()
2331 &buffer[0], ivideo->vbflags2); in SiS_SenseLCD()
2332 } while ((temp) && i--); in SiS_SenseLCD()
2358 if ((yres == 1200) && (ivideo->vbflags2 & VB2_30xC)) in SiS_SenseLCD()
2379 ivideo->SiS_Pr.PanelSelfDetected = true; in SiS_SenseLCD()
2393 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x1500); in SISDoSense()
2404 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x1000); in SISDoSense()
2424 if(ivideo->vbflags2 & VB2_301) { in SiS_Sense30x()
2430 } else if(ivideo->vbflags2 & (VB2_301B | VB2_302B)) { in SiS_Sense30x()
2432 } else if(ivideo->vbflags2 & (VB2_301LV | VB2_302LV)) { in SiS_Sense30x()
2434 } else if(ivideo->vbflags2 & (VB2_301C | VB2_302ELV | VB2_307T | VB2_307LV)) { in SiS_Sense30x()
2440 if(ivideo->vbflags & (VB2_301LV|VB2_302LV|VB2_302ELV|VB2_307LV)) { in SiS_Sense30x()
2445 if(ivideo->haveXGIROM) { in SiS_Sense30x()
2446 biosflag = ivideo->bios_abase[0x58] & 0x03; in SiS_Sense30x()
2447 } else if(ivideo->newrom) { in SiS_Sense30x()
2448 if(ivideo->bios_abase[0x5d] & 0x04) biosflag |= 0x01; in SiS_Sense30x()
2449 } else if(ivideo->sisvga_engine == SIS_300_VGA) { in SiS_Sense30x()
2450 if(ivideo->bios_abase) { in SiS_Sense30x()
2451 biosflag = ivideo->bios_abase[0xfe] & 0x03; in SiS_Sense30x()
2455 if(ivideo->chip == SIS_300) { in SiS_Sense30x()
2460 if(!(ivideo->vbflags2 & VB2_SISVGA2BRIDGE)) { in SiS_Sense30x()
2468 if(ivideo->vbflags2 & VB2_30xC) { in SiS_Sense30x()
2473 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x2000); in SiS_Sense30x()
2479 if(ivideo->vbflags2 & VB2_SISYPBPRBRIDGE) { in SiS_Sense30x()
2483 if(!(ivideo->vbflags2 & VB2_30xCLV)) { in SiS_Sense30x()
2503 if(ivideo->vbflags2 & VB2_30xCLV) { in SiS_Sense30x()
2507 if((ivideo->sisvga_engine == SIS_315_VGA) && (ivideo->vbflags2 & VB2_SISYPBPRBRIDGE)) { in SiS_Sense30x()
2509 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x2000); in SiS_Sense30x()
2521 if(!(ivideo->vbflags & TV_YPBPR)) { in SiS_Sense30x()
2540 if(ivideo->vbflags2 & VB2_30xCLV) { in SiS_Sense30x()
2543 for(myflag = 2; myflag > 0; myflag--) { in SiS_Sense30x()
2565 if(ivideo->chip < SIS_315H) { in SiS_SenseCh()
2568 ivideo->SiS_Pr.SiS_IF_DEF_CH70xx = 1; /* Chrontel 700x */ in SiS_SenseCh()
2569 …SiS_SetChrontelGPIO(&ivideo->SiS_Pr, 0x9c); /* Set general purpose IO for Chrontel communication */ in SiS_SenseCh()
2570 SiS_DDC2Delay(&ivideo->SiS_Pr, 1000); in SiS_SenseCh()
2571 temp1 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x25); in SiS_SenseCh()
2573 temp2 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0e); in SiS_SenseCh()
2575 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0e, 0x0b); in SiS_SenseCh()
2576 SiS_DDC2Delay(&ivideo->SiS_Pr, 300); in SiS_SenseCh()
2578 temp2 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x25); in SiS_SenseCh()
2583 temp1 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0e); in SiS_SenseCh()
2586 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0e,0x0b); in SiS_SenseCh()
2587 SiS_DDC2Delay(&ivideo->SiS_Pr, 300); in SiS_SenseCh()
2591 SiS_SetCH700x(&ivideo->SiS_Pr, 0x10, 0x01); in SiS_SenseCh()
2592 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96); in SiS_SenseCh()
2593 SiS_SetCH700x(&ivideo->SiS_Pr, 0x10, 0x00); in SiS_SenseCh()
2594 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96); in SiS_SenseCh()
2595 temp1 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x10); in SiS_SenseCh()
2599 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96); in SiS_SenseCh()
2607 "sisfb: TV detection unreliable - test results varied\n"); in SiS_SenseCh()
2612 ivideo->vbflags |= TV_SVIDEO; in SiS_SenseCh()
2617 ivideo->vbflags |= TV_AVIDEO; in SiS_SenseCh()
2621 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x0e, 0x01, 0xF8); in SiS_SenseCh()
2625 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x0e, 0x01, 0xF8); in SiS_SenseCh()
2629 SiS_SetChrontelGPIO(&ivideo->SiS_Pr, 0x00); in SiS_SenseCh()
2635 ivideo->SiS_Pr.SiS_IF_DEF_CH70xx = 2; /* Chrontel 7019 */ in SiS_SenseCh()
2636 temp1 = SiS_GetCH701x(&ivideo->SiS_Pr, 0x49); in SiS_SenseCh()
2637 SiS_SetCH701x(&ivideo->SiS_Pr, 0x49, 0x20); in SiS_SenseCh()
2638 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96); in SiS_SenseCh()
2639 temp2 = SiS_GetCH701x(&ivideo->SiS_Pr, 0x20); in SiS_SenseCh()
2641 SiS_SetCH701x(&ivideo->SiS_Pr, 0x20, temp2); in SiS_SenseCh()
2642 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96); in SiS_SenseCh()
2644 SiS_SetCH701x(&ivideo->SiS_Pr, 0x20, temp2); in SiS_SenseCh()
2645 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96); in SiS_SenseCh()
2646 temp2 = SiS_GetCH701x(&ivideo->SiS_Pr, 0x20); in SiS_SenseCh()
2647 SiS_SetCH701x(&ivideo->SiS_Pr, 0x49, temp1); in SiS_SenseCh()
2656 ivideo->vbflags |= TV_AVIDEO; in SiS_SenseCh()
2662 ivideo->vbflags |= TV_SVIDEO; in SiS_SenseCh()
2686 if(ivideo->chip == XGI_20) in sisfb_get_VB_type()
2694 ivideo->vbflags |= VB_301; /* Deprecated */ in sisfb_get_VB_type()
2695 ivideo->vbflags2 |= VB2_301; in sisfb_get_VB_type()
2698 ivideo->vbflags |= VB_301B; /* Deprecated */ in sisfb_get_VB_type()
2699 ivideo->vbflags2 |= VB2_301B; in sisfb_get_VB_type()
2702 ivideo->vbflags |= VB_30xBDH; /* Deprecated */ in sisfb_get_VB_type()
2703 ivideo->vbflags2 |= VB2_30xBDH; in sisfb_get_VB_type()
2704 printk(KERN_INFO "%s SiS301B-DH %s\n", stdstr, bridgestr); in sisfb_get_VB_type()
2709 ivideo->vbflags |= VB_301C; /* Deprecated */ in sisfb_get_VB_type()
2710 ivideo->vbflags2 |= VB2_301C; in sisfb_get_VB_type()
2713 ivideo->vbflags |= VB_301LV; /* Deprecated */ in sisfb_get_VB_type()
2714 ivideo->vbflags2 |= VB2_301LV; in sisfb_get_VB_type()
2719 ivideo->vbflags |= VB_302LV; /* Deprecated */ in sisfb_get_VB_type()
2720 ivideo->vbflags2 |= VB2_302LV; in sisfb_get_VB_type()
2723 ivideo->vbflags |= VB_301C; /* Deprecated */ in sisfb_get_VB_type()
2724 ivideo->vbflags2 |= VB2_301C; in sisfb_get_VB_type()
2727 ivideo->vbflags |= VB_302ELV; /* Deprecated */ in sisfb_get_VB_type()
2728 ivideo->vbflags2 |= VB2_302ELV; in sisfb_get_VB_type()
2735 ivideo->vbflags |= VB_302B; /* Deprecated */ in sisfb_get_VB_type()
2736 ivideo->vbflags2 |= VB2_302B; in sisfb_get_VB_type()
2741 if((!(ivideo->vbflags2 & VB2_VIDEOBRIDGE)) && (ivideo->chip != SIS_300)) { in sisfb_get_VB_type()
2745 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_get_VB_type()
2749 ivideo->vbflags |= VB_LVDS; /* Deprecated */ in sisfb_get_VB_type()
2750 ivideo->vbflags2 |= VB2_LVDS; in sisfb_get_VB_type()
2753 ivideo->vbflags |= (VB_LVDS | VB_TRUMPION); /* Deprecated */ in sisfb_get_VB_type()
2754 ivideo->vbflags2 |= (VB2_LVDS | VB2_TRUMPION); in sisfb_get_VB_type()
2757 ivideo->vbflags |= VB_CHRONTEL; /* Deprecated */ in sisfb_get_VB_type()
2758 ivideo->vbflags2 |= VB2_CHRONTEL; in sisfb_get_VB_type()
2761 ivideo->vbflags |= (VB_LVDS | VB_CHRONTEL); /* Deprecated */ in sisfb_get_VB_type()
2762 ivideo->vbflags2 |= (VB2_LVDS | VB2_CHRONTEL); in sisfb_get_VB_type()
2765 if(ivideo->vbflags2 & VB2_CHRONTEL) ivideo->chronteltype = 1; in sisfb_get_VB_type()
2767 } else if(ivideo->chip < SIS_661) { in sisfb_get_VB_type()
2771 ivideo->vbflags |= VB_LVDS; /* Deprecated */ in sisfb_get_VB_type()
2772 ivideo->vbflags2 |= VB2_LVDS; in sisfb_get_VB_type()
2775 ivideo->vbflags |= (VB_LVDS | VB_CHRONTEL); /* Deprecated */ in sisfb_get_VB_type()
2776 ivideo->vbflags2 |= (VB2_LVDS | VB2_CHRONTEL); in sisfb_get_VB_type()
2779 if(ivideo->vbflags2 & VB2_CHRONTEL) ivideo->chronteltype = 2; in sisfb_get_VB_type()
2781 } else if(ivideo->chip >= SIS_661) { in sisfb_get_VB_type()
2787 ivideo->vbflags |= VB_LVDS; /* Deprecated */ in sisfb_get_VB_type()
2788 ivideo->vbflags2 |= VB2_LVDS; in sisfb_get_VB_type()
2791 ivideo->vbflags |= (VB_LVDS | VB_CHRONTEL); /* Deprecated */ in sisfb_get_VB_type()
2792 ivideo->vbflags2 |= (VB2_LVDS | VB2_CHRONTEL); in sisfb_get_VB_type()
2795 ivideo->vbflags |= (VB_LVDS | VB_CONEXANT); /* Deprecated */ in sisfb_get_VB_type()
2796 ivideo->vbflags2 |= (VB2_LVDS | VB2_CONEXANT); in sisfb_get_VB_type()
2799 if(ivideo->vbflags2 & VB2_CHRONTEL) ivideo->chronteltype = 2; in sisfb_get_VB_type()
2802 if(ivideo->vbflags2 & VB2_LVDS) { in sisfb_get_VB_type()
2805 if((ivideo->sisvga_engine == SIS_300_VGA) && (ivideo->vbflags2 & VB2_TRUMPION)) { in sisfb_get_VB_type()
2808 if(ivideo->vbflags2 & VB2_CHRONTEL) { in sisfb_get_VB_type()
2811 if((ivideo->chip >= SIS_661) && (ivideo->vbflags2 & VB2_CONEXANT)) { in sisfb_get_VB_type()
2816 if(ivideo->vbflags2 & VB2_SISBRIDGE) { in sisfb_get_VB_type()
2819 } else if(ivideo->vbflags2 & VB2_CHRONTEL) { in sisfb_get_VB_type()
2824 /* ---------- Engine initialization routines ------------ */
2834 ivideo->caps &= ~(TURBO_QUEUE_CAP | in sisfb_engine_init()
2840 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_engine_init()
2844 tqueue_pos = (ivideo->video_size - ivideo->cmdQueueSize) / (64 * 1024); in sisfb_engine_init()
2854 ivideo->caps |= TURBO_QUEUE_CAP; in sisfb_engine_init()
2859 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_engine_init()
2863 if(ivideo->chip == XGI_20) { in sisfb_engine_init()
2864 switch(ivideo->cmdQueueSize) { in sisfb_engine_init()
2873 switch(ivideo->cmdQueueSize) { in sisfb_engine_init()
2892 if((ivideo->chip >= XGI_40) && ivideo->modechanged) { in sisfb_engine_init()
2898 if(!((templ = MMIO_IN32(ivideo->mmio_vbase, 0x8240)) & (1 << 10))) { in sisfb_engine_init()
2900 MMIO_OUT32(ivideo->mmio_vbase, Q_WRITE_PTR, 0); in sisfb_engine_init()
2904 tempq = MMIO_IN32(ivideo->mmio_vbase, Q_READ_PTR); in sisfb_engine_init()
2905 MMIO_OUT32(ivideo->mmio_vbase, Q_WRITE_PTR, tempq); in sisfb_engine_init()
2907 tempq = (u32)(ivideo->video_size - ivideo->cmdQueueSize); in sisfb_engine_init()
2908 MMIO_OUT32(ivideo->mmio_vbase, Q_BASE_ADDR, tempq); in sisfb_engine_init()
2910 writel(0x16800000 + 0x8240, ivideo->video_vbase + tempq); in sisfb_engine_init()
2911 writel(templ | (1 << 10), ivideo->video_vbase + tempq + 4); in sisfb_engine_init()
2912 writel(0x168F0000, ivideo->video_vbase + tempq + 8); in sisfb_engine_init()
2913 writel(0x168F0000, ivideo->video_vbase + tempq + 12); in sisfb_engine_init()
2915 MMIO_OUT32(ivideo->mmio_vbase, Q_WRITE_PTR, (tempq + 16)); in sisfb_engine_init()
2924 tempq = MMIO_IN32(ivideo->mmio_vbase, MMIO_QUEUE_READPORT); in sisfb_engine_init()
2925 MMIO_OUT32(ivideo->mmio_vbase, MMIO_QUEUE_WRITEPORT, tempq); in sisfb_engine_init()
2930 tempq = (u32)(ivideo->video_size - ivideo->cmdQueueSize); in sisfb_engine_init()
2931 MMIO_OUT32(ivideo->mmio_vbase, MMIO_QUEUE_PHYBASE, tempq); in sisfb_engine_init()
2933 ivideo->caps |= MMIO_CMD_QUEUE_CAP; in sisfb_engine_init()
2937 ivideo->engineok = 1; in sisfb_engine_init()
2947 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_detect_lcd_type()
2948 ivideo->CRT2LCDType = sis300paneltype[reg]; in sisfb_detect_lcd_type()
2949 } else if(ivideo->chip >= SIS_661) { in sisfb_detect_lcd_type()
2950 ivideo->CRT2LCDType = sis661paneltype[reg]; in sisfb_detect_lcd_type()
2952 ivideo->CRT2LCDType = sis310paneltype[reg]; in sisfb_detect_lcd_type()
2953 if((ivideo->chip == SIS_550) && (sisfb_fstn)) { in sisfb_detect_lcd_type()
2954 if((ivideo->CRT2LCDType != LCD_320x240_2) && in sisfb_detect_lcd_type()
2955 (ivideo->CRT2LCDType != LCD_320x240_3)) { in sisfb_detect_lcd_type()
2956 ivideo->CRT2LCDType = LCD_320x240; in sisfb_detect_lcd_type()
2961 if(ivideo->CRT2LCDType == LCD_UNKNOWN) { in sisfb_detect_lcd_type()
2963 ivideo->CRT2LCDType = LCD_1024x768; in sisfb_detect_lcd_type()
2970 if(ivideo->CRT2LCDType == sis_lcd_data[i].lcdtype) { in sisfb_detect_lcd_type()
2971 ivideo->lcdxres = sis_lcd_data[i].xres; in sisfb_detect_lcd_type()
2972 ivideo->lcdyres = sis_lcd_data[i].yres; in sisfb_detect_lcd_type()
2973 ivideo->lcddefmodeidx = sis_lcd_data[i].default_mode_idx; in sisfb_detect_lcd_type()
2979 if(ivideo->SiS_Pr.SiS_CustomT == CUT_BARCO1366) { in sisfb_detect_lcd_type()
2980 ivideo->lcdxres = 1360; ivideo->lcdyres = 1024; in sisfb_detect_lcd_type()
2981 ivideo->lcddefmodeidx = DEFAULT_MODE_1360; in sisfb_detect_lcd_type()
2982 } else if(ivideo->SiS_Pr.SiS_CustomT == CUT_PANEL848) { in sisfb_detect_lcd_type()
2983 ivideo->lcdxres = 848; ivideo->lcdyres = 480; in sisfb_detect_lcd_type()
2984 ivideo->lcddefmodeidx = DEFAULT_MODE_848; in sisfb_detect_lcd_type()
2985 } else if(ivideo->SiS_Pr.SiS_CustomT == CUT_PANEL856) { in sisfb_detect_lcd_type()
2986 ivideo->lcdxres = 856; ivideo->lcdyres = 480; in sisfb_detect_lcd_type()
2987 ivideo->lcddefmodeidx = DEFAULT_MODE_856; in sisfb_detect_lcd_type()
2992 ivideo->lcdxres, ivideo->lcdyres); in sisfb_detect_lcd_type()
2999 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_save_pdc_emi()
3000 if(ivideo->vbflags2 & (VB2_LVDS | VB2_30xBDH)) { in sisfb_save_pdc_emi()
3004 /* Currently on LCD? If yes, read current pdc */ in sisfb_save_pdc_emi()
3005 ivideo->detectedpdc = SiS_GetReg(SISPART1, 0x13); in sisfb_save_pdc_emi()
3006 ivideo->detectedpdc &= 0x3c; in sisfb_save_pdc_emi()
3007 if(ivideo->SiS_Pr.PDC == -1) { in sisfb_save_pdc_emi()
3009 ivideo->SiS_Pr.PDC = ivideo->detectedpdc; in sisfb_save_pdc_emi()
3011 printk(KERN_INFO "sisfb: Detected LCD PDC 0x%02x\n", in sisfb_save_pdc_emi()
3012 ivideo->detectedpdc); in sisfb_save_pdc_emi()
3014 if((ivideo->SiS_Pr.PDC != -1) && in sisfb_save_pdc_emi()
3015 (ivideo->SiS_Pr.PDC != ivideo->detectedpdc)) { in sisfb_save_pdc_emi()
3016 printk(KERN_INFO "sisfb: Using LCD PDC 0x%02x\n", in sisfb_save_pdc_emi()
3017 ivideo->SiS_Pr.PDC); in sisfb_save_pdc_emi()
3024 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_save_pdc_emi()
3027 if(ivideo->vbflags2 & VB2_SISLCDABRIDGE) { in sisfb_save_pdc_emi()
3031 ivideo->SiS_Pr.SiS_UseLCDA = true; in sisfb_save_pdc_emi()
3032 ivideo->detectedlcda = 0x03; in sisfb_save_pdc_emi()
3036 /* Save PDC */ in sisfb_save_pdc_emi()
3037 if(ivideo->vbflags2 & VB2_SISLVDSBRIDGE) { in sisfb_save_pdc_emi()
3040 if((tmp & 0x20) || (ivideo->detectedlcda != 0xff)) { in sisfb_save_pdc_emi()
3041 /* Currently on LCD? If yes, read current pdc */ in sisfb_save_pdc_emi()
3042 u8 pdc; in sisfb_save_pdc_emi() local
3043 pdc = SiS_GetReg(SISPART1, 0x2D); in sisfb_save_pdc_emi()
3044 ivideo->detectedpdc = (pdc & 0x0f) << 1; in sisfb_save_pdc_emi()
3045 ivideo->detectedpdca = (pdc & 0xf0) >> 3; in sisfb_save_pdc_emi()
3046 pdc = SiS_GetReg(SISPART1, 0x35); in sisfb_save_pdc_emi()
3047 ivideo->detectedpdc |= ((pdc >> 7) & 0x01); in sisfb_save_pdc_emi()
3048 pdc = SiS_GetReg(SISPART1, 0x20); in sisfb_save_pdc_emi()
3049 ivideo->detectedpdca |= ((pdc >> 6) & 0x01); in sisfb_save_pdc_emi()
3050 if(ivideo->newrom) { in sisfb_save_pdc_emi()
3051 /* New ROM invalidates other PDC resp. */ in sisfb_save_pdc_emi()
3052 if(ivideo->detectedlcda != 0xff) { in sisfb_save_pdc_emi()
3053 ivideo->detectedpdc = 0xff; in sisfb_save_pdc_emi()
3055 ivideo->detectedpdca = 0xff; in sisfb_save_pdc_emi()
3058 if(ivideo->SiS_Pr.PDC == -1) { in sisfb_save_pdc_emi()
3059 if(ivideo->detectedpdc != 0xff) { in sisfb_save_pdc_emi()
3060 ivideo->SiS_Pr.PDC = ivideo->detectedpdc; in sisfb_save_pdc_emi()
3063 if(ivideo->SiS_Pr.PDCA == -1) { in sisfb_save_pdc_emi()
3064 if(ivideo->detectedpdca != 0xff) { in sisfb_save_pdc_emi()
3065 ivideo->SiS_Pr.PDCA = ivideo->detectedpdca; in sisfb_save_pdc_emi()
3068 if(ivideo->detectedpdc != 0xff) { in sisfb_save_pdc_emi()
3070 "sisfb: Detected LCD PDC 0x%02x (for LCD=CRT2)\n", in sisfb_save_pdc_emi()
3071 ivideo->detectedpdc); in sisfb_save_pdc_emi()
3073 if(ivideo->detectedpdca != 0xff) { in sisfb_save_pdc_emi()
3076 ivideo->detectedpdca); in sisfb_save_pdc_emi()
3081 if(ivideo->vbflags2 & VB2_SISEMIBRIDGE) { in sisfb_save_pdc_emi()
3082 ivideo->SiS_Pr.EMI_30 = SiS_GetReg(SISPART4, 0x30); in sisfb_save_pdc_emi()
3083 ivideo->SiS_Pr.EMI_31 = SiS_GetReg(SISPART4, 0x31); in sisfb_save_pdc_emi()
3084 ivideo->SiS_Pr.EMI_32 = SiS_GetReg(SISPART4, 0x32); in sisfb_save_pdc_emi()
3085 ivideo->SiS_Pr.EMI_33 = SiS_GetReg(SISPART4, 0x33); in sisfb_save_pdc_emi()
3086 ivideo->SiS_Pr.HaveEMI = true; in sisfb_save_pdc_emi()
3087 if((tmp & 0x20) || (ivideo->detectedlcda != 0xff)) { in sisfb_save_pdc_emi()
3088 ivideo->SiS_Pr.HaveEMILCD = true; in sisfb_save_pdc_emi()
3094 if(ivideo->vbflags2 & VB2_30xBLV) { in sisfb_save_pdc_emi()
3095 if((ivideo->SiS_Pr.PDC != -1) && in sisfb_save_pdc_emi()
3096 (ivideo->SiS_Pr.PDC != ivideo->detectedpdc)) { in sisfb_save_pdc_emi()
3097 printk(KERN_INFO "sisfb: Using LCD PDC 0x%02x (for LCD=CRT2)\n", in sisfb_save_pdc_emi()
3098 ivideo->SiS_Pr.PDC); in sisfb_save_pdc_emi()
3100 if((ivideo->SiS_Pr.PDCA != -1) && in sisfb_save_pdc_emi()
3101 (ivideo->SiS_Pr.PDCA != ivideo->detectedpdca)) { in sisfb_save_pdc_emi()
3103 ivideo->SiS_Pr.PDCA); in sisfb_save_pdc_emi()
3111 /* -------------------- Memory manager routines ---------------------- */
3115 u32 ret = ivideo->sisfb_parm_mem * 1024; in sisfb_getheapstart()
3116 u32 maxoffs = ivideo->video_size - ivideo->hwcursor_size - ivideo->cmdQueueSize; in sisfb_getheapstart()
3122 * C = console, D = heap, H = HWCursor, Q = cmd-queue in sisfb_getheapstart()
3132 * maximum = videosize - cmd_queue - hwcursor in sisfb_getheapstart()
3138 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_getheapstart()
3139 if(ivideo->video_size > 0x1000000) { in sisfb_getheapstart()
3141 } else if(ivideo->video_size > 0x800000) { in sisfb_getheapstart()
3146 } else if(ivideo->UMAsize && ivideo->LFBsize) { in sisfb_getheapstart()
3149 def = maxoffs - 0x8000; in sisfb_getheapstart()
3153 if((!ret) || (ret > maxoffs) || (ivideo->cardnumber != 0)) in sisfb_getheapstart()
3161 u32 max = ivideo->video_size - ivideo->hwcursor_size - ivideo->cmdQueueSize; in sisfb_getheapsize()
3164 if(ivideo->UMAsize && ivideo->LFBsize) { in sisfb_getheapsize()
3165 if( (!ivideo->sisfb_parm_mem) || in sisfb_getheapsize()
3166 ((ivideo->sisfb_parm_mem * 1024) > max) || in sisfb_getheapsize()
3167 ((max - (ivideo->sisfb_parm_mem * 1024)) < ivideo->UMAsize) ) { in sisfb_getheapsize()
3168 ret = ivideo->UMAsize; in sisfb_getheapsize()
3169 max -= ivideo->UMAsize; in sisfb_getheapsize()
3171 ret = max - (ivideo->sisfb_parm_mem * 1024); in sisfb_getheapsize()
3172 max = ivideo->sisfb_parm_mem * 1024; in sisfb_getheapsize()
3174 ivideo->video_offset = ret; in sisfb_getheapsize()
3175 ivideo->sisfb_mem = max; in sisfb_getheapsize()
3177 ret = max - ivideo->heapstart; in sisfb_getheapsize()
3178 ivideo->sisfb_mem = ivideo->heapstart; in sisfb_getheapsize()
3188 ivideo->video_offset = 0; in sisfb_heap_init()
3189 if(ivideo->sisfb_parm_mem) { in sisfb_heap_init()
3190 if( (ivideo->sisfb_parm_mem < (2 * 1024 * 1024)) || in sisfb_heap_init()
3191 (ivideo->sisfb_parm_mem > ivideo->video_size) ) { in sisfb_heap_init()
3192 ivideo->sisfb_parm_mem = 0; in sisfb_heap_init()
3196 ivideo->heapstart = sisfb_getheapstart(ivideo); in sisfb_heap_init()
3197 ivideo->sisfb_heap_size = sisfb_getheapsize(ivideo); in sisfb_heap_init()
3199 ivideo->sisfb_heap_start = ivideo->video_vbase + ivideo->heapstart; in sisfb_heap_init()
3200 ivideo->sisfb_heap_end = ivideo->sisfb_heap_start + ivideo->sisfb_heap_size; in sisfb_heap_init()
3203 (int)(ivideo->heapstart / 1024), (int)(ivideo->sisfb_heap_size / 1024)); in sisfb_heap_init()
3205 ivideo->sisfb_heap.vinfo = ivideo; in sisfb_heap_init()
3207 ivideo->sisfb_heap.poha_chain = NULL; in sisfb_heap_init()
3208 ivideo->sisfb_heap.poh_freelist = NULL; in sisfb_heap_init()
3210 poh = sisfb_poh_new_node(&ivideo->sisfb_heap); in sisfb_heap_init()
3214 poh->poh_next = &ivideo->sisfb_heap.oh_free; in sisfb_heap_init()
3215 poh->poh_prev = &ivideo->sisfb_heap.oh_free; in sisfb_heap_init()
3216 poh->size = ivideo->sisfb_heap_size; in sisfb_heap_init()
3217 poh->offset = ivideo->heapstart; in sisfb_heap_init()
3219 ivideo->sisfb_heap.oh_free.poh_next = poh; in sisfb_heap_init()
3220 ivideo->sisfb_heap.oh_free.poh_prev = poh; in sisfb_heap_init()
3221 ivideo->sisfb_heap.oh_free.size = 0; in sisfb_heap_init()
3222 ivideo->sisfb_heap.max_freesize = poh->size; in sisfb_heap_init()
3224 ivideo->sisfb_heap.oh_used.poh_next = &ivideo->sisfb_heap.oh_used; in sisfb_heap_init()
3225 ivideo->sisfb_heap.oh_used.poh_prev = &ivideo->sisfb_heap.oh_used; in sisfb_heap_init()
3226 ivideo->sisfb_heap.oh_used.size = SENTINEL; in sisfb_heap_init()
3228 if(ivideo->cardnumber == 0) { in sisfb_heap_init()
3229 /* For the first card, make this heap the "global" one in sisfb_heap_init()
3232 sisfb_heap = &ivideo->sisfb_heap; in sisfb_heap_init()
3246 if(memheap->poh_freelist == NULL) { in sisfb_poh_new_node()
3251 poha->poha_next = memheap->poha_chain; in sisfb_poh_new_node()
3252 memheap->poha_chain = poha; in sisfb_poh_new_node()
3254 cOhs = (SIS_OH_ALLOC_SIZE - sizeof(struct SIS_OHALLOC)) / sizeof(struct SIS_OH) + 1; in sisfb_poh_new_node()
3256 poh = &poha->aoh[0]; in sisfb_poh_new_node()
3257 for(i = cOhs - 1; i != 0; i--) { in sisfb_poh_new_node()
3258 poh->poh_next = poh + 1; in sisfb_poh_new_node()
3262 poh->poh_next = NULL; in sisfb_poh_new_node()
3263 memheap->poh_freelist = &poha->aoh[0]; in sisfb_poh_new_node()
3266 poh = memheap->poh_freelist; in sisfb_poh_new_node()
3267 memheap->poh_freelist = poh->poh_next; in sisfb_poh_new_node()
3279 if(size > memheap->max_freesize) { in sisfb_poh_allocate()
3285 pohThis = memheap->oh_free.poh_next; in sisfb_poh_allocate()
3287 while(pohThis != &memheap->oh_free) { in sisfb_poh_allocate()
3288 if(size <= pohThis->size) { in sisfb_poh_allocate()
3292 pohThis = pohThis->poh_next; in sisfb_poh_allocate()
3301 if(size == pohThis->size) { in sisfb_poh_allocate()
3309 pohRoot->offset = pohThis->offset; in sisfb_poh_allocate()
3310 pohRoot->size = size; in sisfb_poh_allocate()
3312 pohThis->offset += size; in sisfb_poh_allocate()
3313 pohThis->size -= size; in sisfb_poh_allocate()
3316 memheap->max_freesize -= size; in sisfb_poh_allocate()
3318 pohThis = &memheap->oh_used; in sisfb_poh_allocate()
3327 poh->poh_prev->poh_next = poh->poh_next; in sisfb_delete_node()
3328 poh->poh_next->poh_prev = poh->poh_prev; in sisfb_delete_node()
3334 struct SIS_OH *pohTemp = pohList->poh_next; in sisfb_insert_node()
3336 pohList->poh_next = poh; in sisfb_insert_node()
3337 pohTemp->poh_prev = poh; in sisfb_insert_node()
3339 poh->poh_prev = pohList; in sisfb_insert_node()
3340 poh->poh_next = pohTemp; in sisfb_insert_node()
3354 poh_freed = memheap->oh_used.poh_next; in sisfb_poh_free()
3356 while(poh_freed != &memheap->oh_used) { in sisfb_poh_free()
3357 if(poh_freed->offset == base) { in sisfb_poh_free()
3362 poh_freed = poh_freed->poh_next; in sisfb_poh_free()
3368 memheap->max_freesize += poh_freed->size; in sisfb_poh_free()
3371 ulUpper = poh_freed->offset + poh_freed->size; in sisfb_poh_free()
3372 ulLower = poh_freed->offset; in sisfb_poh_free()
3374 pohThis = memheap->oh_free.poh_next; in sisfb_poh_free()
3376 while(pohThis != &memheap->oh_free) { in sisfb_poh_free()
3377 if(pohThis->offset == ulUpper) { in sisfb_poh_free()
3379 } else if((pohThis->offset + pohThis->size) == ulLower) { in sisfb_poh_free()
3382 pohThis = pohThis->poh_next; in sisfb_poh_free()
3388 poh_prev->size += (poh_freed->size + poh_next->size); in sisfb_poh_free()
3396 poh_prev->size += poh_freed->size; in sisfb_poh_free()
3402 poh_next->size += poh_freed->size; in sisfb_poh_free()
3403 poh_next->offset = poh_freed->offset; in sisfb_poh_free()
3408 sisfb_insert_node(&memheap->oh_free, poh_freed); in sisfb_poh_free()
3419 poh->poh_next = memheap->poh_freelist; in sisfb_free_node()
3420 memheap->poh_freelist = poh; in sisfb_free_node()
3428 if((ivideo) && (ivideo->sisfb_id == SISFB_ID) && (!ivideo->havenoheap)) in sis_int_malloc()
3429 poh = sisfb_poh_allocate(&ivideo->sisfb_heap, (u32)req->size); in sis_int_malloc()
3432 req->offset = req->size = 0; in sis_int_malloc()
3435 req->offset = poh->offset; in sis_int_malloc()
3436 req->size = poh->size; in sis_int_malloc()
3438 (poh->offset + ivideo->video_vbase)); in sis_int_malloc()
3445 struct sis_video_info *ivideo = sisfb_heap->vinfo; in sis_malloc()
3447 if(&ivideo->sisfb_heap == sisfb_heap) in sis_malloc()
3450 req->offset = req->size = 0; in sis_malloc()
3468 if((!ivideo) || (ivideo->sisfb_id != SISFB_ID) || (ivideo->havenoheap)) in sis_int_free()
3471 poh = sisfb_poh_free(&ivideo->sisfb_heap, base); in sis_int_free()
3482 struct sis_video_info *ivideo = sisfb_heap->vinfo; in sis_free()
3495 /* --------------------- SetMode routines ------------------------- */
3504 * ivideo->accel here, as this might have in sisfb_check_engine_and_sync()
3512 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_check_engine_and_sync()
3521 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_check_engine_and_sync()
3541 ivideo->currentvbflags &= (VB_VIDEOBRIDGE | VB_DISPTYPE_DISP2); in sisfb_pre_setmode()
3549 cr33 = ivideo->rate_idx & 0x0F; in sisfb_pre_setmode()
3552 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_pre_setmode()
3553 if(ivideo->chip >= SIS_661) { in sisfb_pre_setmode()
3564 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_pre_setmode()
3570 SiS_SetEnableDstn(&ivideo->SiS_Pr, false); in sisfb_pre_setmode()
3571 SiS_SetEnableFstn(&ivideo->SiS_Pr, false); in sisfb_pre_setmode()
3572 ivideo->curFSTN = ivideo->curDSTN = 0; in sisfb_pre_setmode()
3574 switch(ivideo->currentvbflags & VB_DISPTYPE_DISP2) { in sisfb_pre_setmode()
3577 cr38 &= ~0xc0; /* Clear PAL-M / PAL-N bits */ in sisfb_pre_setmode()
3578 if((ivideo->vbflags & TV_YPBPR) && (ivideo->vbflags2 & VB2_SISYPBPRBRIDGE)) { in sisfb_pre_setmode()
3580 if(ivideo->chip >= SIS_661) { in sisfb_pre_setmode()
3582 if(ivideo->vbflags & TV_YPBPR525P) cr35 |= 0x20; in sisfb_pre_setmode()
3583 else if(ivideo->vbflags & TV_YPBPR750P) cr35 |= 0x40; in sisfb_pre_setmode()
3584 else if(ivideo->vbflags & TV_YPBPR1080I) cr35 |= 0x60; in sisfb_pre_setmode()
3587 ivideo->currentvbflags |= (TV_YPBPR | (ivideo->vbflags & TV_YPBPRALL)); in sisfb_pre_setmode()
3588 } else if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_pre_setmode()
3591 if(ivideo->vbflags & TV_YPBPR525P) cr38 |= 0x10; in sisfb_pre_setmode()
3592 else if(ivideo->vbflags & TV_YPBPR750P) cr38 |= 0x20; in sisfb_pre_setmode()
3593 else if(ivideo->vbflags & TV_YPBPR1080I) cr38 |= 0x30; in sisfb_pre_setmode()
3595 ivideo->currentvbflags |= (TV_YPBPR | (ivideo->vbflags & TV_YPBPRALL)); in sisfb_pre_setmode()
3598 } else if((ivideo->vbflags & TV_HIVISION) && in sisfb_pre_setmode()
3599 (ivideo->vbflags2 & VB2_SISHIVISIONBRIDGE)) { in sisfb_pre_setmode()
3600 if(ivideo->chip >= SIS_661) { in sisfb_pre_setmode()
3609 ivideo->currentvbflags |= TV_HIVISION; in sisfb_pre_setmode()
3610 } else if(ivideo->vbflags & TV_SCART) { in sisfb_pre_setmode()
3614 ivideo->currentvbflags |= TV_SCART; in sisfb_pre_setmode()
3616 if(ivideo->vbflags & TV_SVIDEO) { in sisfb_pre_setmode()
3618 ivideo->currentvbflags |= TV_SVIDEO; in sisfb_pre_setmode()
3620 if(ivideo->vbflags & TV_AVIDEO) { in sisfb_pre_setmode()
3622 ivideo->currentvbflags |= TV_AVIDEO; in sisfb_pre_setmode()
3627 if(ivideo->vbflags & (TV_AVIDEO | TV_SVIDEO)) { in sisfb_pre_setmode()
3628 if(ivideo->vbflags & TV_PAL) { in sisfb_pre_setmode()
3630 ivideo->currentvbflags |= TV_PAL; in sisfb_pre_setmode()
3631 if(ivideo->vbflags & TV_PALM) { in sisfb_pre_setmode()
3633 ivideo->currentvbflags |= TV_PALM; in sisfb_pre_setmode()
3634 } else if(ivideo->vbflags & TV_PALN) { in sisfb_pre_setmode()
3636 ivideo->currentvbflags |= TV_PALN; in sisfb_pre_setmode()
3640 ivideo->currentvbflags |= TV_NTSC; in sisfb_pre_setmode()
3641 if(ivideo->vbflags & TV_NTSCJ) { in sisfb_pre_setmode()
3643 ivideo->currentvbflags |= TV_NTSCJ; in sisfb_pre_setmode()
3652 SiS_SetEnableDstn(&ivideo->SiS_Pr, ivideo->sisfb_dstn); in sisfb_pre_setmode()
3653 SiS_SetEnableFstn(&ivideo->SiS_Pr, ivideo->sisfb_fstn); in sisfb_pre_setmode()
3654 ivideo->curFSTN = ivideo->sisfb_fstn; in sisfb_pre_setmode()
3655 ivideo->curDSTN = ivideo->sisfb_dstn; in sisfb_pre_setmode()
3661 if(ivideo->sisfb_nocrt2rate) { in sisfb_pre_setmode()
3662 cr33 |= (sisbios_mode[ivideo->sisfb_mode_idx].rate_idx << 4); in sisfb_pre_setmode()
3664 cr33 |= ((ivideo->rate_idx & 0x0F) << 4); in sisfb_pre_setmode()
3676 if(ivideo->chip >= SIS_661) { in sisfb_pre_setmode()
3683 } else if(ivideo->chip != SIS_300) { in sisfb_pre_setmode()
3688 ivideo->SiS_Pr.SiS_UseOEM = ivideo->sisfb_useoem; in sisfb_pre_setmode()
3700 if(ivideo->chip >= SIS_661) { in sisfb_fixup_SR11()
3719 if(val < -32) val = -32; in sisfb_set_TVxposoffset()
3720 ivideo->tvxpos = val; in sisfb_set_TVxposoffset()
3722 if(ivideo->sisfblocked) return; in sisfb_set_TVxposoffset()
3723 if(!ivideo->modechanged) return; in sisfb_set_TVxposoffset()
3725 if(ivideo->currentvbflags & CRT2_TV) { in sisfb_set_TVxposoffset()
3727 if(ivideo->vbflags2 & VB2_CHRONTEL) { in sisfb_set_TVxposoffset()
3729 int x = ivideo->tvx; in sisfb_set_TVxposoffset()
3731 switch(ivideo->chronteltype) { in sisfb_set_TVxposoffset()
3736 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0a, (x & 0xff)); in sisfb_set_TVxposoffset()
3737 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x08, ((x & 0x0100) >> 7), 0xFD); in sisfb_set_TVxposoffset()
3744 } else if(ivideo->vbflags2 & VB2_SISBRIDGE) { in sisfb_set_TVxposoffset()
3749 p2_1f = ivideo->p2_1f; in sisfb_set_TVxposoffset()
3750 p2_20 = ivideo->p2_20; in sisfb_set_TVxposoffset()
3751 p2_2b = ivideo->p2_2b; in sisfb_set_TVxposoffset()
3752 p2_42 = ivideo->p2_42; in sisfb_set_TVxposoffset()
3753 p2_43 = ivideo->p2_43; in sisfb_set_TVxposoffset()
3777 if(val < -32) val = -32; in sisfb_set_TVyposoffset()
3778 ivideo->tvypos = val; in sisfb_set_TVyposoffset()
3780 if(ivideo->sisfblocked) return; in sisfb_set_TVyposoffset()
3781 if(!ivideo->modechanged) return; in sisfb_set_TVyposoffset()
3783 if(ivideo->currentvbflags & CRT2_TV) { in sisfb_set_TVyposoffset()
3785 if(ivideo->vbflags2 & VB2_CHRONTEL) { in sisfb_set_TVyposoffset()
3787 int y = ivideo->tvy; in sisfb_set_TVyposoffset()
3789 switch(ivideo->chronteltype) { in sisfb_set_TVyposoffset()
3791 y -= val; in sisfb_set_TVyposoffset()
3794 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0b, (y & 0xff)); in sisfb_set_TVyposoffset()
3795 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x08, ((y & 0x0100) >> 8), 0xFE); in sisfb_set_TVyposoffset()
3802 } else if(ivideo->vbflags2 & VB2_SISBRIDGE) { in sisfb_set_TVyposoffset()
3806 p2_01 = ivideo->p2_01; in sisfb_set_TVyposoffset()
3807 p2_02 = ivideo->p2_02; in sisfb_set_TVyposoffset()
3811 if(!(ivideo->currentvbflags & (TV_HIVISION | TV_YPBPR))) { in sisfb_set_TVyposoffset()
3842 ivideo->modechanged = 1; in sisfb_post_setmode()
3845 if(ivideo->vbflags2 & VB2_VIDEOBRIDGE) { in sisfb_post_setmode()
3848 ivideo->sisfb_crt1off = 0; in sisfb_post_setmode()
3851 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_post_setmode()
3852 if((ivideo->sisfb_crt1off) && (doit)) { in sisfb_post_setmode()
3863 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_post_setmode()
3864 if((ivideo->sisfb_crt1off) && (doit)) { in sisfb_post_setmode()
3873 SiS_SetRegANDOR(SISCR, ivideo->SiS_Pr.SiS_MyCR63, ~0x40, reg); in sisfb_post_setmode()
3879 ivideo->currentvbflags &= ~VB_DISPTYPE_CRT1; in sisfb_post_setmode()
3880 ivideo->currentvbflags |= VB_SINGLE_MODE; in sisfb_post_setmode()
3882 ivideo->currentvbflags |= VB_DISPTYPE_CRT1; in sisfb_post_setmode()
3883 if(ivideo->currentvbflags & VB_DISPTYPE_CRT2) { in sisfb_post_setmode()
3884 ivideo->currentvbflags |= VB_MIRROR_MODE; in sisfb_post_setmode()
3886 ivideo->currentvbflags |= VB_SINGLE_MODE; in sisfb_post_setmode()
3892 if(ivideo->currentvbflags & CRT2_TV) { in sisfb_post_setmode()
3893 if(ivideo->vbflags2 & VB2_SISBRIDGE) { in sisfb_post_setmode()
3894 ivideo->p2_1f = SiS_GetReg(SISPART2, 0x1f); in sisfb_post_setmode()
3895 ivideo->p2_20 = SiS_GetReg(SISPART2, 0x20); in sisfb_post_setmode()
3896 ivideo->p2_2b = SiS_GetReg(SISPART2, 0x2b); in sisfb_post_setmode()
3897 ivideo->p2_42 = SiS_GetReg(SISPART2, 0x42); in sisfb_post_setmode()
3898 ivideo->p2_43 = SiS_GetReg(SISPART2, 0x43); in sisfb_post_setmode()
3899 ivideo->p2_01 = SiS_GetReg(SISPART2, 0x01); in sisfb_post_setmode()
3900 ivideo->p2_02 = SiS_GetReg(SISPART2, 0x02); in sisfb_post_setmode()
3901 } else if(ivideo->vbflags2 & VB2_CHRONTEL) { in sisfb_post_setmode()
3902 if(ivideo->chronteltype == 1) { in sisfb_post_setmode()
3903 ivideo->tvx = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0a); in sisfb_post_setmode()
3904 ivideo->tvx |= (((SiS_GetCH700x(&ivideo->SiS_Pr, 0x08) & 0x02) >> 1) << 8); in sisfb_post_setmode()
3905 ivideo->tvy = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0b); in sisfb_post_setmode()
3906 ivideo->tvy |= ((SiS_GetCH700x(&ivideo->SiS_Pr, 0x08) & 0x01) << 8); in sisfb_post_setmode()
3911 if(ivideo->tvxpos) { in sisfb_post_setmode()
3912 sisfb_set_TVxposoffset(ivideo, ivideo->tvxpos); in sisfb_post_setmode()
3914 if(ivideo->tvypos) { in sisfb_post_setmode()
3915 sisfb_set_TVyposoffset(ivideo, ivideo->tvypos); in sisfb_post_setmode()
3921 /* (Re-)Initialize chip engines */ in sisfb_post_setmode()
3922 if(ivideo->accel) { in sisfb_post_setmode()
3925 ivideo->engineok = 0; in sisfb_post_setmode()
3936 sisfb_set_base_CRT1(ivideo, ivideo->current_base); in sisfb_reset_mode()
3937 sisfb_set_base_CRT2(ivideo, ivideo->current_base); in sisfb_reset_mode()
3947 switch(sisfb_command->sisfb_cmd) { in sisfb_handle_command()
3949 if(!ivideo->modechanged) { in sisfb_handle_command()
3950 sisfb_command->sisfb_result[0] = SISFB_CMD_ERR_EARLY; in sisfb_handle_command()
3952 sisfb_command->sisfb_result[0] = SISFB_CMD_ERR_OK; in sisfb_handle_command()
3953 sisfb_command->sisfb_result[1] = ivideo->currentvbflags; in sisfb_handle_command()
3954 sisfb_command->sisfb_result[2] = ivideo->vbflags2; in sisfb_handle_command()
3959 if(!ivideo->modechanged) { in sisfb_handle_command()
3960 sisfb_command->sisfb_result[0] = SISFB_CMD_ERR_EARLY; in sisfb_handle_command()
3961 } else if(sisfb_command->sisfb_arg[0] == 99) { in sisfb_handle_command()
3963 sisfb_command->sisfb_result[1] = ivideo->sisfb_crt1off ? 0 : 1; in sisfb_handle_command()
3964 sisfb_command->sisfb_result[0] = SISFB_CMD_ERR_OK; in sisfb_handle_command()
3965 } else if(ivideo->sisfblocked) { in sisfb_handle_command()
3966 sisfb_command->sisfb_result[0] = SISFB_CMD_ERR_LOCKED; in sisfb_handle_command()
3967 } else if((!(ivideo->currentvbflags & CRT2_ENABLE)) && in sisfb_handle_command()
3968 (sisfb_command->sisfb_arg[0] == 0)) { in sisfb_handle_command()
3969 sisfb_command->sisfb_result[0] = SISFB_CMD_ERR_NOCRT2; in sisfb_handle_command()
3971 sisfb_command->sisfb_result[0] = SISFB_CMD_ERR_OK; in sisfb_handle_command()
3972 mycrt1off = sisfb_command->sisfb_arg[0] ? 0 : 1; in sisfb_handle_command()
3973 if( ((ivideo->currentvbflags & VB_DISPTYPE_CRT1) && mycrt1off) || in sisfb_handle_command()
3974 ((!(ivideo->currentvbflags & VB_DISPTYPE_CRT1)) && !mycrt1off) ) { in sisfb_handle_command()
3975 ivideo->sisfb_crt1off = mycrt1off; in sisfb_handle_command()
3977 sisfb_command->sisfb_result[0] = SISFB_CMD_ERR_OTHER; in sisfb_handle_command()
3980 sisfb_command->sisfb_result[1] = ivideo->sisfb_crt1off ? 0 : 1; in sisfb_handle_command()
3985 sisfb_command->sisfb_result[0] = SISFB_CMD_ERR_UNKNOWN; in sisfb_handle_command()
3987 sisfb_command->sisfb_cmd); in sisfb_handle_command()
4024 } else if(!strncasecmp(this_opt, "pdc:", 4)) { in sisfb_setup()
4031 sisfb_accel = -1; in sisfb_setup()
4035 sisfb_ypan = -1; in sisfb_setup()
4039 sisfb_max = -1; in sisfb_setup()
4055 if((temp >= -32) && (temp <= 32)) { in sisfb_setup()
4061 if((temp >= -32) && (temp <= 32)) { in sisfb_setup()
4100 if(romptr > (0x10000 - 8)) in sisfb_check_rom()
4109 if((readb(rom + 4) | (readb(rom + 5) << 8)) != ivideo->chip_vendor) in sisfb_check_rom()
4112 if((readb(rom + 6) | (readb(rom + 7) << 8)) != ivideo->chip_id) in sisfb_check_rom()
4129 if(!ivideo->nbridge) { in sisfb_find_rom()
4183 ivideo->video_vbase = ioremap_wc(ivideo->video_base, (*mapsize)); in sisfb_post_map_vram()
4185 if(!ivideo->video_vbase) { in sisfb_post_map_vram()
4189 while((!(ivideo->video_vbase = ioremap_wc(ivideo->video_base, (*mapsize))))) { in sisfb_post_map_vram()
4194 if(ivideo->video_vbase) { in sisfb_post_map_vram()
4205 void __iomem *FBAddress = ivideo->video_vbase; in sisfb_post_300_buswidth()
4272 void __iomem *FBAddr = ivideo->video_vbase; in sisfb_post_300_rwtest()
4286 BankNumHigh = RankCapacity * 16 * iteration - 1; in sisfb_post_300_rwtest()
4288 BankNumMid = RankCapacity * 16 - 1; in sisfb_post_300_rwtest()
4290 BankNumMid = RankCapacity * 16 * iteration / 2 - 1; in sisfb_post_300_rwtest()
4300 sr14 = (SiS_DRAMType[k][3] * buswidth) - 1; in sisfb_post_300_rwtest()
4345 for(i = 6; i >= 0; i--) { in sisfb_post_300_ramsize()
4347 for(j = 4; j >= 1; j--) { in sisfb_post_300_ramsize()
4348 PseudoAdrPinCount = 15 - j; in sisfb_post_300_ramsize()
4365 unsigned char *bios = ivideo->SiS_Pr.VirtualRomBase; in sisfb_post_sis300()
4370 if(!ivideo->SiS_Pr.UseROM) in sisfb_post_sis300()
4385 if(ivideo->revision_id <= 0x13) { in sisfb_post_sis300()
4430 if(ivideo->revision_id >= 0x80) in sisfb_post_sis300()
4439 SiS_SetReg(SISSR, 0x1c, v8); /* ---- */ in sisfb_post_sis300()
4448 if(ivideo->revision_id >= 0x80) in sisfb_post_sis300()
4473 if(ivideo->revision_id >= 0x80) in sisfb_post_sis300()
4481 if (ivideo->SiS_Pr.UseROM && bios) { in sisfb_post_sis300()
4511 reg = ((sisfb_videoram >> 10) - 1) | 0x40; in sisfb_post_sis300()
4516 mapsize = ivideo->video_size; in sisfb_post_sis300()
4519 if(ivideo->video_vbase) { in sisfb_post_sis300()
4521 iounmap(ivideo->video_vbase); in sisfb_post_sis300()
4551 ivideo->SiS_Pr.SiS_UseOEM = false; in sisfb_post_sis300()
4552 SiS_SetEnableDstn(&ivideo->SiS_Pr, false); in sisfb_post_sis300()
4553 SiS_SetEnableFstn(&ivideo->SiS_Pr, false); in sisfb_post_sis300()
4554 ivideo->curFSTN = ivideo->curDSTN = 0; in sisfb_post_sis300()
4555 ivideo->SiS_Pr.VideoMemorySize = 8 << 20; in sisfb_post_sis300()
4556 SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80); in sisfb_post_sis300()
4567 ivideo->modeprechange = 0x2e; in sisfb_post_sis300()
4581 return ivideo->chip_real_id == XGI_21; in sisfb_xgi_is21()
4604 temp = pdev->vendor; in sisfb_find_host_bridge()
4621 writel(0, ivideo->video_vbase); in sisfb_post_xgi_rwtest()
4626 writel(pos, ivideo->video_vbase + pos); in sisfb_post_xgi_rwtest()
4631 if(readl(ivideo->video_vbase) != 0) in sisfb_post_xgi_rwtest()
4637 if(readl(ivideo->video_vbase + pos) != pos) in sisfb_post_xgi_rwtest()
4674 * - if running on x86, if the card is disabled, it means in sisfb_post_xgi_ramsize()
4677 * - if running on non-x86, there usually is no VGA window in sisfb_post_xgi_ramsize()
4683 mapsize = ivideo->video_size; in sisfb_post_xgi_ramsize()
4686 if(!ivideo->video_vbase) { in sisfb_post_xgi_ramsize()
4691 return -ENOMEM; in sisfb_post_xgi_ramsize()
4694 /* Non-interleaving */ in sisfb_post_xgi_ramsize()
4699 if(ivideo->chip == XGI_20) { in sisfb_post_xgi_ramsize()
4763 if(ivideo->revision_id == 2) { in sisfb_post_xgi_ramsize()
4819 if(ivideo->revision_id == 2) { in sisfb_post_xgi_ramsize()
4851 j = (ivideo->chip == XGI_20) ? 5 : 9; in sisfb_post_xgi_ramsize()
4852 k = (ivideo->chip == XGI_20) ? 12 : 4; in sisfb_post_xgi_ramsize()
4853 status = -EIO; in sisfb_post_xgi_ramsize()
4857 reg = (ivideo->chip == XGI_20) ? in sisfb_post_xgi_ramsize()
4862 ranksize = (ivideo->chip == XGI_20) ? in sisfb_post_xgi_ramsize()
4868 if(ivideo->chip == XGI_20) { in sisfb_post_xgi_ramsize()
4887 if (sisfb_post_xgi_rwtest(ivideo, j, ((reg >> 4) + channelab - 2 + 20), mapsize)) { in sisfb_post_xgi_ramsize()
4893 iounmap(ivideo->video_vbase); in sisfb_post_xgi_ramsize()
4927 if(ivideo->haveXGIROM) { in sisfb_post_xgi_setclocks()
4928 v1 = ivideo->bios_abase[0x90 + index]; in sisfb_post_xgi_setclocks()
4929 v2 = ivideo->bios_abase[0x90 + index + 1]; in sisfb_post_xgi_setclocks()
4930 v3 = ivideo->bios_abase[0x90 + index + 2]; in sisfb_post_xgi_setclocks()
4940 if(ivideo->haveXGIROM) { in sisfb_post_xgi_setclocks()
4941 v1 = ivideo->bios_abase[0xb8 + index]; in sisfb_post_xgi_setclocks()
4942 v2 = ivideo->bios_abase[0xb8 + index + 1]; in sisfb_post_xgi_setclocks()
4943 v3 = ivideo->bios_abase[0xb8 + index + 2]; in sisfb_post_xgi_setclocks()
4956 unsigned char *bios = ivideo->bios_abase; in sisfb_post_xgi_ddr2_mrs_default()
4984 if (ivideo->haveXGIROM) { in sisfb_post_xgi_ddr2_mrs_default()
5037 unsigned char *bios = ivideo->bios_abase; in sisfb_post_xgi_ddr2()
5058 if (ivideo->haveXGIROM) { in sisfb_post_xgi_ddr2()
5081 unsigned char *bios = ivideo->bios_abase; in sisfb_post_xgi_ramtype()
5087 if (ivideo->haveXGIROM) { in sisfb_post_xgi_ramtype()
5098 } else if (ivideo->chip == XGI_20) { in sisfb_post_xgi_ramtype()
5121 unsigned char *bios = ivideo->bios_abase; in sisfb_post_xgi()
5210 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5218 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5226 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5238 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5245 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5246 if(ivideo->revision_id == 2) { in sisfb_post_xgi()
5252 if(ivideo->revision_id == 0) { /* 40 *and* 20? */ in sisfb_post_xgi()
5260 reg = (ivideo->chip == XGI_40) ? 0x20 : 0x00; in sisfb_post_xgi()
5263 if(ivideo->chip == XGI_20) { in sisfb_post_xgi()
5343 if(ivideo->revision_id == 2) { in sisfb_post_xgi()
5409 dev_warn(&pdev->dev, in sisfb_post_xgi()
5418 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5424 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5433 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5434 index = (ivideo->chip == XGI_20) ? 0x31a : 0x3a6; in sisfb_post_xgi()
5462 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5463 index = (ivideo->chip == XGI_20) ? 0x35a : 0x3e6; in sisfb_post_xgi()
5490 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5500 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5501 index = (ivideo->chip == XGI_20) ? 0x45a : 0x4e6; in sisfb_post_xgi()
5518 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5530 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5540 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5548 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5560 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5561 if( (ivideo->revision_id == 1) || in sisfb_post_xgi()
5562 (ivideo->revision_id == 2) ) { in sisfb_post_xgi()
5573 if(ivideo->chip == XGI_20) { in sisfb_post_xgi()
5581 if((ivideo->chip == XGI_20) || in sisfb_post_xgi()
5582 (ivideo->revision_id == 1) || in sisfb_post_xgi()
5583 (ivideo->revision_id == 2)) { in sisfb_post_xgi()
5585 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5608 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5615 if((ivideo->chip == XGI_20) || in sisfb_post_xgi()
5616 (ivideo->revision_id == 2)) { in sisfb_post_xgi()
5623 if((ivideo->chip == XGI_20) || (bios[0x1cb] != 0x0c)) { in sisfb_post_xgi()
5628 if((ivideo->chip == XGI_20) || in sisfb_post_xgi()
5629 (ivideo->revision_id == 2)) { in sisfb_post_xgi()
5634 } else if((ivideo->chip == XGI_40) && (bios[0x1cb] == 0x0c)) { in sisfb_post_xgi()
5641 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5643 index = (ivideo->chip == XGI_20) ? 0x4b2 : 0x53e; in sisfb_post_xgi()
5650 SiS_SetReg(SISSR, 0x19, ((ivideo->chip == XGI_20) ? 0x02 : 0x01)); in sisfb_post_xgi()
5667 if((ivideo->chip == XGI_40) && in sisfb_post_xgi()
5668 ((ivideo->revision_id == 1) || in sisfb_post_xgi()
5669 (ivideo->revision_id == 2))) { in sisfb_post_xgi()
5684 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5691 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5694 if((ivideo->chip == XGI_40) && (ivideo->revision_id == 2)) { in sisfb_post_xgi()
5701 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5709 if((ivideo->chip == XGI_40) && (bios[0x1cb] != 0x0c)) { in sisfb_post_xgi()
5720 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5725 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5733 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5741 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5753 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5760 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5766 if((v1 & 0x40) && (v2 & regd) && ivideo->haveXGIROM) { in sisfb_post_xgi()
5775 ivideo->SiS_Pr.SiS_UseOEM = false; in sisfb_post_xgi()
5776 SiS_SetEnableDstn(&ivideo->SiS_Pr, false); in sisfb_post_xgi()
5777 SiS_SetEnableFstn(&ivideo->SiS_Pr, false); in sisfb_post_xgi()
5778 ivideo->curFSTN = ivideo->curDSTN = 0; in sisfb_post_xgi()
5779 ivideo->SiS_Pr.VideoMemorySize = 8 << 20; in sisfb_post_xgi()
5780 SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80); in sisfb_post_xgi()
5784 /* Disable read-cache */ in sisfb_post_xgi()
5787 /* Enable read-cache */ in sisfb_post_xgi()
5791 dev_err(&pdev->dev, in sisfb_post_xgi()
5799 printk(KERN_DEBUG "-----------------\n"); in sisfb_post_xgi()
5808 printk(KERN_DEBUG "-----------------\n"); in sisfb_post_xgi()
5812 if(ivideo->chip == XGI_20) { in sisfb_post_xgi()
5824 ivideo->SiS_Pr.SiS_UseOEM = false; in sisfb_post_xgi()
5825 SiS_SetEnableDstn(&ivideo->SiS_Pr, false); in sisfb_post_xgi()
5826 SiS_SetEnableFstn(&ivideo->SiS_Pr, false); in sisfb_post_xgi()
5827 ivideo->curFSTN = ivideo->curDSTN = 0; in sisfb_post_xgi()
5828 SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80); in sisfb_post_xgi()
5839 ivideo->modeprechange = 0x2e; in sisfb_post_xgi()
5841 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5857 struct sisfb_chip_info *chipinfo = &sisfb_chip_info[ent->driver_data]; in sisfb_probe()
5865 return -ENXIO; in sisfb_probe()
5871 sis_fb_info = framebuffer_alloc(sizeof(*ivideo), &pdev->dev); in sisfb_probe()
5873 return -ENOMEM; in sisfb_probe()
5875 ivideo = (struct sis_video_info *)sis_fb_info->par; in sisfb_probe()
5876 ivideo->memyselfandi = sis_fb_info; in sisfb_probe()
5878 ivideo->sisfb_id = SISFB_ID; in sisfb_probe()
5881 ivideo->cardnumber = 0; in sisfb_probe()
5884 ivideo->cardnumber = 1; in sisfb_probe()
5885 while((countvideo = countvideo->next) != NULL) in sisfb_probe()
5886 ivideo->cardnumber++; in sisfb_probe()
5889 strscpy(ivideo->myid, chipinfo->chip_name, sizeof(ivideo->myid)); in sisfb_probe()
5891 ivideo->warncount = 0; in sisfb_probe()
5892 ivideo->chip_id = pdev->device; in sisfb_probe()
5893 ivideo->chip_vendor = pdev->vendor; in sisfb_probe()
5894 ivideo->revision_id = pdev->revision; in sisfb_probe()
5895 ivideo->SiS_Pr.ChipRevision = ivideo->revision_id; in sisfb_probe()
5897 ivideo->sisvga_enabled = reg16 & 0x01; in sisfb_probe()
5898 ivideo->pcibus = pdev->bus->number; in sisfb_probe()
5899 ivideo->pcislot = PCI_SLOT(pdev->devfn); in sisfb_probe()
5900 ivideo->pcifunc = PCI_FUNC(pdev->devfn); in sisfb_probe()
5901 ivideo->subsysvendor = pdev->subsystem_vendor; in sisfb_probe()
5902 ivideo->subsysdevice = pdev->subsystem_device; in sisfb_probe()
5905 if(sisfb_mode_idx == -1) { in sisfb_probe()
5910 ivideo->chip = chipinfo->chip; in sisfb_probe()
5911 ivideo->chip_real_id = chipinfo->chip; in sisfb_probe()
5912 ivideo->sisvga_engine = chipinfo->vgaengine; in sisfb_probe()
5913 ivideo->hwcursor_size = chipinfo->hwcursor_size; in sisfb_probe()
5914 ivideo->CRT2_write_enable = chipinfo->CRT2_write_enable; in sisfb_probe()
5915 ivideo->mni = chipinfo->mni; in sisfb_probe()
5917 ivideo->detectedpdc = 0xff; in sisfb_probe()
5918 ivideo->detectedpdca = 0xff; in sisfb_probe()
5919 ivideo->detectedlcda = 0xff; in sisfb_probe()
5921 ivideo->sisfb_thismonitor.datavalid = false; in sisfb_probe()
5923 ivideo->current_base = 0; in sisfb_probe()
5925 ivideo->engineok = 0; in sisfb_probe()
5927 ivideo->sisfb_was_boot_device = 0; in sisfb_probe()
5929 if(pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW) { in sisfb_probe()
5930 if(ivideo->sisvga_enabled) in sisfb_probe()
5931 ivideo->sisfb_was_boot_device = 1; in sisfb_probe()
5940 ivideo->sisfb_parm_mem = sisfb_parm_mem; in sisfb_probe()
5941 ivideo->sisfb_accel = sisfb_accel; in sisfb_probe()
5942 ivideo->sisfb_ypan = sisfb_ypan; in sisfb_probe()
5943 ivideo->sisfb_max = sisfb_max; in sisfb_probe()
5944 ivideo->sisfb_userom = sisfb_userom; in sisfb_probe()
5945 ivideo->sisfb_useoem = sisfb_useoem; in sisfb_probe()
5946 ivideo->sisfb_mode_idx = sisfb_mode_idx; in sisfb_probe()
5947 ivideo->sisfb_parm_rate = sisfb_parm_rate; in sisfb_probe()
5948 ivideo->sisfb_crt1off = sisfb_crt1off; in sisfb_probe()
5949 ivideo->sisfb_forcecrt1 = sisfb_forcecrt1; in sisfb_probe()
5950 ivideo->sisfb_crt2type = sisfb_crt2type; in sisfb_probe()
5951 ivideo->sisfb_crt2flags = sisfb_crt2flags; in sisfb_probe()
5952 /* pdc(a), scalelcd, special timing, lvdshl handled below */ in sisfb_probe()
5953 ivideo->sisfb_dstn = sisfb_dstn; in sisfb_probe()
5954 ivideo->sisfb_fstn = sisfb_fstn; in sisfb_probe()
5955 ivideo->sisfb_tvplug = sisfb_tvplug; in sisfb_probe()
5956 ivideo->sisfb_tvstd = sisfb_tvstd; in sisfb_probe()
5957 ivideo->tvxpos = sisfb_tvxposoffset; in sisfb_probe()
5958 ivideo->tvypos = sisfb_tvyposoffset; in sisfb_probe()
5959 ivideo->sisfb_nocrt2rate = sisfb_nocrt2rate; in sisfb_probe()
5960 ivideo->refresh_rate = 0; in sisfb_probe()
5961 if(ivideo->sisfb_parm_rate != -1) { in sisfb_probe()
5962 ivideo->refresh_rate = ivideo->sisfb_parm_rate; in sisfb_probe()
5965 ivideo->SiS_Pr.UsePanelScaler = sisfb_scalelcd; in sisfb_probe()
5966 ivideo->SiS_Pr.CenterScreen = -1; in sisfb_probe()
5967 ivideo->SiS_Pr.SiS_CustomT = sisfb_specialtiming; in sisfb_probe()
5968 ivideo->SiS_Pr.LVDSHL = sisfb_lvdshl; in sisfb_probe()
5970 ivideo->SiS_Pr.SiS_Backup70xx = 0xff; in sisfb_probe()
5971 ivideo->SiS_Pr.SiS_CHOverScan = -1; in sisfb_probe()
5972 ivideo->SiS_Pr.SiS_ChSW = false; in sisfb_probe()
5973 ivideo->SiS_Pr.SiS_UseLCDA = false; in sisfb_probe()
5974 ivideo->SiS_Pr.HaveEMI = false; in sisfb_probe()
5975 ivideo->SiS_Pr.HaveEMILCD = false; in sisfb_probe()
5976 ivideo->SiS_Pr.OverruleEMI = false; in sisfb_probe()
5977 ivideo->SiS_Pr.SiS_SensibleSR11 = false; in sisfb_probe()
5978 ivideo->SiS_Pr.SiS_MyCR63 = 0x63; in sisfb_probe()
5979 ivideo->SiS_Pr.PDC = -1; in sisfb_probe()
5980 ivideo->SiS_Pr.PDCA = -1; in sisfb_probe()
5981 ivideo->SiS_Pr.DDCPortMixup = false; in sisfb_probe()
5983 if(ivideo->chip >= SIS_330) { in sisfb_probe()
5984 ivideo->SiS_Pr.SiS_MyCR63 = 0x53; in sisfb_probe()
5985 if(ivideo->chip >= SIS_661) { in sisfb_probe()
5986 ivideo->SiS_Pr.SiS_SensibleSR11 = true; in sisfb_probe()
5991 memcpy(&ivideo->default_var, &my_default_var, sizeof(my_default_var)); in sisfb_probe()
5996 if((ivideo->nbridge = sisfb_get_northbridge(ivideo->chip))) { in sisfb_probe()
5997 switch(ivideo->nbridge->device) { in sisfb_probe()
6000 ivideo->chip = SIS_730; in sisfb_probe()
6001 strcpy(ivideo->myid, "SiS 730"); in sisfb_probe()
6006 /* ivideo->chip is ok */ in sisfb_probe()
6007 strcpy(ivideo->myid, "SiS 651"); in sisfb_probe()
6010 ivideo->chip = SIS_740; in sisfb_probe()
6011 strcpy(ivideo->myid, "SiS 740"); in sisfb_probe()
6014 ivideo->chip = SIS_661; in sisfb_probe()
6015 strcpy(ivideo->myid, "SiS 661"); in sisfb_probe()
6018 ivideo->chip = SIS_741; in sisfb_probe()
6019 strcpy(ivideo->myid, "SiS 741"); in sisfb_probe()
6022 ivideo->chip = SIS_760; in sisfb_probe()
6023 strcpy(ivideo->myid, "SiS 760"); in sisfb_probe()
6026 ivideo->chip = SIS_761; in sisfb_probe()
6027 strcpy(ivideo->myid, "SiS 761"); in sisfb_probe()
6035 ivideo->SiS_Pr.ChipType = ivideo->chip; in sisfb_probe()
6037 ivideo->SiS_Pr.ivideo = (void *)ivideo; in sisfb_probe()
6040 if((ivideo->SiS_Pr.ChipType == SIS_315PRO) || in sisfb_probe()
6041 (ivideo->SiS_Pr.ChipType == SIS_315)) { in sisfb_probe()
6042 ivideo->SiS_Pr.ChipType = SIS_315H; in sisfb_probe()
6046 if(!ivideo->sisvga_enabled) { in sisfb_probe()
6048 pci_dev_put(ivideo->nbridge); in sisfb_probe()
6050 return -EIO; in sisfb_probe()
6054 ivideo->video_base = pci_resource_start(pdev, 0); in sisfb_probe()
6055 ivideo->video_size = pci_resource_len(pdev, 0); in sisfb_probe()
6056 ivideo->mmio_base = pci_resource_start(pdev, 1); in sisfb_probe()
6057 ivideo->mmio_size = pci_resource_len(pdev, 1); in sisfb_probe()
6058 ivideo->SiS_Pr.RelIO = pci_resource_start(pdev, 2) + 0x30; in sisfb_probe()
6059 ivideo->SiS_Pr.IOAddress = ivideo->vga_base = ivideo->SiS_Pr.RelIO; in sisfb_probe()
6061 SiSRegInit(&ivideo->SiS_Pr, ivideo->SiS_Pr.IOAddress); in sisfb_probe()
6065 if(ivideo->chip == SIS_630) { in sisfb_probe()
6068 if(mychswtable[i].subsysVendor == ivideo->subsysvendor && in sisfb_probe()
6069 mychswtable[i].subsysCard == ivideo->subsysdevice) { in sisfb_probe()
6070 ivideo->SiS_Pr.SiS_ChSW = true; in sisfb_probe()
6075 ivideo->lpcdev = pci_get_device(PCI_VENDOR_ID_SI, 0x0008, NULL); in sisfb_probe()
6084 if((ivideo->chip == SIS_760) && (ivideo->nbridge)) { in sisfb_probe()
6085 ivideo->lpcdev = pci_get_slot(ivideo->nbridge->bus, (2 << 3)); in sisfb_probe()
6091 if( (!ivideo->sisvga_enabled) in sisfb_probe()
6102 ivideo->modeprechange = 0x03; in sisfb_probe()
6105 ivideo->modeprechange = reg & 0x7f; in sisfb_probe()
6106 } else if(ivideo->sisvga_enabled) { in sisfb_probe()
6110 ivideo->modeprechange = readb(tt + 0x49); in sisfb_probe()
6117 ivideo->bios_abase = NULL; in sisfb_probe()
6118 ivideo->SiS_Pr.VirtualRomBase = NULL; in sisfb_probe()
6119 ivideo->SiS_Pr.UseROM = false; in sisfb_probe()
6120 ivideo->haveXGIROM = ivideo->SiS_Pr.SiS_XGIROM = false; in sisfb_probe()
6121 if(ivideo->sisfb_userom) { in sisfb_probe()
6122 ivideo->SiS_Pr.VirtualRomBase = sisfb_find_rom(pdev); in sisfb_probe()
6123 ivideo->bios_abase = ivideo->SiS_Pr.VirtualRomBase; in sisfb_probe()
6124 ivideo->SiS_Pr.UseROM = (bool)(ivideo->SiS_Pr.VirtualRomBase); in sisfb_probe()
6126 ivideo->SiS_Pr.UseROM ? "" : "not "); in sisfb_probe()
6127 if((ivideo->SiS_Pr.UseROM) && (ivideo->chip >= XGI_20)) { in sisfb_probe()
6128 ivideo->SiS_Pr.UseROM = false; in sisfb_probe()
6129 ivideo->haveXGIROM = ivideo->SiS_Pr.SiS_XGIROM = true; in sisfb_probe()
6130 if( (ivideo->revision_id == 2) && in sisfb_probe()
6131 (!(ivideo->bios_abase[0x1d1] & 0x01)) ) { in sisfb_probe()
6132 ivideo->SiS_Pr.DDCPortMixup = true; in sisfb_probe()
6140 if(ivideo->SiS_Pr.SiS_CustomT == CUT_NONE) { in sisfb_probe()
6145 if (ivideo->chip == XGI_20) { in sisfb_probe()
6150 ivideo->chip_real_id = XGI_21; in sisfb_probe()
6151 dev_info(&pdev->dev, "Z9 detected\n"); in sisfb_probe()
6157 if( (!ivideo->sisvga_enabled) in sisfb_probe()
6163 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_probe()
6164 if(ivideo->chip == SIS_300) { in sisfb_probe()
6166 ivideo->sisfb_can_post = 1; in sisfb_probe()
6172 if (ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_probe()
6175 if (ivideo->chip == XGI_20) { in sisfb_probe()
6177 ivideo->sisfb_can_post = 1; in sisfb_probe()
6178 } else if ((ivideo->chip == XGI_40) && ivideo->haveXGIROM) { in sisfb_probe()
6180 ivideo->sisfb_can_post = 1; in sisfb_probe()
6187 ret = -ENODEV; in sisfb_probe()
6194 ivideo->sisfb_card_posted = 1; in sisfb_probe()
6199 ret = -ENODEV; in sisfb_probe()
6205 if((ivideo->sisfb_mode_idx < 0) || in sisfb_probe()
6206 ((sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]) != 0xFF)) { in sisfb_probe()
6214 if(ivideo->sisvga_engine == SIS_300_VGA) in sisfb_probe()
6218 ivideo->SiS_Pr.PDC = sisfb_pdc; in sisfb_probe()
6221 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_probe()
6223 ivideo->SiS_Pr.PDCA = sisfb_pdca & 0x1f; in sisfb_probe()
6227 if(!request_mem_region(ivideo->video_base, ivideo->video_size, "sisfb FB")) { in sisfb_probe()
6229 (int)(ivideo->video_size >> 20)); in sisfb_probe()
6231 ret = -ENODEV; in sisfb_probe()
6235 if(!request_mem_region(ivideo->mmio_base, ivideo->mmio_size, "sisfb MMIO")) { in sisfb_probe()
6237 ret = -ENODEV; in sisfb_probe()
6241 ivideo->video_vbase = ioremap_wc(ivideo->video_base, ivideo->video_size); in sisfb_probe()
6242 ivideo->SiS_Pr.VideoMemoryAddress = ivideo->video_vbase; in sisfb_probe()
6243 if(!ivideo->video_vbase) { in sisfb_probe()
6245 ret = -ENODEV; in sisfb_probe()
6249 ivideo->mmio_vbase = ioremap(ivideo->mmio_base, ivideo->mmio_size); in sisfb_probe()
6250 if(!ivideo->mmio_vbase) { in sisfb_probe()
6252 ret = -ENODEV; in sisfb_probe()
6253 error_0: iounmap(ivideo->video_vbase); in sisfb_probe()
6254 error_1: release_mem_region(ivideo->video_base, ivideo->video_size); in sisfb_probe()
6255 error_2: release_mem_region(ivideo->mmio_base, ivideo->mmio_size); in sisfb_probe()
6256 error_3: vfree(ivideo->bios_abase); in sisfb_probe()
6257 pci_dev_put(ivideo->lpcdev); in sisfb_probe()
6258 pci_dev_put(ivideo->nbridge); in sisfb_probe()
6259 if(!ivideo->sisvga_enabled) in sisfb_probe()
6266 ivideo->video_base, (unsigned long)ivideo->video_vbase, ivideo->video_size / 1024); in sisfb_probe()
6268 if(ivideo->video_offset) { in sisfb_probe()
6270 ivideo->video_offset / 1024); in sisfb_probe()
6274 ivideo->mmio_base, (unsigned long)ivideo->mmio_vbase, ivideo->mmio_size / 1024); in sisfb_probe()
6278 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_probe()
6279 ivideo->cmdQueueSize = TURBO_QUEUE_AREA_SIZE; in sisfb_probe()
6281 if(ivideo->chip == XGI_20) { in sisfb_probe()
6282 ivideo->cmdQueueSize = COMMAND_QUEUE_AREA_SIZE_Z7; in sisfb_probe()
6284 ivideo->cmdQueueSize = COMMAND_QUEUE_AREA_SIZE; in sisfb_probe()
6289 * now done after the first mode-switch (if the in sisfb_probe()
6294 ivideo->hwcursor_vbase = ivideo->video_vbase in sisfb_probe()
6295 + ivideo->video_size in sisfb_probe()
6296 - ivideo->cmdQueueSize in sisfb_probe()
6297 - ivideo->hwcursor_size; in sisfb_probe()
6298 ivideo->caps |= HW_CURSOR_CAP; in sisfb_probe()
6301 if((ivideo->havenoheap = sisfb_heap_init(ivideo))) { in sisfb_probe()
6306 ivideo->SiS_Pr.VideoMemoryAddress += ivideo->video_offset; in sisfb_probe()
6307 ivideo->SiS_Pr.VideoMemorySize = ivideo->sisfb_mem; in sisfb_probe()
6309 ivideo->vbflags = 0; in sisfb_probe()
6310 ivideo->lcddefmodeidx = DEFAULT_LCDMODE; in sisfb_probe()
6311 ivideo->tvdefmodeidx = DEFAULT_TVMODE; in sisfb_probe()
6312 ivideo->defmodeidx = DEFAULT_MODE; in sisfb_probe()
6314 ivideo->newrom = 0; in sisfb_probe()
6315 if(ivideo->chip < XGI_20) { in sisfb_probe()
6316 if(ivideo->bios_abase) { in sisfb_probe()
6317 ivideo->newrom = SiSDetermineROMLayout661(&ivideo->SiS_Pr); in sisfb_probe()
6321 if((ivideo->sisfb_mode_idx < 0) || in sisfb_probe()
6322 ((sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]) != 0xFF)) { in sisfb_probe()
6328 if(ivideo->vbflags2 & VB2_VIDEOBRIDGE) { in sisfb_probe()
6332 ivideo->currentvbflags = ivideo->vbflags & (VB_VIDEOBRIDGE | TV_STANDARD); in sisfb_probe()
6335 if(ivideo->vbflags2 & VB2_VIDEOBRIDGE) { in sisfb_probe()
6336 if(ivideo->sisfb_crt2type != -1) { in sisfb_probe()
6337 if((ivideo->sisfb_crt2type == CRT2_LCD) && in sisfb_probe()
6338 (ivideo->vbflags & CRT2_LCD)) { in sisfb_probe()
6339 ivideo->currentvbflags |= CRT2_LCD; in sisfb_probe()
6340 } else if(ivideo->sisfb_crt2type != CRT2_LCD) { in sisfb_probe()
6341 ivideo->currentvbflags |= ivideo->sisfb_crt2type; in sisfb_probe()
6347 if((ivideo->sisvga_engine == SIS_300_VGA) && in sisfb_probe()
6348 (ivideo->vbflags2 & VB2_CHRONTEL)) { in sisfb_probe()
6349 if(ivideo->vbflags & CRT2_LCD) in sisfb_probe()
6350 ivideo->currentvbflags |= CRT2_LCD; in sisfb_probe()
6351 else if(ivideo->vbflags & CRT2_TV) in sisfb_probe()
6352 ivideo->currentvbflags |= CRT2_TV; in sisfb_probe()
6353 else if(ivideo->vbflags & CRT2_VGA) in sisfb_probe()
6354 ivideo->currentvbflags |= CRT2_VGA; in sisfb_probe()
6356 if(ivideo->vbflags & CRT2_TV) in sisfb_probe()
6357 ivideo->currentvbflags |= CRT2_TV; in sisfb_probe()
6358 else if(ivideo->vbflags & CRT2_LCD) in sisfb_probe()
6359 ivideo->currentvbflags |= CRT2_LCD; in sisfb_probe()
6360 else if(ivideo->vbflags & CRT2_VGA) in sisfb_probe()
6361 ivideo->currentvbflags |= CRT2_VGA; in sisfb_probe()
6366 if(ivideo->vbflags & CRT2_LCD) { in sisfb_probe()
6372 if(!ivideo->sisfb_crt1off) { in sisfb_probe()
6373 sisfb_handle_ddc(ivideo, &ivideo->sisfb_thismonitor, 0); in sisfb_probe()
6375 if((ivideo->vbflags2 & VB2_SISTMDSBRIDGE) && in sisfb_probe()
6376 (ivideo->vbflags & (CRT2_VGA | CRT2_LCD))) { in sisfb_probe()
6377 sisfb_handle_ddc(ivideo, &ivideo->sisfb_thismonitor, 1); in sisfb_probe()
6381 if(ivideo->sisfb_mode_idx >= 0) { in sisfb_probe()
6382 int bu = ivideo->sisfb_mode_idx; in sisfb_probe()
6383 ivideo->sisfb_mode_idx = sisfb_validate_mode(ivideo, in sisfb_probe()
6384 ivideo->sisfb_mode_idx, ivideo->currentvbflags); in sisfb_probe()
6385 if(bu != ivideo->sisfb_mode_idx) { in sisfb_probe()
6393 if(ivideo->sisfb_mode_idx < 0) { in sisfb_probe()
6394 switch(ivideo->currentvbflags & VB_DISPTYPE_DISP2) { in sisfb_probe()
6396 ivideo->sisfb_mode_idx = ivideo->lcddefmodeidx; in sisfb_probe()
6399 ivideo->sisfb_mode_idx = ivideo->tvdefmodeidx; in sisfb_probe()
6402 ivideo->sisfb_mode_idx = ivideo->defmodeidx; in sisfb_probe()
6407 ivideo->mode_no = sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]; in sisfb_probe()
6409 if(ivideo->refresh_rate != 0) { in sisfb_probe()
6410 sisfb_search_refresh_rate(ivideo, ivideo->refresh_rate, in sisfb_probe()
6411 ivideo->sisfb_mode_idx); in sisfb_probe()
6414 if(ivideo->rate_idx == 0) { in sisfb_probe()
6415 ivideo->rate_idx = sisbios_mode[ivideo->sisfb_mode_idx].rate_idx; in sisfb_probe()
6416 ivideo->refresh_rate = 60; in sisfb_probe()
6419 if(ivideo->sisfb_thismonitor.datavalid) { in sisfb_probe()
6420 if(!sisfb_verify_rate(ivideo, &ivideo->sisfb_thismonitor, in sisfb_probe()
6421 ivideo->sisfb_mode_idx, in sisfb_probe()
6422 ivideo->rate_idx, in sisfb_probe()
6423 ivideo->refresh_rate)) { in sisfb_probe()
6429 ivideo->video_bpp = sisbios_mode[ivideo->sisfb_mode_idx].bpp; in sisfb_probe()
6430 ivideo->video_width = sisbios_mode[ivideo->sisfb_mode_idx].xres; in sisfb_probe()
6431 ivideo->video_height = sisbios_mode[ivideo->sisfb_mode_idx].yres; in sisfb_probe()
6436 ivideo->video_width, ivideo->video_height, ivideo->video_bpp, in sisfb_probe()
6437 ivideo->refresh_rate); in sisfb_probe()
6440 ivideo->default_var.xres = ivideo->default_var.xres_virtual = ivideo->video_width; in sisfb_probe()
6441 ivideo->default_var.yres = ivideo->default_var.yres_virtual = ivideo->video_height; in sisfb_probe()
6442 ivideo->default_var.bits_per_pixel = ivideo->video_bpp; in sisfb_probe()
6444 sisfb_bpp_to_var(ivideo, &ivideo->default_var); in sisfb_probe()
6446 ivideo->default_var.pixclock = (u32) (1000000000 / in sisfb_probe()
6447 sisfb_mode_rate_to_dclock(&ivideo->SiS_Pr, ivideo->mode_no, ivideo->rate_idx)); in sisfb_probe()
6449 if(sisfb_mode_rate_to_ddata(&ivideo->SiS_Pr, ivideo->mode_no, in sisfb_probe()
6450 ivideo->rate_idx, &ivideo->default_var)) { in sisfb_probe()
6451 if((ivideo->default_var.vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) { in sisfb_probe()
6452 ivideo->default_var.pixclock <<= 1; in sisfb_probe()
6456 if(ivideo->sisfb_ypan) { in sisfb_probe()
6458 ivideo->default_var.yres_virtual = in sisfb_probe()
6459 sisfb_calc_maxyres(ivideo, &ivideo->default_var); in sisfb_probe()
6460 if(ivideo->default_var.yres_virtual < ivideo->default_var.yres) { in sisfb_probe()
6461 ivideo->default_var.yres_virtual = ivideo->default_var.yres; in sisfb_probe()
6465 sisfb_calc_pitch(ivideo, &ivideo->default_var); in sisfb_probe()
6467 ivideo->accel = 0; in sisfb_probe()
6468 if(ivideo->sisfb_accel) { in sisfb_probe()
6469 ivideo->accel = -1; in sisfb_probe()
6471 ivideo->default_var.accel_flags |= FB_ACCELF_TEXT; in sisfb_probe()
6477 sis_fb_info->flags = FBINFO_HWACCEL_YPAN | in sisfb_probe()
6481 ((ivideo->accel) ? 0 : FBINFO_HWACCEL_DISABLED); in sisfb_probe()
6483 sis_fb_info->var = ivideo->default_var; in sisfb_probe()
6484 sis_fb_info->fix = ivideo->sisfb_fix; in sisfb_probe()
6485 sis_fb_info->screen_base = ivideo->video_vbase + ivideo->video_offset; in sisfb_probe()
6486 sis_fb_info->fbops = &sisfb_ops; in sisfb_probe()
6487 sis_fb_info->pseudo_palette = ivideo->pseudo_palette; in sisfb_probe()
6489 fb_alloc_cmap(&sis_fb_info->cmap, 256 , 0); in sisfb_probe()
6491 printk(KERN_DEBUG "sisfb: Initial vbflags 0x%x\n", (int)ivideo->vbflags); in sisfb_probe()
6493 ivideo->wc_cookie = arch_phys_wc_add(ivideo->video_base, in sisfb_probe()
6494 ivideo->video_size); in sisfb_probe()
6497 ret = -EINVAL; in sisfb_probe()
6498 iounmap(ivideo->mmio_vbase); in sisfb_probe()
6502 ivideo->registered = 1; in sisfb_probe()
6505 ivideo->next = card_list; in sisfb_probe()
6508 printk(KERN_INFO "sisfb: 2D acceleration is %s, y-panning %s\n", in sisfb_probe()
6509 ivideo->sisfb_accel ? "enabled" : "disabled", in sisfb_probe()
6510 ivideo->sisfb_ypan ? in sisfb_probe()
6511 (ivideo->sisfb_max ? "enabled (auto-max)" : in sisfb_probe()
6512 "enabled (no auto-max)") : in sisfb_probe()
6517 ivideo->myid, VER_MAJOR, VER_MINOR, VER_LEVEL); in sisfb_probe()
6519 printk(KERN_INFO "sisfb: Copyright (C) 2001-2005 Thomas Winischhofer\n"); in sisfb_probe()
6533 struct fb_info *sis_fb_info = ivideo->memyselfandi; in sisfb_remove()
6534 int registered = ivideo->registered; in sisfb_remove()
6535 int modechanged = ivideo->modechanged; in sisfb_remove()
6538 iounmap(ivideo->mmio_vbase); in sisfb_remove()
6539 iounmap(ivideo->video_vbase); in sisfb_remove()
6542 release_mem_region(ivideo->video_base, ivideo->video_size); in sisfb_remove()
6543 release_mem_region(ivideo->mmio_base, ivideo->mmio_size); in sisfb_remove()
6545 vfree(ivideo->bios_abase); in sisfb_remove()
6547 pci_dev_put(ivideo->lpcdev); in sisfb_remove()
6549 pci_dev_put(ivideo->nbridge); in sisfb_remove()
6551 arch_phys_wc_del(ivideo->wc_cookie); in sisfb_remove()
6556 if(!ivideo->sisvga_enabled) in sisfb_remove()
6560 if(ivideo->registered) { in sisfb_remove()
6593 return -ENODEV; in sisfb_init()
6597 return -ENODEV; in sisfb_init()
6615 static int vesa = -1;
6620 static int forcecrt1 = -1;
6621 static int pdc = -1; variable
6622 static int pdc1 = -1;
6623 static int noaccel = -1;
6624 static int noypan = -1;
6625 static int nomax = -1;
6626 static int userom = -1;
6627 static int useoem = -1;
6630 static int scalelcd = -1;
6632 static int lvdshl = -1;
6659 else if(vesa != -1) in sisfb_init_module()
6688 if(userom != -1) in sisfb_init_module()
6691 if(useoem != -1) in sisfb_init_module()
6694 if(pdc != -1) in sisfb_init_module()
6695 sisfb_pdc = (pdc & 0x7f); in sisfb_init_module()
6697 if(pdc1 != -1) in sisfb_init_module()
6745 module_param(pdc, int, 0);
6771 "\nIf set to anything other than 0, y-panning will be disabled and scrolling\n"
6775 "\nIf y-panning is enabled, sisfb will by default use the entire available video\n"
6783 "eg. 1024x768x16. Other formats supported include XxY-Depth and\n"
6784 "XxY-Depth@Rate. If the parameter is only one (decimal or hexadecimal)\n"
6793 "If the mode is specified in the format XxY-Depth@Rate, this parameter\n"
6817 MODULE_PARM_DESC(pdc,
6827 "\nThis is same as pdc, but for LCD-via CRT1. Hence, this is for the 315/330/340\n"
6828 "series only. (default: autodetected if LCD is in LCD-via-CRT1 mode during\n"
6829 "startup) - Note: currently, this has no effect because LCD-via-CRT1 is not\n"
6844 "\nRelocate TV output horizontally. Possible parameters: -32 through 32.\n"
6848 "\nRelocate TV output vertically. Possible parameters: -32 through 32.\n"
6858 "\nSet this to 1 in order to reset (POST) the card on non-x86 machines where\n"
6864 "some non-x86 architectures where the memory auto detection fails. Only\n"
6865 "relevant if resetcard is set, too. SiS300/305 only. Default: [auto-detect]\n");