Lines Matching refs:ivideo

68 static void sisfb_handle_command(struct sis_video_info *ivideo,
345 static void sisfb_detect_custom_timing(struct sis_video_info *ivideo) in sisfb_detect_custom_timing() argument
353 if(ivideo->SiS_Pr.UseROM) { in sisfb_detect_custom_timing()
354 biosver = ivideo->SiS_Pr.VirtualRomBase + 0x06; in sisfb_detect_custom_timing()
355 biosdate = ivideo->SiS_Pr.VirtualRomBase + 0x2c; in sisfb_detect_custom_timing()
357 chksum += ivideo->SiS_Pr.VirtualRomBase[i]; in sisfb_detect_custom_timing()
362 if( (mycustomttable[i].chipID == ivideo->chip) && in sisfb_detect_custom_timing()
364 (ivideo->SiS_Pr.UseROM && in sisfb_detect_custom_timing()
368 (ivideo->SiS_Pr.UseROM && in sisfb_detect_custom_timing()
372 (ivideo->SiS_Pr.UseROM && in sisfb_detect_custom_timing()
374 (mycustomttable[i].pcisubsysvendor == ivideo->subsysvendor) && in sisfb_detect_custom_timing()
375 (mycustomttable[i].pcisubsyscard == ivideo->subsysdevice) ) { in sisfb_detect_custom_timing()
379 if(ivideo->SiS_Pr.UseROM) { in sisfb_detect_custom_timing()
380 if(ivideo->SiS_Pr.VirtualRomBase[mycustomttable[i].biosFootprintAddr[j]] != in sisfb_detect_custom_timing()
389 ivideo->SiS_Pr.SiS_CustomT = mycustomttable[i].SpecialID; in sisfb_detect_custom_timing()
503 static void sisfb_handle_ddc(struct sis_video_info *ivideo, in sisfb_handle_ddc() argument
512 if(ivideo->vbflags & CRT2_LCD) realcrtno = 1; in sisfb_handle_ddc()
513 else if(ivideo->vbflags & CRT2_VGA) realcrtno = 2; in sisfb_handle_ddc()
517 if((ivideo->sisfb_crt1off) && (!crtno)) in sisfb_handle_ddc()
520 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, ivideo->sisvga_engine, in sisfb_handle_ddc()
521 realcrtno, 0, &buffer[0], ivideo->vbflags2); in sisfb_handle_ddc()
536 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, ivideo->sisvga_engine, in sisfb_handle_ddc()
537 realcrtno, 1, &buffer[0], ivideo->vbflags2); in sisfb_handle_ddc()
559 sisfb_verify_rate(struct sis_video_info *ivideo, struct sisfb_monitor *monitor, in sisfb_verify_rate() argument
572 switch(sisbios_mode[mode_idx].mode_no[ivideo->mni]) { in sisfb_verify_rate()
586 if(ivideo->sisvga_engine == SIS_315_VGA) return true; in sisfb_verify_rate()
595 if(sisfb_gettotalfrommode(&ivideo->SiS_Pr, in sisfb_verify_rate()
596 sisbios_mode[mode_idx].mode_no[ivideo->mni], in sisfb_verify_rate()
613 sisfb_validate_mode(struct sis_video_info *ivideo, int myindex, u32 vbflags) in sisfb_validate_mode() argument
618 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_validate_mode()
624 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_validate_mode()
635 xres = ivideo->lcdxres; yres = ivideo->lcdyres; in sisfb_validate_mode()
637 if((ivideo->SiS_Pr.SiS_CustomT != CUT_PANEL848) && in sisfb_validate_mode()
638 (ivideo->SiS_Pr.SiS_CustomT != CUT_PANEL856)) { in sisfb_validate_mode()
645 if(ivideo->sisfb_fstn) { in sisfb_validate_mode()
657 if(SiS_GetModeID_LCD(ivideo->sisvga_engine, vbflags, sisbios_mode[myindex].xres, in sisfb_validate_mode()
658 sisbios_mode[myindex].yres, 0, ivideo->sisfb_fstn, in sisfb_validate_mode()
659 ivideo->SiS_Pr.SiS_CustomT, xres, yres, ivideo->vbflags2) < 0x14) { in sisfb_validate_mode()
665 if(SiS_GetModeID_TV(ivideo->sisvga_engine, vbflags, sisbios_mode[myindex].xres, in sisfb_validate_mode()
666 sisbios_mode[myindex].yres, 0, ivideo->vbflags2) < 0x14) { in sisfb_validate_mode()
672 if(SiS_GetModeID_VGA2(ivideo->sisvga_engine, vbflags, sisbios_mode[myindex].xres, in sisfb_validate_mode()
673 sisbios_mode[myindex].yres, 0, ivideo->vbflags2) < 0x14) { in sisfb_validate_mode()
683 sisfb_search_refresh_rate(struct sis_video_info *ivideo, unsigned int rate, int mode_idx) in sisfb_search_refresh_rate() argument
689 ivideo->rate_idx = 0; in sisfb_search_refresh_rate()
693 ivideo->rate_idx = sisfb_vrate[i].idx; in sisfb_search_refresh_rate()
699 ivideo->rate_idx = sisfb_vrate[i].idx; in sisfb_search_refresh_rate()
700 ivideo->refresh_rate = sisfb_vrate[i].refresh; in sisfb_search_refresh_rate()
705 ivideo->rate_idx = sisfb_vrate[i-1].idx; in sisfb_search_refresh_rate()
706 ivideo->refresh_rate = sisfb_vrate[i-1].refresh; in sisfb_search_refresh_rate()
712 ivideo->rate_idx = sisfb_vrate[i].idx; in sisfb_search_refresh_rate()
718 if(ivideo->rate_idx > 0) { in sisfb_search_refresh_rate()
719 return ivideo->rate_idx; in sisfb_search_refresh_rate()
728 sisfb_bridgeisslave(struct sis_video_info *ivideo) in sisfb_bridgeisslave() argument
732 if(!(ivideo->vbflags2 & VB2_VIDEOBRIDGE)) in sisfb_bridgeisslave()
736 if( ((ivideo->sisvga_engine == SIS_300_VGA) && (P1_00 & 0xa0) == 0x20) || in sisfb_bridgeisslave()
737 ((ivideo->sisvga_engine == SIS_315_VGA) && (P1_00 & 0x50) == 0x10) ) { in sisfb_bridgeisslave()
745 sisfballowretracecrt1(struct sis_video_info *ivideo) in sisfballowretracecrt1() argument
761 sisfbcheckvretracecrt1(struct sis_video_info *ivideo) in sisfbcheckvretracecrt1() argument
763 if(!sisfballowretracecrt1(ivideo)) in sisfbcheckvretracecrt1()
773 sisfbwaitretracecrt1(struct sis_video_info *ivideo) in sisfbwaitretracecrt1() argument
777 if(!sisfballowretracecrt1(ivideo)) in sisfbwaitretracecrt1()
787 sisfbcheckvretracecrt2(struct sis_video_info *ivideo) in sisfbcheckvretracecrt2() argument
791 switch(ivideo->sisvga_engine) { in sisfbcheckvretracecrt2()
805 sisfb_CheckVBRetrace(struct sis_video_info *ivideo) in sisfb_CheckVBRetrace() argument
807 if(ivideo->currentvbflags & VB_DISPTYPE_DISP2) { in sisfb_CheckVBRetrace()
808 if(!sisfb_bridgeisslave(ivideo)) { in sisfb_CheckVBRetrace()
809 return sisfbcheckvretracecrt2(ivideo); in sisfb_CheckVBRetrace()
812 return sisfbcheckvretracecrt1(ivideo); in sisfb_CheckVBRetrace()
816 sisfb_setupvbblankflags(struct sis_video_info *ivideo, u32 *vcount, u32 *hcount) in sisfb_setupvbblankflags() argument
823 if((ivideo->currentvbflags & VB_DISPTYPE_DISP2) && (!(sisfb_bridgeisslave(ivideo)))) { in sisfb_setupvbblankflags()
830 switch(ivideo->sisvga_engine) { in sisfb_setupvbblankflags()
845 } else if(sisfballowretracecrt1(ivideo)) { in sisfb_setupvbblankflags()
866 sisfb_myblank(struct sis_video_info *ivideo, int blank) in sisfb_myblank() argument
921 if(ivideo->currentvbflags & VB_DISPTYPE_CRT1) { in sisfb_myblank()
923 if( (!ivideo->sisfb_thismonitor.datavalid) || in sisfb_myblank()
924 ((ivideo->sisfb_thismonitor.datavalid) && in sisfb_myblank()
925 (ivideo->sisfb_thismonitor.feature & 0xe0))) { in sisfb_myblank()
927 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_myblank()
928 SiS_SetRegANDOR(SISCR, ivideo->SiS_Pr.SiS_MyCR63, 0xbf, cr63); in sisfb_myblank()
931 if(!(sisfb_bridgeisslave(ivideo))) { in sisfb_myblank()
939 if(ivideo->currentvbflags & CRT2_LCD) { in sisfb_myblank()
941 if(ivideo->vbflags2 & VB2_SISLVDSBRIDGE) { in sisfb_myblank()
943 SiS_SiS30xBLOn(&ivideo->SiS_Pr); in sisfb_myblank()
945 SiS_SiS30xBLOff(&ivideo->SiS_Pr); in sisfb_myblank()
947 } else if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_myblank()
949 if(ivideo->vbflags2 & VB2_CHRONTEL) { in sisfb_myblank()
951 SiS_Chrontel701xBLOn(&ivideo->SiS_Pr); in sisfb_myblank()
953 SiS_Chrontel701xBLOff(&ivideo->SiS_Pr); in sisfb_myblank()
959 if(((ivideo->sisvga_engine == SIS_300_VGA) && in sisfb_myblank()
960 (ivideo->vbflags2 & (VB2_301|VB2_30xBDH|VB2_LVDS))) || in sisfb_myblank()
961 ((ivideo->sisvga_engine == SIS_315_VGA) && in sisfb_myblank()
962 ((ivideo->vbflags2 & (VB2_LVDS | VB2_CHRONTEL)) == VB2_LVDS))) { in sisfb_myblank()
966 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_myblank()
967 if((ivideo->vbflags2 & VB2_30xB) && in sisfb_myblank()
968 (!(ivideo->vbflags2 & VB2_30xBDH))) { in sisfb_myblank()
971 } else if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_myblank()
972 if((ivideo->vbflags2 & VB2_30xB) && in sisfb_myblank()
973 (!(ivideo->vbflags2 & VB2_30xBDH))) { in sisfb_myblank()
978 } else if(ivideo->currentvbflags & CRT2_VGA) { in sisfb_myblank()
980 if(ivideo->vbflags2 & VB2_30xB) { in sisfb_myblank()
995 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo; in sisfb_read_nbridge_pci_dword() local
998 pci_read_config_dword(ivideo->nbridge, reg, &val); in sisfb_read_nbridge_pci_dword()
1005 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo; in sisfb_write_nbridge_pci_dword() local
1007 pci_write_config_dword(ivideo->nbridge, reg, (u32)val); in sisfb_write_nbridge_pci_dword()
1013 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo; in sisfb_read_lpc_pci_dword() local
1016 if(!ivideo->lpcdev) return 0; in sisfb_read_lpc_pci_dword()
1018 pci_read_config_dword(ivideo->lpcdev, reg, &val); in sisfb_read_lpc_pci_dword()
1027 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo; in sisfb_write_nbridge_pci_byte() local
1029 pci_write_config_byte(ivideo->nbridge, reg, (u8)val); in sisfb_write_nbridge_pci_byte()
1035 struct sis_video_info *ivideo = (struct sis_video_info *)SiS_Pr->ivideo; in sisfb_read_mio_pci_word() local
1038 if(!ivideo->lpcdev) return 0; in sisfb_read_mio_pci_word()
1040 pci_read_config_word(ivideo->lpcdev, reg, &val); in sisfb_read_mio_pci_word()
1054 sisfb_set_vparms(struct sis_video_info *ivideo) in sisfb_set_vparms() argument
1056 switch(ivideo->video_bpp) { in sisfb_set_vparms()
1058 ivideo->DstColor = 0x0000; in sisfb_set_vparms()
1059 ivideo->SiS310_AccelDepth = 0x00000000; in sisfb_set_vparms()
1060 ivideo->video_cmap_len = 256; in sisfb_set_vparms()
1063 ivideo->DstColor = 0x8000; in sisfb_set_vparms()
1064 ivideo->SiS310_AccelDepth = 0x00010000; in sisfb_set_vparms()
1065 ivideo->video_cmap_len = 16; in sisfb_set_vparms()
1068 ivideo->DstColor = 0xC000; in sisfb_set_vparms()
1069 ivideo->SiS310_AccelDepth = 0x00020000; in sisfb_set_vparms()
1070 ivideo->video_cmap_len = 16; in sisfb_set_vparms()
1073 ivideo->video_cmap_len = 16; in sisfb_set_vparms()
1074 printk(KERN_ERR "sisfb: Unsupported depth %d", ivideo->video_bpp); in sisfb_set_vparms()
1075 ivideo->accel = 0; in sisfb_set_vparms()
1080 sisfb_calc_maxyres(struct sis_video_info *ivideo, struct fb_var_screeninfo *var) in sisfb_calc_maxyres() argument
1082 int maxyres = ivideo->sisfb_mem / (var->xres_virtual * (var->bits_per_pixel >> 3)); in sisfb_calc_maxyres()
1090 sisfb_calc_pitch(struct sis_video_info *ivideo, struct fb_var_screeninfo *var) in sisfb_calc_pitch() argument
1092 ivideo->video_linelength = var->xres_virtual * (var->bits_per_pixel >> 3); in sisfb_calc_pitch()
1093 ivideo->scrnpitchCRT1 = ivideo->video_linelength; in sisfb_calc_pitch()
1094 if(!(ivideo->currentvbflags & CRT1_LCDA)) { in sisfb_calc_pitch()
1096 ivideo->scrnpitchCRT1 <<= 1; in sisfb_calc_pitch()
1102 sisfb_set_pitch(struct sis_video_info *ivideo) in sisfb_set_pitch() argument
1105 unsigned short HDisplay1 = ivideo->scrnpitchCRT1 >> 3; in sisfb_set_pitch()
1106 unsigned short HDisplay2 = ivideo->video_linelength >> 3; in sisfb_set_pitch()
1108 if(sisfb_bridgeisslave(ivideo)) isslavemode = true; in sisfb_set_pitch()
1111 if((ivideo->currentvbflags & VB_DISPTYPE_DISP1) || (isslavemode)) { in sisfb_set_pitch()
1117 if((ivideo->currentvbflags & VB_DISPTYPE_DISP2) && (!isslavemode)) { in sisfb_set_pitch()
1118 SiS_SetRegOR(SISPART1, ivideo->CRT2_write_enable, 0x01); in sisfb_set_pitch()
1125 sisfb_bpp_to_var(struct sis_video_info *ivideo, struct fb_var_screeninfo *var) in sisfb_bpp_to_var() argument
1127 ivideo->video_cmap_len = sisfb_get_cmap_len(var); in sisfb_bpp_to_var()
1158 sisfb_set_mode(struct sis_video_info *ivideo, int clrscrn) in sisfb_set_mode() argument
1160 unsigned short modeno = ivideo->mode_no; in sisfb_set_mode()
1167 sisfb_pre_setmode(ivideo); in sisfb_set_mode()
1169 if(!SiSSetMode(&ivideo->SiS_Pr, modeno)) { in sisfb_set_mode()
1170 printk(KERN_ERR "sisfb: Setting mode[0x%x] failed\n", ivideo->mode_no); in sisfb_set_mode()
1176 sisfb_post_setmode(ivideo); in sisfb_set_mode()
1185 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_do_set_var() local
1217 ivideo->refresh_rate = (unsigned int) (hrate * 2 / vtotal); in sisfb_do_set_var()
1219 ivideo->refresh_rate = 60; in sisfb_do_set_var()
1222 old_mode = ivideo->sisfb_mode_idx; in sisfb_do_set_var()
1223 ivideo->sisfb_mode_idx = 0; in sisfb_do_set_var()
1225 while( (sisbios_mode[ivideo->sisfb_mode_idx].mode_no[0] != 0) && in sisfb_do_set_var()
1226 (sisbios_mode[ivideo->sisfb_mode_idx].xres <= var->xres) ) { in sisfb_do_set_var()
1227 if( (sisbios_mode[ivideo->sisfb_mode_idx].xres == var->xres) && in sisfb_do_set_var()
1228 (sisbios_mode[ivideo->sisfb_mode_idx].yres == var->yres) && in sisfb_do_set_var()
1229 (sisbios_mode[ivideo->sisfb_mode_idx].bpp == var->bits_per_pixel)) { in sisfb_do_set_var()
1230 ivideo->mode_no = sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]; in sisfb_do_set_var()
1234 ivideo->sisfb_mode_idx++; in sisfb_do_set_var()
1238 ivideo->sisfb_mode_idx = sisfb_validate_mode(ivideo, in sisfb_do_set_var()
1239 ivideo->sisfb_mode_idx, ivideo->currentvbflags); in sisfb_do_set_var()
1241 ivideo->sisfb_mode_idx = -1; in sisfb_do_set_var()
1244 if(ivideo->sisfb_mode_idx < 0) { in sisfb_do_set_var()
1247 ivideo->sisfb_mode_idx = old_mode; in sisfb_do_set_var()
1251 ivideo->mode_no = sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]; in sisfb_do_set_var()
1253 if(sisfb_search_refresh_rate(ivideo, ivideo->refresh_rate, ivideo->sisfb_mode_idx) == 0) { in sisfb_do_set_var()
1254 ivideo->rate_idx = sisbios_mode[ivideo->sisfb_mode_idx].rate_idx; in sisfb_do_set_var()
1255 ivideo->refresh_rate = 60; in sisfb_do_set_var()
1262 ivideo->accel = 0; in sisfb_do_set_var()
1271 if(!(info->flags & FBINFO_HWACCEL_DISABLED)) ivideo->accel = -1; in sisfb_do_set_var()
1273 if(var->accel_flags & FB_ACCELF_TEXT) ivideo->accel = -1; in sisfb_do_set_var()
1276 if((ret = sisfb_set_mode(ivideo, 1))) { in sisfb_do_set_var()
1280 ivideo->video_bpp = sisbios_mode[ivideo->sisfb_mode_idx].bpp; in sisfb_do_set_var()
1281 ivideo->video_width = sisbios_mode[ivideo->sisfb_mode_idx].xres; in sisfb_do_set_var()
1282 ivideo->video_height = sisbios_mode[ivideo->sisfb_mode_idx].yres; in sisfb_do_set_var()
1284 sisfb_calc_pitch(ivideo, var); in sisfb_do_set_var()
1285 sisfb_set_pitch(ivideo); in sisfb_do_set_var()
1287 sisfb_set_vparms(ivideo); in sisfb_do_set_var()
1289 ivideo->current_width = ivideo->video_width; in sisfb_do_set_var()
1290 ivideo->current_height = ivideo->video_height; in sisfb_do_set_var()
1291 ivideo->current_bpp = ivideo->video_bpp; in sisfb_do_set_var()
1292 ivideo->current_htotal = htotal; in sisfb_do_set_var()
1293 ivideo->current_vtotal = vtotal; in sisfb_do_set_var()
1294 ivideo->current_linelength = ivideo->video_linelength; in sisfb_do_set_var()
1295 ivideo->current_pixclock = var->pixclock; in sisfb_do_set_var()
1296 ivideo->current_refresh_rate = ivideo->refresh_rate; in sisfb_do_set_var()
1297 ivideo->sisfb_lastrates[ivideo->mode_no] = ivideo->refresh_rate; in sisfb_do_set_var()
1304 sisfb_set_base_CRT1(struct sis_video_info *ivideo, unsigned int base) in sisfb_set_base_CRT1() argument
1311 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_set_base_CRT1()
1317 sisfb_set_base_CRT2(struct sis_video_info *ivideo, unsigned int base) in sisfb_set_base_CRT2() argument
1319 if(ivideo->currentvbflags & VB_DISPTYPE_DISP2) { in sisfb_set_base_CRT2()
1320 SiS_SetRegOR(SISPART1, ivideo->CRT2_write_enable, 0x01); in sisfb_set_base_CRT2()
1324 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_set_base_CRT2()
1331 sisfb_pan_var(struct sis_video_info *ivideo, struct fb_info *info, in sisfb_pan_var() argument
1334 ivideo->current_base = var->yoffset * info->var.xres_virtual in sisfb_pan_var()
1342 ivideo->current_base >>= 1; in sisfb_pan_var()
1346 ivideo->current_base >>= 2; in sisfb_pan_var()
1350 ivideo->current_base += (ivideo->video_offset >> 2); in sisfb_pan_var()
1352 sisfb_set_base_CRT1(ivideo, ivideo->current_base); in sisfb_pan_var()
1353 sisfb_set_base_CRT2(ivideo, ivideo->current_base); in sisfb_pan_var()
1374 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_setcolreg() local
1385 if(ivideo->currentvbflags & VB_DISPTYPE_DISP2) { in sisfb_setcolreg()
1431 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_check_var() local
1467 if((tidx = sisfb_validate_mode(ivideo, search_idx, in sisfb_check_var()
1468 ivideo->currentvbflags)) > 0) { in sisfb_check_var()
1483 if((tidx = sisfb_validate_mode(ivideo,search_idx, in sisfb_check_var()
1484 ivideo->currentvbflags)) > 0) { in sisfb_check_var()
1509 if( ((ivideo->vbflags2 & VB2_LVDS) || in sisfb_check_var()
1510 ((ivideo->vbflags2 & VB2_30xBDH) && (ivideo->currentvbflags & CRT2_LCD))) && in sisfb_check_var()
1515 } else if( (ivideo->current_htotal == htotal) && in sisfb_check_var()
1516 (ivideo->current_vtotal == vtotal) && in sisfb_check_var()
1517 (ivideo->current_pixclock == pixclock) ) { in sisfb_check_var()
1522 } else if( ( (ivideo->current_htotal != htotal) || in sisfb_check_var()
1523 (ivideo->current_vtotal != vtotal) ) && in sisfb_check_var()
1524 (ivideo->current_pixclock == var->pixclock) ) { in sisfb_check_var()
1526 if(ivideo->sisfb_lastrates[sisbios_mode[search_idx].mode_no[ivideo->mni]]) { in sisfb_check_var()
1528 ivideo->sisfb_lastrates[sisbios_mode[search_idx].mode_no[ivideo->mni]]; in sisfb_check_var()
1529 } else if(ivideo->sisfb_parm_rate != -1) { in sisfb_check_var()
1531 refresh_rate = ivideo->sisfb_parm_rate; in sisfb_check_var()
1540 } else if(ivideo->current_refresh_rate) { in sisfb_check_var()
1541 refresh_rate = ivideo->current_refresh_rate; in sisfb_check_var()
1548 myrateindex = sisfb_search_refresh_rate(ivideo, refresh_rate, search_idx); in sisfb_check_var()
1553 var->pixclock = (u32) (1000000000 / sisfb_mode_rate_to_dclock(&ivideo->SiS_Pr, in sisfb_check_var()
1554 sisbios_mode[search_idx].mode_no[ivideo->mni], in sisfb_check_var()
1556 sisfb_mode_rate_to_ddata(&ivideo->SiS_Pr, in sisfb_check_var()
1557 sisbios_mode[search_idx].mode_no[ivideo->mni], in sisfb_check_var()
1564 if(ivideo->sisfb_thismonitor.datavalid) { in sisfb_check_var()
1565 if(!sisfb_verify_rate(ivideo, &ivideo->sisfb_thismonitor, search_idx, in sisfb_check_var()
1573 sisfb_bpp_to_var(ivideo, var); in sisfb_check_var()
1578 if(ivideo->sisfb_ypan) { in sisfb_check_var()
1579 maxyres = sisfb_calc_maxyres(ivideo, var); in sisfb_check_var()
1580 if(ivideo->sisfb_max) { in sisfb_check_var()
1621 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_pan_display() local
1631 err = sisfb_pan_var(ivideo, info, var); in sisfb_pan_display()
1644 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_blank() local
1646 return sisfb_myblank(ivideo, blank); in sisfb_blank()
1654 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_ioctl() local
1694 sisvbblank.flags = sisfb_setupvbblankflags(ivideo, &sisvbblank.vcount, &sisvbblank.hcount); in sisfb_ioctl()
1705 if(ivideo->warncount++ < 10) in sisfb_ioctl()
1709 ivideo->sisfb_infoblock.sisfb_id = SISFB_ID; in sisfb_ioctl()
1710 ivideo->sisfb_infoblock.sisfb_version = VER_MAJOR; in sisfb_ioctl()
1711 ivideo->sisfb_infoblock.sisfb_revision = VER_MINOR; in sisfb_ioctl()
1712 ivideo->sisfb_infoblock.sisfb_patchlevel = VER_LEVEL; in sisfb_ioctl()
1713 ivideo->sisfb_infoblock.chip_id = ivideo->chip_id; in sisfb_ioctl()
1714 ivideo->sisfb_infoblock.sisfb_pci_vendor = ivideo->chip_vendor; in sisfb_ioctl()
1715 ivideo->sisfb_infoblock.memory = ivideo->video_size / 1024; in sisfb_ioctl()
1716 ivideo->sisfb_infoblock.heapstart = ivideo->heapstart / 1024; in sisfb_ioctl()
1717 if(ivideo->modechanged) { in sisfb_ioctl()
1718 ivideo->sisfb_infoblock.fbvidmode = ivideo->mode_no; in sisfb_ioctl()
1720 ivideo->sisfb_infoblock.fbvidmode = ivideo->modeprechange; in sisfb_ioctl()
1722 ivideo->sisfb_infoblock.sisfb_caps = ivideo->caps; in sisfb_ioctl()
1723 ivideo->sisfb_infoblock.sisfb_tqlen = ivideo->cmdQueueSize / 1024; in sisfb_ioctl()
1724 ivideo->sisfb_infoblock.sisfb_pcibus = ivideo->pcibus; in sisfb_ioctl()
1725 ivideo->sisfb_infoblock.sisfb_pcislot = ivideo->pcislot; in sisfb_ioctl()
1726 ivideo->sisfb_infoblock.sisfb_pcifunc = ivideo->pcifunc; in sisfb_ioctl()
1727 ivideo->sisfb_infoblock.sisfb_lcdpdc = ivideo->detectedpdc; in sisfb_ioctl()
1728 ivideo->sisfb_infoblock.sisfb_lcdpdca = ivideo->detectedpdca; in sisfb_ioctl()
1729 ivideo->sisfb_infoblock.sisfb_lcda = ivideo->detectedlcda; in sisfb_ioctl()
1730 ivideo->sisfb_infoblock.sisfb_vbflags = ivideo->vbflags; in sisfb_ioctl()
1731 ivideo->sisfb_infoblock.sisfb_currentvbflags = ivideo->currentvbflags; in sisfb_ioctl()
1732 ivideo->sisfb_infoblock.sisfb_scalelcd = ivideo->SiS_Pr.UsePanelScaler; in sisfb_ioctl()
1733 ivideo->sisfb_infoblock.sisfb_specialtiming = ivideo->SiS_Pr.SiS_CustomT; in sisfb_ioctl()
1734 ivideo->sisfb_infoblock.sisfb_haveemi = ivideo->SiS_Pr.HaveEMI ? 1 : 0; in sisfb_ioctl()
1735 ivideo->sisfb_infoblock.sisfb_haveemilcd = ivideo->SiS_Pr.HaveEMILCD ? 1 : 0; in sisfb_ioctl()
1736 ivideo->sisfb_infoblock.sisfb_emi30 = ivideo->SiS_Pr.EMI_30; in sisfb_ioctl()
1737 ivideo->sisfb_infoblock.sisfb_emi31 = ivideo->SiS_Pr.EMI_31; in sisfb_ioctl()
1738 ivideo->sisfb_infoblock.sisfb_emi32 = ivideo->SiS_Pr.EMI_32; in sisfb_ioctl()
1739 ivideo->sisfb_infoblock.sisfb_emi33 = ivideo->SiS_Pr.EMI_33; in sisfb_ioctl()
1740 ivideo->sisfb_infoblock.sisfb_tvxpos = (u16)(ivideo->tvxpos + 32); in sisfb_ioctl()
1741 ivideo->sisfb_infoblock.sisfb_tvypos = (u16)(ivideo->tvypos + 32); in sisfb_ioctl()
1742 ivideo->sisfb_infoblock.sisfb_heapsize = ivideo->sisfb_heap_size / 1024; in sisfb_ioctl()
1743 ivideo->sisfb_infoblock.sisfb_videooffset = ivideo->video_offset; in sisfb_ioctl()
1744 ivideo->sisfb_infoblock.sisfb_curfstn = ivideo->curFSTN; in sisfb_ioctl()
1745 ivideo->sisfb_infoblock.sisfb_curdstn = ivideo->curDSTN; in sisfb_ioctl()
1746 ivideo->sisfb_infoblock.sisfb_vbflags2 = ivideo->vbflags2; in sisfb_ioctl()
1747 ivideo->sisfb_infoblock.sisfb_can_post = ivideo->sisfb_can_post ? 1 : 0; in sisfb_ioctl()
1748 ivideo->sisfb_infoblock.sisfb_card_posted = ivideo->sisfb_card_posted ? 1 : 0; in sisfb_ioctl()
1749 ivideo->sisfb_infoblock.sisfb_was_boot_device = ivideo->sisfb_was_boot_device ? 1 : 0; in sisfb_ioctl()
1751 if(copy_to_user((void __user *)arg, &ivideo->sisfb_infoblock, in sisfb_ioctl()
1752 sizeof(ivideo->sisfb_infoblock))) in sisfb_ioctl()
1758 if(ivideo->warncount++ < 10) in sisfb_ioctl()
1762 if(sisfb_CheckVBRetrace(ivideo)) in sisfb_ioctl()
1768 if(ivideo->warncount++ < 10) in sisfb_ioctl()
1772 if(ivideo->sisfb_max) in sisfb_ioctl()
1778 if(ivideo->warncount++ < 10) in sisfb_ioctl()
1785 ivideo->sisfb_max = (gpu32) ? 1 : 0; in sisfb_ioctl()
1792 sisfb_set_TVxposoffset(ivideo, ((int)(gpu32 >> 16)) - 32); in sisfb_ioctl()
1793 sisfb_set_TVyposoffset(ivideo, ((int)(gpu32 & 0xffff)) - 32); in sisfb_ioctl()
1797 return put_user((u32)(((ivideo->tvxpos+32)<<16)|((ivideo->tvypos+32)&0xffff)), in sisfb_ioctl()
1801 if(copy_from_user(&ivideo->sisfb_command, (void __user *)arg, in sisfb_ioctl()
1805 sisfb_handle_command(ivideo, &ivideo->sisfb_command); in sisfb_ioctl()
1807 if(copy_to_user((void __user *)arg, &ivideo->sisfb_command, in sisfb_ioctl()
1817 ivideo->sisfblocked = (gpu32) ? 1 : 0; in sisfb_ioctl()
1833 struct sis_video_info *ivideo = (struct sis_video_info *)info->par; in sisfb_get_fix() local
1837 strlcpy(fix->id, ivideo->myid, sizeof(fix->id)); in sisfb_get_fix()
1840 fix->smem_start = ivideo->video_base + ivideo->video_offset; in sisfb_get_fix()
1841 fix->smem_len = ivideo->sisfb_mem; in sisfb_get_fix()
1845 fix->visual = (ivideo->video_bpp == 8) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR; in sisfb_get_fix()
1847 fix->ypanstep = (ivideo->sisfb_ypan) ? 1 : 0; in sisfb_get_fix()
1849 fix->line_length = ivideo->video_linelength; in sisfb_get_fix()
1850 fix->mmio_start = ivideo->mmio_base; in sisfb_get_fix()
1851 fix->mmio_len = ivideo->mmio_size; in sisfb_get_fix()
1852 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_get_fix()
1854 } else if((ivideo->chip == SIS_330) || in sisfb_get_fix()
1855 (ivideo->chip == SIS_760) || in sisfb_get_fix()
1856 (ivideo->chip == SIS_761)) { in sisfb_get_fix()
1858 } else if(ivideo->chip == XGI_20) { in sisfb_get_fix()
1860 } else if(ivideo->chip >= XGI_40) { in sisfb_get_fix()
1931 static int sisfb_get_dram_size(struct sis_video_info *ivideo) in sisfb_get_dram_size() argument
1937 ivideo->video_size = 0; in sisfb_get_dram_size()
1938 ivideo->UMAsize = ivideo->LFBsize = 0; in sisfb_get_dram_size()
1940 switch(ivideo->chip) { in sisfb_get_dram_size()
1944 ivideo->video_size = ((reg & 0x3F) + 1) << 20; in sisfb_get_dram_size()
1949 if(!ivideo->nbridge) in sisfb_get_dram_size()
1951 pci_read_config_byte(ivideo->nbridge, 0x63, &reg); in sisfb_get_dram_size()
1952 ivideo->video_size = 1 << (((reg & 0x70) >> 4) + 21); in sisfb_get_dram_size()
1960 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20; in sisfb_get_dram_size()
1964 ivideo->video_size <<= 1; in sisfb_get_dram_size()
1967 ivideo->video_size += (ivideo->video_size/2); in sisfb_get_dram_size()
1972 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20; in sisfb_get_dram_size()
1973 if(reg & 0x0c) ivideo->video_size <<= 1; in sisfb_get_dram_size()
1979 ivideo->video_size = (((reg & 0x3f) + 1) << 2) << 20; in sisfb_get_dram_size()
1984 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20; in sisfb_get_dram_size()
1992 ivideo->video_size = (1 << reg) << 20; in sisfb_get_dram_size()
1993 ivideo->UMAsize = ivideo->video_size; in sisfb_get_dram_size()
1999 ivideo->LFBsize = (32 << 20); in sisfb_get_dram_size()
2001 ivideo->LFBsize = (64 << 20); in sisfb_get_dram_size()
2003 ivideo->video_size += ivideo->LFBsize; in sisfb_get_dram_size()
2010 ivideo->video_size = (1 << ((reg & 0xf0) >> 4)) << 20; in sisfb_get_dram_size()
2011 if(ivideo->chip != XGI_20) { in sisfb_get_dram_size()
2013 if(ivideo->revision_id == 2) { in sisfb_get_dram_size()
2017 if(reg == 0x02) ivideo->video_size <<= 1; in sisfb_get_dram_size()
2018 else if(reg == 0x03) ivideo->video_size <<= 2; in sisfb_get_dram_size()
2030 static void sisfb_detect_VB_connect(struct sis_video_info *ivideo) in sisfb_detect_VB_connect() argument
2035 if(ivideo->chip == XGI_20) { in sisfb_detect_VB_connect()
2036 ivideo->sisfb_crt1off = 0; in sisfb_detect_VB_connect()
2041 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_detect_VB_connect()
2043 if((temp & 0x0F) && (ivideo->chip != SIS_300)) { in sisfb_detect_VB_connect()
2045 if(!(ivideo->vbflags & (TV_PAL | TV_NTSC | TV_PALM | TV_PALN))) { in sisfb_detect_VB_connect()
2048 ivideo->vbflags |= TV_PAL; in sisfb_detect_VB_connect()
2050 ivideo->vbflags |= TV_NTSC; in sisfb_detect_VB_connect()
2059 ivideo->sisfb_crt1off = 0; in sisfb_detect_VB_connect()
2061 ivideo->sisfb_crt1off = (cr32 & 0xDF) ? 1 : 0; in sisfb_detect_VB_connect()
2064 ivideo->vbflags &= ~(CRT2_TV | CRT2_LCD | CRT2_VGA); in sisfb_detect_VB_connect()
2066 if(cr32 & SIS_VB_TV) ivideo->vbflags |= CRT2_TV; in sisfb_detect_VB_connect()
2067 if(cr32 & SIS_VB_LCD) ivideo->vbflags |= CRT2_LCD; in sisfb_detect_VB_connect()
2068 if(cr32 & SIS_VB_CRT2) ivideo->vbflags |= CRT2_VGA; in sisfb_detect_VB_connect()
2075 if(ivideo->chip != SIS_550) { in sisfb_detect_VB_connect()
2076 ivideo->sisfb_dstn = ivideo->sisfb_fstn = 0; in sisfb_detect_VB_connect()
2079 if(ivideo->sisfb_tvplug != -1) { in sisfb_detect_VB_connect()
2080 if( (ivideo->sisvga_engine != SIS_315_VGA) || in sisfb_detect_VB_connect()
2081 (!(ivideo->vbflags2 & VB2_SISYPBPRBRIDGE)) ) { in sisfb_detect_VB_connect()
2082 if(ivideo->sisfb_tvplug & TV_YPBPR) { in sisfb_detect_VB_connect()
2083 ivideo->sisfb_tvplug = -1; in sisfb_detect_VB_connect()
2088 if(ivideo->sisfb_tvplug != -1) { in sisfb_detect_VB_connect()
2089 if( (ivideo->sisvga_engine != SIS_315_VGA) || in sisfb_detect_VB_connect()
2090 (!(ivideo->vbflags2 & VB2_SISHIVISIONBRIDGE)) ) { in sisfb_detect_VB_connect()
2091 if(ivideo->sisfb_tvplug & TV_HIVISION) { in sisfb_detect_VB_connect()
2092 ivideo->sisfb_tvplug = -1; in sisfb_detect_VB_connect()
2097 if(ivideo->sisfb_tvstd != -1) { in sisfb_detect_VB_connect()
2098 if( (!(ivideo->vbflags2 & VB2_SISBRIDGE)) && in sisfb_detect_VB_connect()
2099 (!((ivideo->sisvga_engine == SIS_315_VGA) && in sisfb_detect_VB_connect()
2100 (ivideo->vbflags2 & VB2_CHRONTEL))) ) { in sisfb_detect_VB_connect()
2101 if(ivideo->sisfb_tvstd & (TV_PALM | TV_PALN | TV_NTSCJ)) { in sisfb_detect_VB_connect()
2102 ivideo->sisfb_tvstd = -1; in sisfb_detect_VB_connect()
2109 if(ivideo->sisfb_tvplug != -1) { in sisfb_detect_VB_connect()
2110 ivideo->vbflags |= ivideo->sisfb_tvplug; in sisfb_detect_VB_connect()
2112 if(cr32 & SIS_VB_YPBPR) ivideo->vbflags |= (TV_YPBPR|TV_YPBPR525I); /* default: 480i */ in sisfb_detect_VB_connect()
2113 else if(cr32 & SIS_VB_HIVISION) ivideo->vbflags |= TV_HIVISION; in sisfb_detect_VB_connect()
2114 else if(cr32 & SIS_VB_SCART) ivideo->vbflags |= TV_SCART; in sisfb_detect_VB_connect()
2116 if(cr32 & SIS_VB_SVIDEO) ivideo->vbflags |= TV_SVIDEO; in sisfb_detect_VB_connect()
2117 if(cr32 & SIS_VB_COMPOSITE) ivideo->vbflags |= TV_AVIDEO; in sisfb_detect_VB_connect()
2121 if(!(ivideo->vbflags & (TV_YPBPR | TV_HIVISION))) { in sisfb_detect_VB_connect()
2122 if(ivideo->sisfb_tvstd != -1) { in sisfb_detect_VB_connect()
2123 ivideo->vbflags &= ~(TV_NTSC | TV_PAL | TV_PALM | TV_PALN | TV_NTSCJ); in sisfb_detect_VB_connect()
2124 ivideo->vbflags |= ivideo->sisfb_tvstd; in sisfb_detect_VB_connect()
2126 if(ivideo->vbflags & TV_SCART) { in sisfb_detect_VB_connect()
2127 ivideo->vbflags &= ~(TV_NTSC | TV_PALM | TV_PALN | TV_NTSCJ); in sisfb_detect_VB_connect()
2128 ivideo->vbflags |= TV_PAL; in sisfb_detect_VB_connect()
2130 if(!(ivideo->vbflags & (TV_PAL | TV_NTSC | TV_PALM | TV_PALN | TV_NTSCJ))) { in sisfb_detect_VB_connect()
2131 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_detect_VB_connect()
2133 if(temp & 0x01) ivideo->vbflags |= TV_PAL; in sisfb_detect_VB_connect()
2134 else ivideo->vbflags |= TV_NTSC; in sisfb_detect_VB_connect()
2135 } else if((ivideo->chip <= SIS_315PRO) || (ivideo->chip >= SIS_330)) { in sisfb_detect_VB_connect()
2137 if(temp & 0x01) ivideo->vbflags |= TV_PAL; in sisfb_detect_VB_connect()
2138 else ivideo->vbflags |= TV_NTSC; in sisfb_detect_VB_connect()
2141 if(temp & 0x20) ivideo->vbflags |= TV_PAL; in sisfb_detect_VB_connect()
2142 else ivideo->vbflags |= TV_NTSC; in sisfb_detect_VB_connect()
2148 if(ivideo->sisfb_forcecrt1 != -1) { in sisfb_detect_VB_connect()
2149 ivideo->sisfb_crt1off = (ivideo->sisfb_forcecrt1) ? 0 : 1; in sisfb_detect_VB_connect()
2155 static bool sisfb_test_DDC1(struct sis_video_info *ivideo) in sisfb_test_DDC1() argument
2160 old = SiS_ReadDDC1Bit(&ivideo->SiS_Pr); in sisfb_test_DDC1()
2162 if(old != SiS_ReadDDC1Bit(&ivideo->SiS_Pr)) break; in sisfb_test_DDC1()
2167 static void sisfb_sense_crt1(struct sis_video_info *ivideo) in sisfb_sense_crt1() argument
2183 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_sense_crt1()
2184 cr63 = SiS_GetReg(SISCR, ivideo->SiS_Pr.SiS_MyCR63); in sisfb_sense_crt1()
2186 SiS_SetRegAND(SISCR, ivideo->SiS_Pr.SiS_MyCR63, 0xBF); in sisfb_sense_crt1()
2200 for(i=0; i < 10; i++) sisfbwaitretracecrt1(ivideo); in sisfb_sense_crt1()
2204 if(ivideo->chip >= SIS_330) { in sisfb_sense_crt1()
2206 if(ivideo->chip >= SIS_340) { in sisfb_sense_crt1()
2223 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, in sisfb_sense_crt1()
2224 ivideo->sisvga_engine, 0, 0, NULL, ivideo->vbflags2); in sisfb_sense_crt1()
2228 if(sisfb_test_DDC1(ivideo)) temp = 1; in sisfb_sense_crt1()
2237 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_sense_crt1()
2238 SiS_SetRegANDOR(SISCR, ivideo->SiS_Pr.SiS_MyCR63, 0xBF, cr63); in sisfb_sense_crt1()
2248 static void SiS_SenseLCD(struct sis_video_info *ivideo) in SiS_SenseLCD() argument
2255 ivideo->SiS_Pr.PanelSelfDetected = false; in SiS_SenseLCD()
2258 if(!(ivideo->vbflags2 & VB2_SISTMDSBRIDGE)) in SiS_SenseLCD()
2260 if(ivideo->vbflags2 & VB2_30xBDH) in SiS_SenseLCD()
2269 if(ivideo->SiS_Pr.DDCPortMixup) in SiS_SenseLCD()
2273 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, ivideo->sisvga_engine, in SiS_SenseLCD()
2274 realcrtno, 0, &buffer[0], ivideo->vbflags2); in SiS_SenseLCD()
2282 temp = SiS_HandleDDC(&ivideo->SiS_Pr, ivideo->vbflags, in SiS_SenseLCD()
2283 ivideo->sisvga_engine, realcrtno, 1, in SiS_SenseLCD()
2284 &buffer[0], ivideo->vbflags2); in SiS_SenseLCD()
2311 if((yres == 1200) && (ivideo->vbflags2 & VB2_30xC)) in SiS_SenseLCD()
2332 ivideo->SiS_Pr.PanelSelfDetected = true; in SiS_SenseLCD()
2335 static int SISDoSense(struct sis_video_info *ivideo, u16 type, u16 test) in SISDoSense() argument
2346 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x1500); in SISDoSense()
2356 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x1000); in SISDoSense()
2364 static void SiS_Sense30x(struct sis_video_info *ivideo) in SiS_Sense30x() argument
2374 if(ivideo->vbflags2 & VB2_301) { in SiS_Sense30x()
2380 } else if(ivideo->vbflags2 & (VB2_301B | VB2_302B)) { in SiS_Sense30x()
2382 } else if(ivideo->vbflags2 & (VB2_301LV | VB2_302LV)) { in SiS_Sense30x()
2384 } else if(ivideo->vbflags2 & (VB2_301C | VB2_302ELV | VB2_307T | VB2_307LV)) { in SiS_Sense30x()
2390 if(ivideo->vbflags & (VB2_301LV|VB2_302LV|VB2_302ELV|VB2_307LV)) { in SiS_Sense30x()
2395 if(ivideo->haveXGIROM) { in SiS_Sense30x()
2396 biosflag = ivideo->bios_abase[0x58] & 0x03; in SiS_Sense30x()
2397 } else if(ivideo->newrom) { in SiS_Sense30x()
2398 if(ivideo->bios_abase[0x5d] & 0x04) biosflag |= 0x01; in SiS_Sense30x()
2399 } else if(ivideo->sisvga_engine == SIS_300_VGA) { in SiS_Sense30x()
2400 if(ivideo->bios_abase) { in SiS_Sense30x()
2401 biosflag = ivideo->bios_abase[0xfe] & 0x03; in SiS_Sense30x()
2405 if(ivideo->chip == SIS_300) { in SiS_Sense30x()
2410 if(!(ivideo->vbflags2 & VB2_SISVGA2BRIDGE)) { in SiS_Sense30x()
2418 if(ivideo->vbflags2 & VB2_30xC) { in SiS_Sense30x()
2423 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x2000); in SiS_Sense30x()
2429 if(ivideo->vbflags2 & VB2_SISYPBPRBRIDGE) { in SiS_Sense30x()
2433 if(!(ivideo->vbflags2 & VB2_30xCLV)) { in SiS_Sense30x()
2434 SISDoSense(ivideo, 0, 0); in SiS_Sense30x()
2440 if(SISDoSense(ivideo, vga2, vga2_c)) { in SiS_Sense30x()
2453 if(ivideo->vbflags2 & VB2_30xCLV) { in SiS_Sense30x()
2457 if((ivideo->sisvga_engine == SIS_315_VGA) && (ivideo->vbflags2 & VB2_SISYPBPRBRIDGE)) { in SiS_Sense30x()
2459 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x2000); in SiS_Sense30x()
2460 if((result = SISDoSense(ivideo, svhs, 0x0604))) { in SiS_Sense30x()
2461 if((result = SISDoSense(ivideo, cvbs, 0x0804))) { in SiS_Sense30x()
2471 if(!(ivideo->vbflags & TV_YPBPR)) { in SiS_Sense30x()
2472 if((result = SISDoSense(ivideo, svhs, svhs_c))) { in SiS_Sense30x()
2477 if(SISDoSense(ivideo, cvbs, cvbs_c)) { in SiS_Sense30x()
2484 SISDoSense(ivideo, 0, 0); in SiS_Sense30x()
2490 if(ivideo->vbflags2 & VB2_30xCLV) { in SiS_Sense30x()
2504 static void SiS_SenseCh(struct sis_video_info *ivideo) in SiS_SenseCh() argument
2515 if(ivideo->chip < SIS_315H) { in SiS_SenseCh()
2518 ivideo->SiS_Pr.SiS_IF_DEF_CH70xx = 1; /* Chrontel 700x */ in SiS_SenseCh()
2519 …SiS_SetChrontelGPIO(&ivideo->SiS_Pr, 0x9c); /* Set general purpose IO for Chrontel communication */ in SiS_SenseCh()
2520 SiS_DDC2Delay(&ivideo->SiS_Pr, 1000); in SiS_SenseCh()
2521 temp1 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x25); in SiS_SenseCh()
2523 temp2 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0e); in SiS_SenseCh()
2525 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0e, 0x0b); in SiS_SenseCh()
2526 SiS_DDC2Delay(&ivideo->SiS_Pr, 300); in SiS_SenseCh()
2528 temp2 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x25); in SiS_SenseCh()
2533 temp1 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0e); in SiS_SenseCh()
2536 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0e,0x0b); in SiS_SenseCh()
2537 SiS_DDC2Delay(&ivideo->SiS_Pr, 300); in SiS_SenseCh()
2541 SiS_SetCH700x(&ivideo->SiS_Pr, 0x10, 0x01); in SiS_SenseCh()
2542 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96); in SiS_SenseCh()
2543 SiS_SetCH700x(&ivideo->SiS_Pr, 0x10, 0x00); in SiS_SenseCh()
2544 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96); in SiS_SenseCh()
2545 temp1 = SiS_GetCH700x(&ivideo->SiS_Pr, 0x10); in SiS_SenseCh()
2549 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96); in SiS_SenseCh()
2562 ivideo->vbflags |= TV_SVIDEO; in SiS_SenseCh()
2567 ivideo->vbflags |= TV_AVIDEO; in SiS_SenseCh()
2571 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x0e, 0x01, 0xF8); in SiS_SenseCh()
2575 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x0e, 0x01, 0xF8); in SiS_SenseCh()
2579 SiS_SetChrontelGPIO(&ivideo->SiS_Pr, 0x00); in SiS_SenseCh()
2585 ivideo->SiS_Pr.SiS_IF_DEF_CH70xx = 2; /* Chrontel 7019 */ in SiS_SenseCh()
2586 temp1 = SiS_GetCH701x(&ivideo->SiS_Pr, 0x49); in SiS_SenseCh()
2587 SiS_SetCH701x(&ivideo->SiS_Pr, 0x49, 0x20); in SiS_SenseCh()
2588 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96); in SiS_SenseCh()
2589 temp2 = SiS_GetCH701x(&ivideo->SiS_Pr, 0x20); in SiS_SenseCh()
2591 SiS_SetCH701x(&ivideo->SiS_Pr, 0x20, temp2); in SiS_SenseCh()
2592 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96); in SiS_SenseCh()
2594 SiS_SetCH701x(&ivideo->SiS_Pr, 0x20, temp2); in SiS_SenseCh()
2595 SiS_DDC2Delay(&ivideo->SiS_Pr, 0x96); in SiS_SenseCh()
2596 temp2 = SiS_GetCH701x(&ivideo->SiS_Pr, 0x20); in SiS_SenseCh()
2597 SiS_SetCH701x(&ivideo->SiS_Pr, 0x49, temp1); in SiS_SenseCh()
2606 ivideo->vbflags |= TV_AVIDEO; in SiS_SenseCh()
2612 ivideo->vbflags |= TV_SVIDEO; in SiS_SenseCh()
2628 static void sisfb_get_VB_type(struct sis_video_info *ivideo) in sisfb_get_VB_type() argument
2636 if(ivideo->chip == XGI_20) in sisfb_get_VB_type()
2644 ivideo->vbflags |= VB_301; /* Deprecated */ in sisfb_get_VB_type()
2645 ivideo->vbflags2 |= VB2_301; in sisfb_get_VB_type()
2648 ivideo->vbflags |= VB_301B; /* Deprecated */ in sisfb_get_VB_type()
2649 ivideo->vbflags2 |= VB2_301B; in sisfb_get_VB_type()
2652 ivideo->vbflags |= VB_30xBDH; /* Deprecated */ in sisfb_get_VB_type()
2653 ivideo->vbflags2 |= VB2_30xBDH; in sisfb_get_VB_type()
2659 ivideo->vbflags |= VB_301C; /* Deprecated */ in sisfb_get_VB_type()
2660 ivideo->vbflags2 |= VB2_301C; in sisfb_get_VB_type()
2663 ivideo->vbflags |= VB_301LV; /* Deprecated */ in sisfb_get_VB_type()
2664 ivideo->vbflags2 |= VB2_301LV; in sisfb_get_VB_type()
2669 ivideo->vbflags |= VB_302LV; /* Deprecated */ in sisfb_get_VB_type()
2670 ivideo->vbflags2 |= VB2_302LV; in sisfb_get_VB_type()
2673 ivideo->vbflags |= VB_301C; /* Deprecated */ in sisfb_get_VB_type()
2674 ivideo->vbflags2 |= VB2_301C; in sisfb_get_VB_type()
2677 ivideo->vbflags |= VB_302ELV; /* Deprecated */ in sisfb_get_VB_type()
2678 ivideo->vbflags2 |= VB2_302ELV; in sisfb_get_VB_type()
2685 ivideo->vbflags |= VB_302B; /* Deprecated */ in sisfb_get_VB_type()
2686 ivideo->vbflags2 |= VB2_302B; in sisfb_get_VB_type()
2691 if((!(ivideo->vbflags2 & VB2_VIDEOBRIDGE)) && (ivideo->chip != SIS_300)) { in sisfb_get_VB_type()
2695 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_get_VB_type()
2699 ivideo->vbflags |= VB_LVDS; /* Deprecated */ in sisfb_get_VB_type()
2700 ivideo->vbflags2 |= VB2_LVDS; in sisfb_get_VB_type()
2703 ivideo->vbflags |= (VB_LVDS | VB_TRUMPION); /* Deprecated */ in sisfb_get_VB_type()
2704 ivideo->vbflags2 |= (VB2_LVDS | VB2_TRUMPION); in sisfb_get_VB_type()
2707 ivideo->vbflags |= VB_CHRONTEL; /* Deprecated */ in sisfb_get_VB_type()
2708 ivideo->vbflags2 |= VB2_CHRONTEL; in sisfb_get_VB_type()
2711 ivideo->vbflags |= (VB_LVDS | VB_CHRONTEL); /* Deprecated */ in sisfb_get_VB_type()
2712 ivideo->vbflags2 |= (VB2_LVDS | VB2_CHRONTEL); in sisfb_get_VB_type()
2715 if(ivideo->vbflags2 & VB2_CHRONTEL) ivideo->chronteltype = 1; in sisfb_get_VB_type()
2717 } else if(ivideo->chip < SIS_661) { in sisfb_get_VB_type()
2721 ivideo->vbflags |= VB_LVDS; /* Deprecated */ in sisfb_get_VB_type()
2722 ivideo->vbflags2 |= VB2_LVDS; in sisfb_get_VB_type()
2725 ivideo->vbflags |= (VB_LVDS | VB_CHRONTEL); /* Deprecated */ in sisfb_get_VB_type()
2726 ivideo->vbflags2 |= (VB2_LVDS | VB2_CHRONTEL); in sisfb_get_VB_type()
2729 if(ivideo->vbflags2 & VB2_CHRONTEL) ivideo->chronteltype = 2; in sisfb_get_VB_type()
2731 } else if(ivideo->chip >= SIS_661) { in sisfb_get_VB_type()
2737 ivideo->vbflags |= VB_LVDS; /* Deprecated */ in sisfb_get_VB_type()
2738 ivideo->vbflags2 |= VB2_LVDS; in sisfb_get_VB_type()
2741 ivideo->vbflags |= (VB_LVDS | VB_CHRONTEL); /* Deprecated */ in sisfb_get_VB_type()
2742 ivideo->vbflags2 |= (VB2_LVDS | VB2_CHRONTEL); in sisfb_get_VB_type()
2745 ivideo->vbflags |= (VB_LVDS | VB_CONEXANT); /* Deprecated */ in sisfb_get_VB_type()
2746 ivideo->vbflags2 |= (VB2_LVDS | VB2_CONEXANT); in sisfb_get_VB_type()
2749 if(ivideo->vbflags2 & VB2_CHRONTEL) ivideo->chronteltype = 2; in sisfb_get_VB_type()
2752 if(ivideo->vbflags2 & VB2_LVDS) { in sisfb_get_VB_type()
2755 if((ivideo->sisvga_engine == SIS_300_VGA) && (ivideo->vbflags2 & VB2_TRUMPION)) { in sisfb_get_VB_type()
2758 if(ivideo->vbflags2 & VB2_CHRONTEL) { in sisfb_get_VB_type()
2761 if((ivideo->chip >= SIS_661) && (ivideo->vbflags2 & VB2_CONEXANT)) { in sisfb_get_VB_type()
2766 if(ivideo->vbflags2 & VB2_SISBRIDGE) { in sisfb_get_VB_type()
2767 SiS_SenseLCD(ivideo); in sisfb_get_VB_type()
2768 SiS_Sense30x(ivideo); in sisfb_get_VB_type()
2769 } else if(ivideo->vbflags2 & VB2_CHRONTEL) { in sisfb_get_VB_type()
2770 SiS_SenseCh(ivideo); in sisfb_get_VB_type()
2777 sisfb_engine_init(struct sis_video_info *ivideo) in sisfb_engine_init() argument
2784 ivideo->caps &= ~(TURBO_QUEUE_CAP | in sisfb_engine_init()
2790 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_engine_init()
2794 tqueue_pos = (ivideo->video_size - ivideo->cmdQueueSize) / (64 * 1024); in sisfb_engine_init()
2804 ivideo->caps |= TURBO_QUEUE_CAP; in sisfb_engine_init()
2809 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_engine_init()
2813 if(ivideo->chip == XGI_20) { in sisfb_engine_init()
2814 switch(ivideo->cmdQueueSize) { in sisfb_engine_init()
2823 switch(ivideo->cmdQueueSize) { in sisfb_engine_init()
2842 if((ivideo->chip >= XGI_40) && ivideo->modechanged) { in sisfb_engine_init()
2848 if(!((templ = MMIO_IN32(ivideo->mmio_vbase, 0x8240)) & (1 << 10))) { in sisfb_engine_init()
2850 MMIO_OUT32(ivideo->mmio_vbase, Q_WRITE_PTR, 0); in sisfb_engine_init()
2854 tempq = MMIO_IN32(ivideo->mmio_vbase, Q_READ_PTR); in sisfb_engine_init()
2855 MMIO_OUT32(ivideo->mmio_vbase, Q_WRITE_PTR, tempq); in sisfb_engine_init()
2857 tempq = (u32)(ivideo->video_size - ivideo->cmdQueueSize); in sisfb_engine_init()
2858 MMIO_OUT32(ivideo->mmio_vbase, Q_BASE_ADDR, tempq); in sisfb_engine_init()
2860 writel(0x16800000 + 0x8240, ivideo->video_vbase + tempq); in sisfb_engine_init()
2861 writel(templ | (1 << 10), ivideo->video_vbase + tempq + 4); in sisfb_engine_init()
2862 writel(0x168F0000, ivideo->video_vbase + tempq + 8); in sisfb_engine_init()
2863 writel(0x168F0000, ivideo->video_vbase + tempq + 12); in sisfb_engine_init()
2865 MMIO_OUT32(ivideo->mmio_vbase, Q_WRITE_PTR, (tempq + 16)); in sisfb_engine_init()
2867 sisfb_syncaccel(ivideo); in sisfb_engine_init()
2874 tempq = MMIO_IN32(ivideo->mmio_vbase, MMIO_QUEUE_READPORT); in sisfb_engine_init()
2875 MMIO_OUT32(ivideo->mmio_vbase, MMIO_QUEUE_WRITEPORT, tempq); in sisfb_engine_init()
2880 tempq = (u32)(ivideo->video_size - ivideo->cmdQueueSize); in sisfb_engine_init()
2881 MMIO_OUT32(ivideo->mmio_vbase, MMIO_QUEUE_PHYBASE, tempq); in sisfb_engine_init()
2883 ivideo->caps |= MMIO_CMD_QUEUE_CAP; in sisfb_engine_init()
2887 ivideo->engineok = 1; in sisfb_engine_init()
2890 static void sisfb_detect_lcd_type(struct sis_video_info *ivideo) in sisfb_detect_lcd_type() argument
2897 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_detect_lcd_type()
2898 ivideo->CRT2LCDType = sis300paneltype[reg]; in sisfb_detect_lcd_type()
2899 } else if(ivideo->chip >= SIS_661) { in sisfb_detect_lcd_type()
2900 ivideo->CRT2LCDType = sis661paneltype[reg]; in sisfb_detect_lcd_type()
2902 ivideo->CRT2LCDType = sis310paneltype[reg]; in sisfb_detect_lcd_type()
2903 if((ivideo->chip == SIS_550) && (sisfb_fstn)) { in sisfb_detect_lcd_type()
2904 if((ivideo->CRT2LCDType != LCD_320x240_2) && in sisfb_detect_lcd_type()
2905 (ivideo->CRT2LCDType != LCD_320x240_3)) { in sisfb_detect_lcd_type()
2906 ivideo->CRT2LCDType = LCD_320x240; in sisfb_detect_lcd_type()
2911 if(ivideo->CRT2LCDType == LCD_UNKNOWN) { in sisfb_detect_lcd_type()
2913 ivideo->CRT2LCDType = LCD_1024x768; in sisfb_detect_lcd_type()
2920 if(ivideo->CRT2LCDType == sis_lcd_data[i].lcdtype) { in sisfb_detect_lcd_type()
2921 ivideo->lcdxres = sis_lcd_data[i].xres; in sisfb_detect_lcd_type()
2922 ivideo->lcdyres = sis_lcd_data[i].yres; in sisfb_detect_lcd_type()
2923 ivideo->lcddefmodeidx = sis_lcd_data[i].default_mode_idx; in sisfb_detect_lcd_type()
2929 if(ivideo->SiS_Pr.SiS_CustomT == CUT_BARCO1366) { in sisfb_detect_lcd_type()
2930 ivideo->lcdxres = 1360; ivideo->lcdyres = 1024; in sisfb_detect_lcd_type()
2931 ivideo->lcddefmodeidx = DEFAULT_MODE_1360; in sisfb_detect_lcd_type()
2932 } else if(ivideo->SiS_Pr.SiS_CustomT == CUT_PANEL848) { in sisfb_detect_lcd_type()
2933 ivideo->lcdxres = 848; ivideo->lcdyres = 480; in sisfb_detect_lcd_type()
2934 ivideo->lcddefmodeidx = DEFAULT_MODE_848; in sisfb_detect_lcd_type()
2935 } else if(ivideo->SiS_Pr.SiS_CustomT == CUT_PANEL856) { in sisfb_detect_lcd_type()
2936 ivideo->lcdxres = 856; ivideo->lcdyres = 480; in sisfb_detect_lcd_type()
2937 ivideo->lcddefmodeidx = DEFAULT_MODE_856; in sisfb_detect_lcd_type()
2942 ivideo->lcdxres, ivideo->lcdyres); in sisfb_detect_lcd_type()
2945 static void sisfb_save_pdc_emi(struct sis_video_info *ivideo) in sisfb_save_pdc_emi() argument
2949 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_save_pdc_emi()
2950 if(ivideo->vbflags2 & (VB2_LVDS | VB2_30xBDH)) { in sisfb_save_pdc_emi()
2955 ivideo->detectedpdc = SiS_GetReg(SISPART1, 0x13); in sisfb_save_pdc_emi()
2956 ivideo->detectedpdc &= 0x3c; in sisfb_save_pdc_emi()
2957 if(ivideo->SiS_Pr.PDC == -1) { in sisfb_save_pdc_emi()
2959 ivideo->SiS_Pr.PDC = ivideo->detectedpdc; in sisfb_save_pdc_emi()
2962 ivideo->detectedpdc); in sisfb_save_pdc_emi()
2964 if((ivideo->SiS_Pr.PDC != -1) && in sisfb_save_pdc_emi()
2965 (ivideo->SiS_Pr.PDC != ivideo->detectedpdc)) { in sisfb_save_pdc_emi()
2967 ivideo->SiS_Pr.PDC); in sisfb_save_pdc_emi()
2974 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_save_pdc_emi()
2977 if(ivideo->vbflags2 & VB2_SISLCDABRIDGE) { in sisfb_save_pdc_emi()
2981 ivideo->SiS_Pr.SiS_UseLCDA = true; in sisfb_save_pdc_emi()
2982 ivideo->detectedlcda = 0x03; in sisfb_save_pdc_emi()
2987 if(ivideo->vbflags2 & VB2_SISLVDSBRIDGE) { in sisfb_save_pdc_emi()
2990 if((tmp & 0x20) || (ivideo->detectedlcda != 0xff)) { in sisfb_save_pdc_emi()
2994 ivideo->detectedpdc = (pdc & 0x0f) << 1; in sisfb_save_pdc_emi()
2995 ivideo->detectedpdca = (pdc & 0xf0) >> 3; in sisfb_save_pdc_emi()
2997 ivideo->detectedpdc |= ((pdc >> 7) & 0x01); in sisfb_save_pdc_emi()
2999 ivideo->detectedpdca |= ((pdc >> 6) & 0x01); in sisfb_save_pdc_emi()
3000 if(ivideo->newrom) { in sisfb_save_pdc_emi()
3002 if(ivideo->detectedlcda != 0xff) { in sisfb_save_pdc_emi()
3003 ivideo->detectedpdc = 0xff; in sisfb_save_pdc_emi()
3005 ivideo->detectedpdca = 0xff; in sisfb_save_pdc_emi()
3008 if(ivideo->SiS_Pr.PDC == -1) { in sisfb_save_pdc_emi()
3009 if(ivideo->detectedpdc != 0xff) { in sisfb_save_pdc_emi()
3010 ivideo->SiS_Pr.PDC = ivideo->detectedpdc; in sisfb_save_pdc_emi()
3013 if(ivideo->SiS_Pr.PDCA == -1) { in sisfb_save_pdc_emi()
3014 if(ivideo->detectedpdca != 0xff) { in sisfb_save_pdc_emi()
3015 ivideo->SiS_Pr.PDCA = ivideo->detectedpdca; in sisfb_save_pdc_emi()
3018 if(ivideo->detectedpdc != 0xff) { in sisfb_save_pdc_emi()
3021 ivideo->detectedpdc); in sisfb_save_pdc_emi()
3023 if(ivideo->detectedpdca != 0xff) { in sisfb_save_pdc_emi()
3026 ivideo->detectedpdca); in sisfb_save_pdc_emi()
3031 if(ivideo->vbflags2 & VB2_SISEMIBRIDGE) { in sisfb_save_pdc_emi()
3032 ivideo->SiS_Pr.EMI_30 = SiS_GetReg(SISPART4, 0x30); in sisfb_save_pdc_emi()
3033 ivideo->SiS_Pr.EMI_31 = SiS_GetReg(SISPART4, 0x31); in sisfb_save_pdc_emi()
3034 ivideo->SiS_Pr.EMI_32 = SiS_GetReg(SISPART4, 0x32); in sisfb_save_pdc_emi()
3035 ivideo->SiS_Pr.EMI_33 = SiS_GetReg(SISPART4, 0x33); in sisfb_save_pdc_emi()
3036 ivideo->SiS_Pr.HaveEMI = true; in sisfb_save_pdc_emi()
3037 if((tmp & 0x20) || (ivideo->detectedlcda != 0xff)) { in sisfb_save_pdc_emi()
3038 ivideo->SiS_Pr.HaveEMILCD = true; in sisfb_save_pdc_emi()
3044 if(ivideo->vbflags2 & VB2_30xBLV) { in sisfb_save_pdc_emi()
3045 if((ivideo->SiS_Pr.PDC != -1) && in sisfb_save_pdc_emi()
3046 (ivideo->SiS_Pr.PDC != ivideo->detectedpdc)) { in sisfb_save_pdc_emi()
3048 ivideo->SiS_Pr.PDC); in sisfb_save_pdc_emi()
3050 if((ivideo->SiS_Pr.PDCA != -1) && in sisfb_save_pdc_emi()
3051 (ivideo->SiS_Pr.PDCA != ivideo->detectedpdca)) { in sisfb_save_pdc_emi()
3053 ivideo->SiS_Pr.PDCA); in sisfb_save_pdc_emi()
3063 static u32 sisfb_getheapstart(struct sis_video_info *ivideo) in sisfb_getheapstart() argument
3065 u32 ret = ivideo->sisfb_parm_mem * 1024; in sisfb_getheapstart()
3066 u32 maxoffs = ivideo->video_size - ivideo->hwcursor_size - ivideo->cmdQueueSize; in sisfb_getheapstart()
3088 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_getheapstart()
3089 if(ivideo->video_size > 0x1000000) { in sisfb_getheapstart()
3091 } else if(ivideo->video_size > 0x800000) { in sisfb_getheapstart()
3096 } else if(ivideo->UMAsize && ivideo->LFBsize) { in sisfb_getheapstart()
3103 if((!ret) || (ret > maxoffs) || (ivideo->cardnumber != 0)) in sisfb_getheapstart()
3109 static u32 sisfb_getheapsize(struct sis_video_info *ivideo) in sisfb_getheapsize() argument
3111 u32 max = ivideo->video_size - ivideo->hwcursor_size - ivideo->cmdQueueSize; in sisfb_getheapsize()
3114 if(ivideo->UMAsize && ivideo->LFBsize) { in sisfb_getheapsize()
3115 if( (!ivideo->sisfb_parm_mem) || in sisfb_getheapsize()
3116 ((ivideo->sisfb_parm_mem * 1024) > max) || in sisfb_getheapsize()
3117 ((max - (ivideo->sisfb_parm_mem * 1024)) < ivideo->UMAsize) ) { in sisfb_getheapsize()
3118 ret = ivideo->UMAsize; in sisfb_getheapsize()
3119 max -= ivideo->UMAsize; in sisfb_getheapsize()
3121 ret = max - (ivideo->sisfb_parm_mem * 1024); in sisfb_getheapsize()
3122 max = ivideo->sisfb_parm_mem * 1024; in sisfb_getheapsize()
3124 ivideo->video_offset = ret; in sisfb_getheapsize()
3125 ivideo->sisfb_mem = max; in sisfb_getheapsize()
3127 ret = max - ivideo->heapstart; in sisfb_getheapsize()
3128 ivideo->sisfb_mem = ivideo->heapstart; in sisfb_getheapsize()
3134 static int sisfb_heap_init(struct sis_video_info *ivideo) in sisfb_heap_init() argument
3138 ivideo->video_offset = 0; in sisfb_heap_init()
3139 if(ivideo->sisfb_parm_mem) { in sisfb_heap_init()
3140 if( (ivideo->sisfb_parm_mem < (2 * 1024 * 1024)) || in sisfb_heap_init()
3141 (ivideo->sisfb_parm_mem > ivideo->video_size) ) { in sisfb_heap_init()
3142 ivideo->sisfb_parm_mem = 0; in sisfb_heap_init()
3146 ivideo->heapstart = sisfb_getheapstart(ivideo); in sisfb_heap_init()
3147 ivideo->sisfb_heap_size = sisfb_getheapsize(ivideo); in sisfb_heap_init()
3149 ivideo->sisfb_heap_start = ivideo->video_vbase + ivideo->heapstart; in sisfb_heap_init()
3150 ivideo->sisfb_heap_end = ivideo->sisfb_heap_start + ivideo->sisfb_heap_size; in sisfb_heap_init()
3153 (int)(ivideo->heapstart / 1024), (int)(ivideo->sisfb_heap_size / 1024)); in sisfb_heap_init()
3155 ivideo->sisfb_heap.vinfo = ivideo; in sisfb_heap_init()
3157 ivideo->sisfb_heap.poha_chain = NULL; in sisfb_heap_init()
3158 ivideo->sisfb_heap.poh_freelist = NULL; in sisfb_heap_init()
3160 poh = sisfb_poh_new_node(&ivideo->sisfb_heap); in sisfb_heap_init()
3164 poh->poh_next = &ivideo->sisfb_heap.oh_free; in sisfb_heap_init()
3165 poh->poh_prev = &ivideo->sisfb_heap.oh_free; in sisfb_heap_init()
3166 poh->size = ivideo->sisfb_heap_size; in sisfb_heap_init()
3167 poh->offset = ivideo->heapstart; in sisfb_heap_init()
3169 ivideo->sisfb_heap.oh_free.poh_next = poh; in sisfb_heap_init()
3170 ivideo->sisfb_heap.oh_free.poh_prev = poh; in sisfb_heap_init()
3171 ivideo->sisfb_heap.oh_free.size = 0; in sisfb_heap_init()
3172 ivideo->sisfb_heap.max_freesize = poh->size; in sisfb_heap_init()
3174 ivideo->sisfb_heap.oh_used.poh_next = &ivideo->sisfb_heap.oh_used; in sisfb_heap_init()
3175 ivideo->sisfb_heap.oh_used.poh_prev = &ivideo->sisfb_heap.oh_used; in sisfb_heap_init()
3176 ivideo->sisfb_heap.oh_used.size = SENTINEL; in sisfb_heap_init()
3178 if(ivideo->cardnumber == 0) { in sisfb_heap_init()
3182 sisfb_heap = &ivideo->sisfb_heap; in sisfb_heap_init()
3374 sis_int_malloc(struct sis_video_info *ivideo, struct sis_memreq *req) in sis_int_malloc() argument
3378 if((ivideo) && (ivideo->sisfb_id == SISFB_ID) && (!ivideo->havenoheap)) in sis_int_malloc()
3379 poh = sisfb_poh_allocate(&ivideo->sisfb_heap, (u32)req->size); in sis_int_malloc()
3388 (poh->offset + ivideo->video_vbase)); in sis_int_malloc()
3395 struct sis_video_info *ivideo = sisfb_heap->vinfo; in sis_malloc() local
3397 if(&ivideo->sisfb_heap == sisfb_heap) in sis_malloc()
3398 sis_int_malloc(ivideo, req); in sis_malloc()
3406 struct sis_video_info *ivideo = pci_get_drvdata(pdev); in sis_malloc_new() local
3408 sis_int_malloc(ivideo, req); in sis_malloc_new()
3414 sis_int_free(struct sis_video_info *ivideo, u32 base) in sis_int_free() argument
3418 if((!ivideo) || (ivideo->sisfb_id != SISFB_ID) || (ivideo->havenoheap)) in sis_int_free()
3421 poh = sisfb_poh_free(&ivideo->sisfb_heap, base); in sis_int_free()
3432 struct sis_video_info *ivideo = sisfb_heap->vinfo; in sis_free() local
3434 sis_int_free(ivideo, base); in sis_free()
3440 struct sis_video_info *ivideo = pci_get_drvdata(pdev); in sis_free_new() local
3442 sis_int_free(ivideo, base); in sis_free_new()
3448 sisfb_check_engine_and_sync(struct sis_video_info *ivideo) in sisfb_check_engine_and_sync() argument
3462 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_check_engine_and_sync()
3467 sisfb_syncaccel(ivideo); in sisfb_check_engine_and_sync()
3471 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_check_engine_and_sync()
3478 sisfb_syncaccel(ivideo); in sisfb_check_engine_and_sync()
3486 sisfb_pre_setmode(struct sis_video_info *ivideo) in sisfb_pre_setmode() argument
3491 ivideo->currentvbflags &= (VB_VIDEOBRIDGE | VB_DISPTYPE_DISP2); in sisfb_pre_setmode()
3499 cr33 = ivideo->rate_idx & 0x0F; in sisfb_pre_setmode()
3502 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_pre_setmode()
3503 if(ivideo->chip >= SIS_661) { in sisfb_pre_setmode()
3514 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_pre_setmode()
3520 SiS_SetEnableDstn(&ivideo->SiS_Pr, false); in sisfb_pre_setmode()
3521 SiS_SetEnableFstn(&ivideo->SiS_Pr, false); in sisfb_pre_setmode()
3522 ivideo->curFSTN = ivideo->curDSTN = 0; in sisfb_pre_setmode()
3524 switch(ivideo->currentvbflags & VB_DISPTYPE_DISP2) { in sisfb_pre_setmode()
3528 if((ivideo->vbflags & TV_YPBPR) && (ivideo->vbflags2 & VB2_SISYPBPRBRIDGE)) { in sisfb_pre_setmode()
3530 if(ivideo->chip >= SIS_661) { in sisfb_pre_setmode()
3532 if(ivideo->vbflags & TV_YPBPR525P) cr35 |= 0x20; in sisfb_pre_setmode()
3533 else if(ivideo->vbflags & TV_YPBPR750P) cr35 |= 0x40; in sisfb_pre_setmode()
3534 else if(ivideo->vbflags & TV_YPBPR1080I) cr35 |= 0x60; in sisfb_pre_setmode()
3537 ivideo->currentvbflags |= (TV_YPBPR | (ivideo->vbflags & TV_YPBPRALL)); in sisfb_pre_setmode()
3538 } else if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_pre_setmode()
3541 if(ivideo->vbflags & TV_YPBPR525P) cr38 |= 0x10; in sisfb_pre_setmode()
3542 else if(ivideo->vbflags & TV_YPBPR750P) cr38 |= 0x20; in sisfb_pre_setmode()
3543 else if(ivideo->vbflags & TV_YPBPR1080I) cr38 |= 0x30; in sisfb_pre_setmode()
3545 ivideo->currentvbflags |= (TV_YPBPR | (ivideo->vbflags & TV_YPBPRALL)); in sisfb_pre_setmode()
3548 } else if((ivideo->vbflags & TV_HIVISION) && in sisfb_pre_setmode()
3549 (ivideo->vbflags2 & VB2_SISHIVISIONBRIDGE)) { in sisfb_pre_setmode()
3550 if(ivideo->chip >= SIS_661) { in sisfb_pre_setmode()
3559 ivideo->currentvbflags |= TV_HIVISION; in sisfb_pre_setmode()
3560 } else if(ivideo->vbflags & TV_SCART) { in sisfb_pre_setmode()
3564 ivideo->currentvbflags |= TV_SCART; in sisfb_pre_setmode()
3566 if(ivideo->vbflags & TV_SVIDEO) { in sisfb_pre_setmode()
3568 ivideo->currentvbflags |= TV_SVIDEO; in sisfb_pre_setmode()
3570 if(ivideo->vbflags & TV_AVIDEO) { in sisfb_pre_setmode()
3572 ivideo->currentvbflags |= TV_AVIDEO; in sisfb_pre_setmode()
3577 if(ivideo->vbflags & (TV_AVIDEO | TV_SVIDEO)) { in sisfb_pre_setmode()
3578 if(ivideo->vbflags & TV_PAL) { in sisfb_pre_setmode()
3580 ivideo->currentvbflags |= TV_PAL; in sisfb_pre_setmode()
3581 if(ivideo->vbflags & TV_PALM) { in sisfb_pre_setmode()
3583 ivideo->currentvbflags |= TV_PALM; in sisfb_pre_setmode()
3584 } else if(ivideo->vbflags & TV_PALN) { in sisfb_pre_setmode()
3586 ivideo->currentvbflags |= TV_PALN; in sisfb_pre_setmode()
3590 ivideo->currentvbflags |= TV_NTSC; in sisfb_pre_setmode()
3591 if(ivideo->vbflags & TV_NTSCJ) { in sisfb_pre_setmode()
3593 ivideo->currentvbflags |= TV_NTSCJ; in sisfb_pre_setmode()
3602 SiS_SetEnableDstn(&ivideo->SiS_Pr, ivideo->sisfb_dstn); in sisfb_pre_setmode()
3603 SiS_SetEnableFstn(&ivideo->SiS_Pr, ivideo->sisfb_fstn); in sisfb_pre_setmode()
3604 ivideo->curFSTN = ivideo->sisfb_fstn; in sisfb_pre_setmode()
3605 ivideo->curDSTN = ivideo->sisfb_dstn; in sisfb_pre_setmode()
3611 if(ivideo->sisfb_nocrt2rate) { in sisfb_pre_setmode()
3612 cr33 |= (sisbios_mode[ivideo->sisfb_mode_idx].rate_idx << 4); in sisfb_pre_setmode()
3614 cr33 |= ((ivideo->rate_idx & 0x0F) << 4); in sisfb_pre_setmode()
3626 if(ivideo->chip >= SIS_661) { in sisfb_pre_setmode()
3633 } else if(ivideo->chip != SIS_300) { in sisfb_pre_setmode()
3638 ivideo->SiS_Pr.SiS_UseOEM = ivideo->sisfb_useoem; in sisfb_pre_setmode()
3640 sisfb_check_engine_and_sync(ivideo); in sisfb_pre_setmode()
3646 sisfb_fixup_SR11(struct sis_video_info *ivideo) in sisfb_fixup_SR11() argument
3650 if(ivideo->chip >= SIS_661) { in sisfb_fixup_SR11()
3666 sisfb_set_TVxposoffset(struct sis_video_info *ivideo, int val) in sisfb_set_TVxposoffset() argument
3670 ivideo->tvxpos = val; in sisfb_set_TVxposoffset()
3672 if(ivideo->sisfblocked) return; in sisfb_set_TVxposoffset()
3673 if(!ivideo->modechanged) return; in sisfb_set_TVxposoffset()
3675 if(ivideo->currentvbflags & CRT2_TV) { in sisfb_set_TVxposoffset()
3677 if(ivideo->vbflags2 & VB2_CHRONTEL) { in sisfb_set_TVxposoffset()
3679 int x = ivideo->tvx; in sisfb_set_TVxposoffset()
3681 switch(ivideo->chronteltype) { in sisfb_set_TVxposoffset()
3686 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0a, (x & 0xff)); in sisfb_set_TVxposoffset()
3687 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x08, ((x & 0x0100) >> 7), 0xFD); in sisfb_set_TVxposoffset()
3694 } else if(ivideo->vbflags2 & VB2_SISBRIDGE) { in sisfb_set_TVxposoffset()
3699 p2_1f = ivideo->p2_1f; in sisfb_set_TVxposoffset()
3700 p2_20 = ivideo->p2_20; in sisfb_set_TVxposoffset()
3701 p2_2b = ivideo->p2_2b; in sisfb_set_TVxposoffset()
3702 p2_42 = ivideo->p2_42; in sisfb_set_TVxposoffset()
3703 p2_43 = ivideo->p2_43; in sisfb_set_TVxposoffset()
3724 sisfb_set_TVyposoffset(struct sis_video_info *ivideo, int val) in sisfb_set_TVyposoffset() argument
3728 ivideo->tvypos = val; in sisfb_set_TVyposoffset()
3730 if(ivideo->sisfblocked) return; in sisfb_set_TVyposoffset()
3731 if(!ivideo->modechanged) return; in sisfb_set_TVyposoffset()
3733 if(ivideo->currentvbflags & CRT2_TV) { in sisfb_set_TVyposoffset()
3735 if(ivideo->vbflags2 & VB2_CHRONTEL) { in sisfb_set_TVyposoffset()
3737 int y = ivideo->tvy; in sisfb_set_TVyposoffset()
3739 switch(ivideo->chronteltype) { in sisfb_set_TVyposoffset()
3744 SiS_SetCH700x(&ivideo->SiS_Pr, 0x0b, (y & 0xff)); in sisfb_set_TVyposoffset()
3745 SiS_SetCH70xxANDOR(&ivideo->SiS_Pr, 0x08, ((y & 0x0100) >> 8), 0xFE); in sisfb_set_TVyposoffset()
3752 } else if(ivideo->vbflags2 & VB2_SISBRIDGE) { in sisfb_set_TVyposoffset()
3756 p2_01 = ivideo->p2_01; in sisfb_set_TVyposoffset()
3757 p2_02 = ivideo->p2_02; in sisfb_set_TVyposoffset()
3761 if(!(ivideo->currentvbflags & (TV_HIVISION | TV_YPBPR))) { in sisfb_set_TVyposoffset()
3774 sisfb_post_setmode(struct sis_video_info *ivideo) in sisfb_post_setmode() argument
3788 sisfb_fixup_SR11(ivideo); in sisfb_post_setmode()
3792 ivideo->modechanged = 1; in sisfb_post_setmode()
3795 if(ivideo->vbflags2 & VB2_VIDEOBRIDGE) { in sisfb_post_setmode()
3796 if(sisfb_bridgeisslave(ivideo)) doit = false; in sisfb_post_setmode()
3798 ivideo->sisfb_crt1off = 0; in sisfb_post_setmode()
3801 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_post_setmode()
3802 if((ivideo->sisfb_crt1off) && (doit)) { in sisfb_post_setmode()
3813 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_post_setmode()
3814 if((ivideo->sisfb_crt1off) && (doit)) { in sisfb_post_setmode()
3823 SiS_SetRegANDOR(SISCR, ivideo->SiS_Pr.SiS_MyCR63, ~0x40, reg); in sisfb_post_setmode()
3829 ivideo->currentvbflags &= ~VB_DISPTYPE_CRT1; in sisfb_post_setmode()
3830 ivideo->currentvbflags |= VB_SINGLE_MODE; in sisfb_post_setmode()
3832 ivideo->currentvbflags |= VB_DISPTYPE_CRT1; in sisfb_post_setmode()
3833 if(ivideo->currentvbflags & VB_DISPTYPE_CRT2) { in sisfb_post_setmode()
3834 ivideo->currentvbflags |= VB_MIRROR_MODE; in sisfb_post_setmode()
3836 ivideo->currentvbflags |= VB_SINGLE_MODE; in sisfb_post_setmode()
3842 if(ivideo->currentvbflags & CRT2_TV) { in sisfb_post_setmode()
3843 if(ivideo->vbflags2 & VB2_SISBRIDGE) { in sisfb_post_setmode()
3844 ivideo->p2_1f = SiS_GetReg(SISPART2, 0x1f); in sisfb_post_setmode()
3845 ivideo->p2_20 = SiS_GetReg(SISPART2, 0x20); in sisfb_post_setmode()
3846 ivideo->p2_2b = SiS_GetReg(SISPART2, 0x2b); in sisfb_post_setmode()
3847 ivideo->p2_42 = SiS_GetReg(SISPART2, 0x42); in sisfb_post_setmode()
3848 ivideo->p2_43 = SiS_GetReg(SISPART2, 0x43); in sisfb_post_setmode()
3849 ivideo->p2_01 = SiS_GetReg(SISPART2, 0x01); in sisfb_post_setmode()
3850 ivideo->p2_02 = SiS_GetReg(SISPART2, 0x02); in sisfb_post_setmode()
3851 } else if(ivideo->vbflags2 & VB2_CHRONTEL) { in sisfb_post_setmode()
3852 if(ivideo->chronteltype == 1) { in sisfb_post_setmode()
3853 ivideo->tvx = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0a); in sisfb_post_setmode()
3854 ivideo->tvx |= (((SiS_GetCH700x(&ivideo->SiS_Pr, 0x08) & 0x02) >> 1) << 8); in sisfb_post_setmode()
3855 ivideo->tvy = SiS_GetCH700x(&ivideo->SiS_Pr, 0x0b); in sisfb_post_setmode()
3856 ivideo->tvy |= ((SiS_GetCH700x(&ivideo->SiS_Pr, 0x08) & 0x01) << 8); in sisfb_post_setmode()
3861 if(ivideo->tvxpos) { in sisfb_post_setmode()
3862 sisfb_set_TVxposoffset(ivideo, ivideo->tvxpos); in sisfb_post_setmode()
3864 if(ivideo->tvypos) { in sisfb_post_setmode()
3865 sisfb_set_TVyposoffset(ivideo, ivideo->tvypos); in sisfb_post_setmode()
3869 sisfb_check_engine_and_sync(ivideo); in sisfb_post_setmode()
3872 if(ivideo->accel) { in sisfb_post_setmode()
3873 sisfb_engine_init(ivideo); in sisfb_post_setmode()
3875 ivideo->engineok = 0; in sisfb_post_setmode()
3880 sisfb_reset_mode(struct sis_video_info *ivideo) in sisfb_reset_mode() argument
3882 if(sisfb_set_mode(ivideo, 0)) in sisfb_reset_mode()
3885 sisfb_set_pitch(ivideo); in sisfb_reset_mode()
3886 sisfb_set_base_CRT1(ivideo, ivideo->current_base); in sisfb_reset_mode()
3887 sisfb_set_base_CRT2(ivideo, ivideo->current_base); in sisfb_reset_mode()
3893 sisfb_handle_command(struct sis_video_info *ivideo, struct sisfb_cmd *sisfb_command) in sisfb_handle_command() argument
3899 if(!ivideo->modechanged) { in sisfb_handle_command()
3903 sisfb_command->sisfb_result[1] = ivideo->currentvbflags; in sisfb_handle_command()
3904 sisfb_command->sisfb_result[2] = ivideo->vbflags2; in sisfb_handle_command()
3909 if(!ivideo->modechanged) { in sisfb_handle_command()
3913 sisfb_command->sisfb_result[1] = ivideo->sisfb_crt1off ? 0 : 1; in sisfb_handle_command()
3915 } else if(ivideo->sisfblocked) { in sisfb_handle_command()
3917 } else if((!(ivideo->currentvbflags & CRT2_ENABLE)) && in sisfb_handle_command()
3923 if( ((ivideo->currentvbflags & VB_DISPTYPE_CRT1) && mycrt1off) || in sisfb_handle_command()
3924 ((!(ivideo->currentvbflags & VB_DISPTYPE_CRT1)) && !mycrt1off) ) { in sisfb_handle_command()
3925 ivideo->sisfb_crt1off = mycrt1off; in sisfb_handle_command()
3926 if(sisfb_reset_mode(ivideo)) { in sisfb_handle_command()
3930 sisfb_command->sisfb_result[1] = ivideo->sisfb_crt1off ? 0 : 1; in sisfb_handle_command()
4041 struct sis_video_info *ivideo) in sisfb_check_rom() argument
4059 if((readb(rom + 4) | (readb(rom + 5) << 8)) != ivideo->chip_vendor) in sisfb_check_rom()
4062 if((readb(rom + 6) | (readb(rom + 7) << 8)) != ivideo->chip_id) in sisfb_check_rom()
4070 struct sis_video_info *ivideo = pci_get_drvdata(pdev); in sisfb_find_rom() local
4079 if(!ivideo->nbridge) { in sisfb_find_rom()
4083 if(sisfb_check_rom(rom_base, ivideo)) { in sisfb_find_rom()
4108 if (!sisfb_check_rom(rom_base, ivideo)) { in sisfb_find_rom()
4127 static void sisfb_post_map_vram(struct sis_video_info *ivideo, in sisfb_post_map_vram() argument
4133 ivideo->video_vbase = ioremap(ivideo->video_base, (*mapsize)); in sisfb_post_map_vram()
4135 if(!ivideo->video_vbase) { in sisfb_post_map_vram()
4139 while((!(ivideo->video_vbase = ioremap(ivideo->video_base, (*mapsize))))) { in sisfb_post_map_vram()
4144 if(ivideo->video_vbase) { in sisfb_post_map_vram()
4153 static int sisfb_post_300_buswidth(struct sis_video_info *ivideo) in sisfb_post_300_buswidth() argument
4155 void __iomem *FBAddress = ivideo->video_vbase; in sisfb_post_300_buswidth()
4218 static int sisfb_post_300_rwtest(struct sis_video_info *ivideo, int iteration, in sisfb_post_300_rwtest() argument
4222 void __iomem *FBAddr = ivideo->video_vbase; in sisfb_post_300_rwtest()
4286 struct sis_video_info *ivideo = pci_get_drvdata(pdev); in sisfb_post_300_ramsize() local
4290 buswidth = sisfb_post_300_buswidth(ivideo); in sisfb_post_300_ramsize()
4297 if(sisfb_post_300_rwtest(ivideo, in sisfb_post_300_ramsize()
4311 struct sis_video_info *ivideo = pci_get_drvdata(pdev); in sisfb_post_sis300() local
4312 unsigned char *bios = ivideo->SiS_Pr.VirtualRomBase; in sisfb_post_sis300()
4317 if(!ivideo->SiS_Pr.UseROM) in sisfb_post_sis300()
4332 if(ivideo->revision_id <= 0x13) { in sisfb_post_sis300()
4377 if(ivideo->revision_id >= 0x80) in sisfb_post_sis300()
4395 if(ivideo->revision_id >= 0x80) in sisfb_post_sis300()
4420 if(ivideo->revision_id >= 0x80) in sisfb_post_sis300()
4428 if(ivideo->SiS_Pr.UseROM) { in sisfb_post_sis300()
4463 mapsize = ivideo->video_size; in sisfb_post_sis300()
4464 sisfb_post_map_vram(ivideo, &mapsize, 4); in sisfb_post_sis300()
4466 if(ivideo->video_vbase) { in sisfb_post_sis300()
4468 iounmap(ivideo->video_vbase); in sisfb_post_sis300()
4495 sisfb_sense_crt1(ivideo); in sisfb_post_sis300()
4498 ivideo->SiS_Pr.SiS_UseOEM = false; in sisfb_post_sis300()
4499 SiS_SetEnableDstn(&ivideo->SiS_Pr, false); in sisfb_post_sis300()
4500 SiS_SetEnableFstn(&ivideo->SiS_Pr, false); in sisfb_post_sis300()
4501 ivideo->curFSTN = ivideo->curDSTN = 0; in sisfb_post_sis300()
4502 ivideo->SiS_Pr.VideoMemorySize = 8 << 20; in sisfb_post_sis300()
4503 SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80); in sisfb_post_sis300()
4514 ivideo->modeprechange = 0x2e; in sisfb_post_sis300()
4526 static inline int sisfb_xgi_is21(struct sis_video_info *ivideo) in sisfb_xgi_is21() argument
4528 return ivideo->chip_real_id == XGI_21; in sisfb_xgi_is21()
4531 static void sisfb_post_xgi_delay(struct sis_video_info *ivideo, int delay) in sisfb_post_xgi_delay() argument
4542 static int sisfb_find_host_bridge(struct sis_video_info *ivideo, in sisfb_find_host_bridge() argument
4562 static int sisfb_post_xgi_rwtest(struct sis_video_info *ivideo, int starta, in sisfb_post_xgi_rwtest() argument
4568 writel(0, ivideo->video_vbase); in sisfb_post_xgi_rwtest()
4573 writel(pos, ivideo->video_vbase + pos); in sisfb_post_xgi_rwtest()
4576 sisfb_post_xgi_delay(ivideo, 150); in sisfb_post_xgi_rwtest()
4578 if(readl(ivideo->video_vbase) != 0) in sisfb_post_xgi_rwtest()
4584 if(readl(ivideo->video_vbase + pos) != pos) in sisfb_post_xgi_rwtest()
4593 static int sisfb_post_xgi_ramsize(struct sis_video_info *ivideo) in sisfb_post_xgi_ramsize() argument
4630 mapsize = ivideo->video_size; in sisfb_post_xgi_ramsize()
4631 sisfb_post_map_vram(ivideo, &mapsize, 32); in sisfb_post_xgi_ramsize()
4633 if(!ivideo->video_vbase) { in sisfb_post_xgi_ramsize()
4646 if(ivideo->chip == XGI_20) { in sisfb_post_xgi_ramsize()
4654 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4656 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize)) in sisfb_post_xgi_ramsize()
4661 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4662 if(sisfb_post_xgi_rwtest(ivideo, 23, 23, mapsize)) in sisfb_post_xgi_ramsize()
4668 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4670 if(sisfb_post_xgi_rwtest(ivideo, 22, 23, mapsize)) in sisfb_post_xgi_ramsize()
4678 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4680 if(sisfb_post_xgi_rwtest(ivideo, 22, 23, mapsize)) in sisfb_post_xgi_ramsize()
4685 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4686 if(sisfb_post_xgi_rwtest(ivideo, 22, 22, mapsize)) in sisfb_post_xgi_ramsize()
4692 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4694 if(sisfb_post_xgi_rwtest(ivideo, 21, 22, mapsize)) in sisfb_post_xgi_ramsize()
4710 if(ivideo->revision_id == 2) { in sisfb_post_xgi_ramsize()
4715 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4716 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize)) in sisfb_post_xgi_ramsize()
4721 if(sisfb_post_xgi_rwtest(ivideo, 22, 23, mapsize)) in sisfb_post_xgi_ramsize()
4728 if(sisfb_post_xgi_rwtest(ivideo, 22, 23, mapsize)) in sisfb_post_xgi_ramsize()
4738 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4739 if(sisfb_post_xgi_rwtest(ivideo, 23, 25, mapsize)) in sisfb_post_xgi_ramsize()
4744 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4746 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize)) in sisfb_post_xgi_ramsize()
4753 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize)) { in sisfb_post_xgi_ramsize()
4761 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4766 if(ivideo->revision_id == 2) { in sisfb_post_xgi_ramsize()
4770 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4772 if(sisfb_post_xgi_rwtest(ivideo, 23, 24, mapsize)) in sisfb_post_xgi_ramsize()
4781 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4783 if(sisfb_post_xgi_rwtest(ivideo, 24, 25, mapsize)) in sisfb_post_xgi_ramsize()
4789 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4796 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4798 j = (ivideo->chip == XGI_20) ? 5 : 9; in sisfb_post_xgi_ramsize()
4799 k = (ivideo->chip == XGI_20) ? 12 : 4; in sisfb_post_xgi_ramsize()
4804 reg = (ivideo->chip == XGI_20) ? in sisfb_post_xgi_ramsize()
4807 sisfb_post_xgi_delay(ivideo, 50); in sisfb_post_xgi_ramsize()
4809 ranksize = (ivideo->chip == XGI_20) ? in sisfb_post_xgi_ramsize()
4815 if(ivideo->chip == XGI_20) { in sisfb_post_xgi_ramsize()
4832 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ramsize()
4834 if (sisfb_post_xgi_rwtest(ivideo, j, ((reg >> 4) + channelab - 2 + 20), mapsize)) { in sisfb_post_xgi_ramsize()
4840 iounmap(ivideo->video_vbase); in sisfb_post_xgi_ramsize()
4845 static void sisfb_post_xgi_setclocks(struct sis_video_info *ivideo, u8 regb) in sisfb_post_xgi_setclocks() argument
4874 if(ivideo->haveXGIROM) { in sisfb_post_xgi_setclocks()
4875 v1 = ivideo->bios_abase[0x90 + index]; in sisfb_post_xgi_setclocks()
4876 v2 = ivideo->bios_abase[0x90 + index + 1]; in sisfb_post_xgi_setclocks()
4877 v3 = ivideo->bios_abase[0x90 + index + 2]; in sisfb_post_xgi_setclocks()
4882 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi_setclocks()
4883 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi_setclocks()
4884 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi_setclocks()
4887 if(ivideo->haveXGIROM) { in sisfb_post_xgi_setclocks()
4888 v1 = ivideo->bios_abase[0xb8 + index]; in sisfb_post_xgi_setclocks()
4889 v2 = ivideo->bios_abase[0xb8 + index + 1]; in sisfb_post_xgi_setclocks()
4890 v3 = ivideo->bios_abase[0xb8 + index + 2]; in sisfb_post_xgi_setclocks()
4895 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi_setclocks()
4896 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi_setclocks()
4897 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi_setclocks()
4900 static void sisfb_post_xgi_ddr2_mrs_default(struct sis_video_info *ivideo, in sisfb_post_xgi_ddr2_mrs_default() argument
4903 unsigned char *bios = ivideo->bios_abase; in sisfb_post_xgi_ddr2_mrs_default()
4908 sisfb_post_xgi_delay(ivideo, 15); in sisfb_post_xgi_ddr2_mrs_default()
4917 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ddr2_mrs_default()
4919 sisfb_post_xgi_setclocks(ivideo, regb); in sisfb_post_xgi_ddr2_mrs_default()
4920 sisfb_post_xgi_delay(ivideo, 0x46); in sisfb_post_xgi_ddr2_mrs_default()
4925 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ddr2_mrs_default()
4927 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ddr2_mrs_default()
4929 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ddr2_mrs_default()
4931 if (ivideo->haveXGIROM) { in sisfb_post_xgi_ddr2_mrs_default()
4938 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ddr2_mrs_default()
4941 static void sisfb_post_xgi_ddr2_mrs_xg21(struct sis_video_info *ivideo) in sisfb_post_xgi_ddr2_mrs_xg21() argument
4943 sisfb_post_xgi_setclocks(ivideo, 1); in sisfb_post_xgi_ddr2_mrs_xg21()
4946 sisfb_post_xgi_delay(ivideo, 0x46); in sisfb_post_xgi_ddr2_mrs_xg21()
4967 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ddr2_mrs_xg21()
4970 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ddr2_mrs_xg21()
4973 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ddr2_mrs_xg21()
4979 sisfb_post_xgi_delay(ivideo, 1); in sisfb_post_xgi_ddr2_mrs_xg21()
4982 static void sisfb_post_xgi_ddr2(struct sis_video_info *ivideo, u8 regb) in sisfb_post_xgi_ddr2() argument
4984 unsigned char *bios = ivideo->bios_abase; in sisfb_post_xgi_ddr2()
5006 if (ivideo->haveXGIROM) { in sisfb_post_xgi_ddr2()
5021 if (sisfb_xgi_is21(ivideo)) in sisfb_post_xgi_ddr2()
5022 sisfb_post_xgi_ddr2_mrs_xg21(ivideo); in sisfb_post_xgi_ddr2()
5024 sisfb_post_xgi_ddr2_mrs_default(ivideo, regb); in sisfb_post_xgi_ddr2()
5027 static u8 sisfb_post_xgi_ramtype(struct sis_video_info *ivideo) in sisfb_post_xgi_ramtype() argument
5029 unsigned char *bios = ivideo->bios_abase; in sisfb_post_xgi_ramtype()
5035 if (ivideo->haveXGIROM) { in sisfb_post_xgi_ramtype()
5040 if (sisfb_xgi_is21(ivideo)) { in sisfb_post_xgi_ramtype()
5046 } else if (ivideo->chip == XGI_20) { in sisfb_post_xgi_ramtype()
5068 struct sis_video_info *ivideo = pci_get_drvdata(pdev); in sisfb_post_xgi() local
5069 unsigned char *bios = ivideo->bios_abase; in sisfb_post_xgi()
5158 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5166 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5174 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5186 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5193 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5194 if(ivideo->revision_id == 2) { in sisfb_post_xgi()
5200 if(ivideo->revision_id == 0) { /* 40 *and* 20? */ in sisfb_post_xgi()
5208 reg = (ivideo->chip == XGI_40) ? 0x20 : 0x00; in sisfb_post_xgi()
5211 if(ivideo->chip == XGI_20) { in sisfb_post_xgi()
5276 } else if(sisfb_find_host_bridge(ivideo, pdev, PCI_VENDOR_ID_SI)) { in sisfb_post_xgi()
5278 } else if(sisfb_find_host_bridge(ivideo, pdev, 0x1106) || in sisfb_post_xgi()
5279 sisfb_find_host_bridge(ivideo, pdev, 0x1022) || in sisfb_post_xgi()
5280 sisfb_find_host_bridge(ivideo, pdev, 0x700e) || in sisfb_post_xgi()
5281 sisfb_find_host_bridge(ivideo, pdev, 0x10de)) { in sisfb_post_xgi()
5291 if(ivideo->revision_id == 2) { in sisfb_post_xgi()
5355 ramtype = sisfb_post_xgi_ramtype(ivideo); in sisfb_post_xgi()
5356 if (!sisfb_xgi_is21(ivideo) && ramtype) { in sisfb_post_xgi()
5366 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5372 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5381 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5382 index = (ivideo->chip == XGI_20) ? 0x31a : 0x3a6; in sisfb_post_xgi()
5410 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5411 index = (ivideo->chip == XGI_20) ? 0x35a : 0x3e6; in sisfb_post_xgi()
5438 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5448 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5449 index = (ivideo->chip == XGI_20) ? 0x45a : 0x4e6; in sisfb_post_xgi()
5466 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5478 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5488 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5496 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5508 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5509 if( (ivideo->revision_id == 1) || in sisfb_post_xgi()
5510 (ivideo->revision_id == 2) ) { in sisfb_post_xgi()
5521 if(ivideo->chip == XGI_20) { in sisfb_post_xgi()
5528 sisfb_post_xgi_setclocks(ivideo, regb); in sisfb_post_xgi()
5529 if((ivideo->chip == XGI_20) || in sisfb_post_xgi()
5530 (ivideo->revision_id == 1) || in sisfb_post_xgi()
5531 (ivideo->revision_id == 2)) { in sisfb_post_xgi()
5533 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5556 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5563 if((ivideo->chip == XGI_20) || in sisfb_post_xgi()
5564 (ivideo->revision_id == 2)) { in sisfb_post_xgi()
5571 if((ivideo->chip == XGI_20) || (bios[0x1cb] != 0x0c)) { in sisfb_post_xgi()
5572 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi()
5573 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi()
5574 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi()
5576 if((ivideo->chip == XGI_20) || in sisfb_post_xgi()
5577 (ivideo->revision_id == 2)) { in sisfb_post_xgi()
5582 } else if((ivideo->chip == XGI_40) && (bios[0x1cb] == 0x0c)) { in sisfb_post_xgi()
5587 sisfb_post_xgi_delay(ivideo, 4); in sisfb_post_xgi()
5589 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5591 index = (ivideo->chip == XGI_20) ? 0x4b2 : 0x53e; in sisfb_post_xgi()
5598 SiS_SetReg(SISSR, 0x19, ((ivideo->chip == XGI_20) ? 0x02 : 0x01)); in sisfb_post_xgi()
5601 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi()
5603 sisfb_post_xgi_delay(ivideo, 0x22); in sisfb_post_xgi()
5611 sisfb_post_xgi_ddr2(ivideo, regb); in sisfb_post_xgi()
5614 sisfb_post_xgi_setclocks(ivideo, regb); in sisfb_post_xgi()
5615 if((ivideo->chip == XGI_40) && in sisfb_post_xgi()
5616 ((ivideo->revision_id == 1) || in sisfb_post_xgi()
5617 (ivideo->revision_id == 2))) { in sisfb_post_xgi()
5632 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5639 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5642 if((ivideo->chip == XGI_40) && (ivideo->revision_id == 2)) { in sisfb_post_xgi()
5649 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5657 if((ivideo->chip == XGI_40) && (bios[0x1cb] != 0x0c)) { in sisfb_post_xgi()
5658 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi()
5659 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi()
5660 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi()
5666 sisfb_post_xgi_delay(ivideo, 4); in sisfb_post_xgi()
5668 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5673 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5680 sisfb_post_xgi_delay(ivideo, 0x43); in sisfb_post_xgi()
5681 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5686 sisfb_post_xgi_delay(ivideo, 0x22); in sisfb_post_xgi()
5689 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5701 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5708 if(ivideo->haveXGIROM) { in sisfb_post_xgi()
5714 if((v1 & 0x40) && (v2 & regd) && ivideo->haveXGIROM) { in sisfb_post_xgi()
5723 ivideo->SiS_Pr.SiS_UseOEM = false; in sisfb_post_xgi()
5724 SiS_SetEnableDstn(&ivideo->SiS_Pr, false); in sisfb_post_xgi()
5725 SiS_SetEnableFstn(&ivideo->SiS_Pr, false); in sisfb_post_xgi()
5726 ivideo->curFSTN = ivideo->curDSTN = 0; in sisfb_post_xgi()
5727 ivideo->SiS_Pr.VideoMemorySize = 8 << 20; in sisfb_post_xgi()
5728 SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80); in sisfb_post_xgi()
5734 err = sisfb_post_xgi_ramsize(ivideo); in sisfb_post_xgi()
5760 if(ivideo->chip == XGI_20) { in sisfb_post_xgi()
5765 sisfb_sense_crt1(ivideo); in sisfb_post_xgi()
5772 ivideo->SiS_Pr.SiS_UseOEM = false; in sisfb_post_xgi()
5773 SiS_SetEnableDstn(&ivideo->SiS_Pr, false); in sisfb_post_xgi()
5774 SiS_SetEnableFstn(&ivideo->SiS_Pr, false); in sisfb_post_xgi()
5775 ivideo->curFSTN = ivideo->curDSTN = 0; in sisfb_post_xgi()
5776 SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80); in sisfb_post_xgi()
5787 ivideo->modeprechange = 0x2e; in sisfb_post_xgi()
5789 if(ivideo->chip == XGI_40) { in sisfb_post_xgi()
5806 struct sis_video_info *ivideo = NULL; in sisfb_probe() local
5815 sis_fb_info = framebuffer_alloc(sizeof(*ivideo), &pdev->dev); in sisfb_probe()
5819 ivideo = (struct sis_video_info *)sis_fb_info->par; in sisfb_probe()
5820 ivideo->memyselfandi = sis_fb_info; in sisfb_probe()
5822 ivideo->sisfb_id = SISFB_ID; in sisfb_probe()
5825 ivideo->cardnumber = 0; in sisfb_probe()
5828 ivideo->cardnumber = 1; in sisfb_probe()
5830 ivideo->cardnumber++; in sisfb_probe()
5833 strlcpy(ivideo->myid, chipinfo->chip_name, sizeof(ivideo->myid)); in sisfb_probe()
5835 ivideo->warncount = 0; in sisfb_probe()
5836 ivideo->chip_id = pdev->device; in sisfb_probe()
5837 ivideo->chip_vendor = pdev->vendor; in sisfb_probe()
5838 ivideo->revision_id = pdev->revision; in sisfb_probe()
5839 ivideo->SiS_Pr.ChipRevision = ivideo->revision_id; in sisfb_probe()
5841 ivideo->sisvga_enabled = reg16 & 0x01; in sisfb_probe()
5842 ivideo->pcibus = pdev->bus->number; in sisfb_probe()
5843 ivideo->pcislot = PCI_SLOT(pdev->devfn); in sisfb_probe()
5844 ivideo->pcifunc = PCI_FUNC(pdev->devfn); in sisfb_probe()
5845 ivideo->subsysvendor = pdev->subsystem_vendor; in sisfb_probe()
5846 ivideo->subsysdevice = pdev->subsystem_device; in sisfb_probe()
5854 ivideo->chip = chipinfo->chip; in sisfb_probe()
5855 ivideo->chip_real_id = chipinfo->chip; in sisfb_probe()
5856 ivideo->sisvga_engine = chipinfo->vgaengine; in sisfb_probe()
5857 ivideo->hwcursor_size = chipinfo->hwcursor_size; in sisfb_probe()
5858 ivideo->CRT2_write_enable = chipinfo->CRT2_write_enable; in sisfb_probe()
5859 ivideo->mni = chipinfo->mni; in sisfb_probe()
5861 ivideo->detectedpdc = 0xff; in sisfb_probe()
5862 ivideo->detectedpdca = 0xff; in sisfb_probe()
5863 ivideo->detectedlcda = 0xff; in sisfb_probe()
5865 ivideo->sisfb_thismonitor.datavalid = false; in sisfb_probe()
5867 ivideo->current_base = 0; in sisfb_probe()
5869 ivideo->engineok = 0; in sisfb_probe()
5871 ivideo->sisfb_was_boot_device = 0; in sisfb_probe()
5874 if(ivideo->sisvga_enabled) in sisfb_probe()
5875 ivideo->sisfb_was_boot_device = 1; in sisfb_probe()
5884 ivideo->sisfb_parm_mem = sisfb_parm_mem; in sisfb_probe()
5885 ivideo->sisfb_accel = sisfb_accel; in sisfb_probe()
5886 ivideo->sisfb_ypan = sisfb_ypan; in sisfb_probe()
5887 ivideo->sisfb_max = sisfb_max; in sisfb_probe()
5888 ivideo->sisfb_userom = sisfb_userom; in sisfb_probe()
5889 ivideo->sisfb_useoem = sisfb_useoem; in sisfb_probe()
5890 ivideo->sisfb_mode_idx = sisfb_mode_idx; in sisfb_probe()
5891 ivideo->sisfb_parm_rate = sisfb_parm_rate; in sisfb_probe()
5892 ivideo->sisfb_crt1off = sisfb_crt1off; in sisfb_probe()
5893 ivideo->sisfb_forcecrt1 = sisfb_forcecrt1; in sisfb_probe()
5894 ivideo->sisfb_crt2type = sisfb_crt2type; in sisfb_probe()
5895 ivideo->sisfb_crt2flags = sisfb_crt2flags; in sisfb_probe()
5897 ivideo->sisfb_dstn = sisfb_dstn; in sisfb_probe()
5898 ivideo->sisfb_fstn = sisfb_fstn; in sisfb_probe()
5899 ivideo->sisfb_tvplug = sisfb_tvplug; in sisfb_probe()
5900 ivideo->sisfb_tvstd = sisfb_tvstd; in sisfb_probe()
5901 ivideo->tvxpos = sisfb_tvxposoffset; in sisfb_probe()
5902 ivideo->tvypos = sisfb_tvyposoffset; in sisfb_probe()
5903 ivideo->sisfb_nocrt2rate = sisfb_nocrt2rate; in sisfb_probe()
5904 ivideo->refresh_rate = 0; in sisfb_probe()
5905 if(ivideo->sisfb_parm_rate != -1) { in sisfb_probe()
5906 ivideo->refresh_rate = ivideo->sisfb_parm_rate; in sisfb_probe()
5909 ivideo->SiS_Pr.UsePanelScaler = sisfb_scalelcd; in sisfb_probe()
5910 ivideo->SiS_Pr.CenterScreen = -1; in sisfb_probe()
5911 ivideo->SiS_Pr.SiS_CustomT = sisfb_specialtiming; in sisfb_probe()
5912 ivideo->SiS_Pr.LVDSHL = sisfb_lvdshl; in sisfb_probe()
5914 ivideo->SiS_Pr.SiS_Backup70xx = 0xff; in sisfb_probe()
5915 ivideo->SiS_Pr.SiS_CHOverScan = -1; in sisfb_probe()
5916 ivideo->SiS_Pr.SiS_ChSW = false; in sisfb_probe()
5917 ivideo->SiS_Pr.SiS_UseLCDA = false; in sisfb_probe()
5918 ivideo->SiS_Pr.HaveEMI = false; in sisfb_probe()
5919 ivideo->SiS_Pr.HaveEMILCD = false; in sisfb_probe()
5920 ivideo->SiS_Pr.OverruleEMI = false; in sisfb_probe()
5921 ivideo->SiS_Pr.SiS_SensibleSR11 = false; in sisfb_probe()
5922 ivideo->SiS_Pr.SiS_MyCR63 = 0x63; in sisfb_probe()
5923 ivideo->SiS_Pr.PDC = -1; in sisfb_probe()
5924 ivideo->SiS_Pr.PDCA = -1; in sisfb_probe()
5925 ivideo->SiS_Pr.DDCPortMixup = false; in sisfb_probe()
5927 if(ivideo->chip >= SIS_330) { in sisfb_probe()
5928 ivideo->SiS_Pr.SiS_MyCR63 = 0x53; in sisfb_probe()
5929 if(ivideo->chip >= SIS_661) { in sisfb_probe()
5930 ivideo->SiS_Pr.SiS_SensibleSR11 = true; in sisfb_probe()
5935 memcpy(&ivideo->default_var, &my_default_var, sizeof(my_default_var)); in sisfb_probe()
5937 pci_set_drvdata(pdev, ivideo); in sisfb_probe()
5940 if((ivideo->nbridge = sisfb_get_northbridge(ivideo->chip))) { in sisfb_probe()
5941 switch(ivideo->nbridge->device) { in sisfb_probe()
5944 ivideo->chip = SIS_730; in sisfb_probe()
5945 strcpy(ivideo->myid, "SiS 730"); in sisfb_probe()
5951 strcpy(ivideo->myid, "SiS 651"); in sisfb_probe()
5954 ivideo->chip = SIS_740; in sisfb_probe()
5955 strcpy(ivideo->myid, "SiS 740"); in sisfb_probe()
5958 ivideo->chip = SIS_661; in sisfb_probe()
5959 strcpy(ivideo->myid, "SiS 661"); in sisfb_probe()
5962 ivideo->chip = SIS_741; in sisfb_probe()
5963 strcpy(ivideo->myid, "SiS 741"); in sisfb_probe()
5966 ivideo->chip = SIS_760; in sisfb_probe()
5967 strcpy(ivideo->myid, "SiS 760"); in sisfb_probe()
5970 ivideo->chip = SIS_761; in sisfb_probe()
5971 strcpy(ivideo->myid, "SiS 761"); in sisfb_probe()
5979 ivideo->SiS_Pr.ChipType = ivideo->chip; in sisfb_probe()
5981 ivideo->SiS_Pr.ivideo = (void *)ivideo; in sisfb_probe()
5984 if((ivideo->SiS_Pr.ChipType == SIS_315PRO) || in sisfb_probe()
5985 (ivideo->SiS_Pr.ChipType == SIS_315)) { in sisfb_probe()
5986 ivideo->SiS_Pr.ChipType = SIS_315H; in sisfb_probe()
5990 if(!ivideo->sisvga_enabled) { in sisfb_probe()
5992 pci_dev_put(ivideo->nbridge); in sisfb_probe()
5998 ivideo->video_base = pci_resource_start(pdev, 0); in sisfb_probe()
5999 ivideo->video_size = pci_resource_len(pdev, 0); in sisfb_probe()
6000 ivideo->mmio_base = pci_resource_start(pdev, 1); in sisfb_probe()
6001 ivideo->mmio_size = pci_resource_len(pdev, 1); in sisfb_probe()
6002 ivideo->SiS_Pr.RelIO = pci_resource_start(pdev, 2) + 0x30; in sisfb_probe()
6003 ivideo->SiS_Pr.IOAddress = ivideo->vga_base = ivideo->SiS_Pr.RelIO; in sisfb_probe()
6005 SiSRegInit(&ivideo->SiS_Pr, ivideo->SiS_Pr.IOAddress); in sisfb_probe()
6009 if(ivideo->chip == SIS_630) { in sisfb_probe()
6012 if(mychswtable[i].subsysVendor == ivideo->subsysvendor && in sisfb_probe()
6013 mychswtable[i].subsysCard == ivideo->subsysdevice) { in sisfb_probe()
6014 ivideo->SiS_Pr.SiS_ChSW = true; in sisfb_probe()
6019 ivideo->lpcdev = pci_get_device(PCI_VENDOR_ID_SI, 0x0008, NULL); in sisfb_probe()
6028 if((ivideo->chip == SIS_760) && (ivideo->nbridge)) { in sisfb_probe()
6029 ivideo->lpcdev = pci_get_slot(ivideo->nbridge->bus, (2 << 3)); in sisfb_probe()
6035 if( (!ivideo->sisvga_enabled) in sisfb_probe()
6046 ivideo->modeprechange = 0x03; in sisfb_probe()
6049 ivideo->modeprechange = reg & 0x7f; in sisfb_probe()
6050 } else if(ivideo->sisvga_enabled) { in sisfb_probe()
6054 ivideo->modeprechange = readb(tt + 0x49); in sisfb_probe()
6061 ivideo->bios_abase = NULL; in sisfb_probe()
6062 ivideo->SiS_Pr.VirtualRomBase = NULL; in sisfb_probe()
6063 ivideo->SiS_Pr.UseROM = false; in sisfb_probe()
6064 ivideo->haveXGIROM = ivideo->SiS_Pr.SiS_XGIROM = false; in sisfb_probe()
6065 if(ivideo->sisfb_userom) { in sisfb_probe()
6066 ivideo->SiS_Pr.VirtualRomBase = sisfb_find_rom(pdev); in sisfb_probe()
6067 ivideo->bios_abase = ivideo->SiS_Pr.VirtualRomBase; in sisfb_probe()
6068 ivideo->SiS_Pr.UseROM = (bool)(ivideo->SiS_Pr.VirtualRomBase); in sisfb_probe()
6070 ivideo->SiS_Pr.UseROM ? "" : "not "); in sisfb_probe()
6071 if((ivideo->SiS_Pr.UseROM) && (ivideo->chip >= XGI_20)) { in sisfb_probe()
6072 ivideo->SiS_Pr.UseROM = false; in sisfb_probe()
6073 ivideo->haveXGIROM = ivideo->SiS_Pr.SiS_XGIROM = true; in sisfb_probe()
6074 if( (ivideo->revision_id == 2) && in sisfb_probe()
6075 (!(ivideo->bios_abase[0x1d1] & 0x01)) ) { in sisfb_probe()
6076 ivideo->SiS_Pr.DDCPortMixup = true; in sisfb_probe()
6084 if(ivideo->SiS_Pr.SiS_CustomT == CUT_NONE) { in sisfb_probe()
6085 sisfb_detect_custom_timing(ivideo); in sisfb_probe()
6089 if (ivideo->chip == XGI_20) { in sisfb_probe()
6094 ivideo->chip_real_id = XGI_21; in sisfb_probe()
6101 if( (!ivideo->sisvga_enabled) in sisfb_probe()
6107 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_probe()
6108 if(ivideo->chip == SIS_300) { in sisfb_probe()
6110 ivideo->sisfb_can_post = 1; in sisfb_probe()
6116 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_probe()
6123 } else */ if(ivideo->chip == XGI_20) { in sisfb_probe()
6125 ivideo->sisfb_can_post = 1; in sisfb_probe()
6126 } else if((ivideo->chip == XGI_40) && ivideo->haveXGIROM) { in sisfb_probe()
6128 ivideo->sisfb_can_post = 1; in sisfb_probe()
6142 ivideo->sisfb_card_posted = 1; in sisfb_probe()
6145 if(sisfb_get_dram_size(ivideo)) { in sisfb_probe()
6153 if((ivideo->sisfb_mode_idx < 0) || in sisfb_probe()
6154 ((sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]) != 0xFF)) { in sisfb_probe()
6162 if(ivideo->sisvga_engine == SIS_300_VGA) in sisfb_probe()
6166 ivideo->SiS_Pr.PDC = sisfb_pdc; in sisfb_probe()
6169 if(ivideo->sisvga_engine == SIS_315_VGA) { in sisfb_probe()
6171 ivideo->SiS_Pr.PDCA = sisfb_pdca & 0x1f; in sisfb_probe()
6175 if(!request_mem_region(ivideo->video_base, ivideo->video_size, "sisfb FB")) { in sisfb_probe()
6177 (int)(ivideo->video_size >> 20)); in sisfb_probe()
6183 if(!request_mem_region(ivideo->mmio_base, ivideo->mmio_size, "sisfb MMIO")) { in sisfb_probe()
6189 ivideo->video_vbase = ioremap(ivideo->video_base, ivideo->video_size); in sisfb_probe()
6190 ivideo->SiS_Pr.VideoMemoryAddress = ivideo->video_vbase; in sisfb_probe()
6191 if(!ivideo->video_vbase) { in sisfb_probe()
6197 ivideo->mmio_vbase = ioremap(ivideo->mmio_base, ivideo->mmio_size); in sisfb_probe()
6198 if(!ivideo->mmio_vbase) { in sisfb_probe()
6201 error_0: iounmap(ivideo->video_vbase); in sisfb_probe()
6202 error_1: release_mem_region(ivideo->video_base, ivideo->video_size); in sisfb_probe()
6203 error_2: release_mem_region(ivideo->mmio_base, ivideo->mmio_size); in sisfb_probe()
6204 error_3: vfree(ivideo->bios_abase); in sisfb_probe()
6205 pci_dev_put(ivideo->lpcdev); in sisfb_probe()
6206 pci_dev_put(ivideo->nbridge); in sisfb_probe()
6207 if(!ivideo->sisvga_enabled) in sisfb_probe()
6214 ivideo->video_base, (unsigned long)ivideo->video_vbase, ivideo->video_size / 1024); in sisfb_probe()
6216 if(ivideo->video_offset) { in sisfb_probe()
6218 ivideo->video_offset / 1024); in sisfb_probe()
6222 ivideo->mmio_base, (unsigned long)ivideo->mmio_vbase, ivideo->mmio_size / 1024); in sisfb_probe()
6226 if(ivideo->sisvga_engine == SIS_300_VGA) { in sisfb_probe()
6227 ivideo->cmdQueueSize = TURBO_QUEUE_AREA_SIZE; in sisfb_probe()
6229 if(ivideo->chip == XGI_20) { in sisfb_probe()
6230 ivideo->cmdQueueSize = COMMAND_QUEUE_AREA_SIZE_Z7; in sisfb_probe()
6232 ivideo->cmdQueueSize = COMMAND_QUEUE_AREA_SIZE; in sisfb_probe()
6242 ivideo->hwcursor_vbase = ivideo->video_vbase in sisfb_probe()
6243 + ivideo->video_size in sisfb_probe()
6244 - ivideo->cmdQueueSize in sisfb_probe()
6245 - ivideo->hwcursor_size; in sisfb_probe()
6246 ivideo->caps |= HW_CURSOR_CAP; in sisfb_probe()
6249 if((ivideo->havenoheap = sisfb_heap_init(ivideo))) { in sisfb_probe()
6254 ivideo->SiS_Pr.VideoMemoryAddress += ivideo->video_offset; in sisfb_probe()
6255 ivideo->SiS_Pr.VideoMemorySize = ivideo->sisfb_mem; in sisfb_probe()
6257 ivideo->mtrr = -1; in sisfb_probe()
6259 ivideo->vbflags = 0; in sisfb_probe()
6260 ivideo->lcddefmodeidx = DEFAULT_LCDMODE; in sisfb_probe()
6261 ivideo->tvdefmodeidx = DEFAULT_TVMODE; in sisfb_probe()
6262 ivideo->defmodeidx = DEFAULT_MODE; in sisfb_probe()
6264 ivideo->newrom = 0; in sisfb_probe()
6265 if(ivideo->chip < XGI_20) { in sisfb_probe()
6266 if(ivideo->bios_abase) { in sisfb_probe()
6267 ivideo->newrom = SiSDetermineROMLayout661(&ivideo->SiS_Pr); in sisfb_probe()
6271 if((ivideo->sisfb_mode_idx < 0) || in sisfb_probe()
6272 ((sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]) != 0xFF)) { in sisfb_probe()
6274 sisfb_sense_crt1(ivideo); in sisfb_probe()
6276 sisfb_get_VB_type(ivideo); in sisfb_probe()
6278 if(ivideo->vbflags2 & VB2_VIDEOBRIDGE) { in sisfb_probe()
6279 sisfb_detect_VB_connect(ivideo); in sisfb_probe()
6282 ivideo->currentvbflags = ivideo->vbflags & (VB_VIDEOBRIDGE | TV_STANDARD); in sisfb_probe()
6285 if(ivideo->vbflags2 & VB2_VIDEOBRIDGE) { in sisfb_probe()
6286 if(ivideo->sisfb_crt2type != -1) { in sisfb_probe()
6287 if((ivideo->sisfb_crt2type == CRT2_LCD) && in sisfb_probe()
6288 (ivideo->vbflags & CRT2_LCD)) { in sisfb_probe()
6289 ivideo->currentvbflags |= CRT2_LCD; in sisfb_probe()
6290 } else if(ivideo->sisfb_crt2type != CRT2_LCD) { in sisfb_probe()
6291 ivideo->currentvbflags |= ivideo->sisfb_crt2type; in sisfb_probe()
6297 if((ivideo->sisvga_engine == SIS_300_VGA) && in sisfb_probe()
6298 (ivideo->vbflags2 & VB2_CHRONTEL)) { in sisfb_probe()
6299 if(ivideo->vbflags & CRT2_LCD) in sisfb_probe()
6300 ivideo->currentvbflags |= CRT2_LCD; in sisfb_probe()
6301 else if(ivideo->vbflags & CRT2_TV) in sisfb_probe()
6302 ivideo->currentvbflags |= CRT2_TV; in sisfb_probe()
6303 else if(ivideo->vbflags & CRT2_VGA) in sisfb_probe()
6304 ivideo->currentvbflags |= CRT2_VGA; in sisfb_probe()
6306 if(ivideo->vbflags & CRT2_TV) in sisfb_probe()
6307 ivideo->currentvbflags |= CRT2_TV; in sisfb_probe()
6308 else if(ivideo->vbflags & CRT2_LCD) in sisfb_probe()
6309 ivideo->currentvbflags |= CRT2_LCD; in sisfb_probe()
6310 else if(ivideo->vbflags & CRT2_VGA) in sisfb_probe()
6311 ivideo->currentvbflags |= CRT2_VGA; in sisfb_probe()
6316 if(ivideo->vbflags & CRT2_LCD) { in sisfb_probe()
6317 sisfb_detect_lcd_type(ivideo); in sisfb_probe()
6320 sisfb_save_pdc_emi(ivideo); in sisfb_probe()
6322 if(!ivideo->sisfb_crt1off) { in sisfb_probe()
6323 sisfb_handle_ddc(ivideo, &ivideo->sisfb_thismonitor, 0); in sisfb_probe()
6325 if((ivideo->vbflags2 & VB2_SISTMDSBRIDGE) && in sisfb_probe()
6326 (ivideo->vbflags & (CRT2_VGA | CRT2_LCD))) { in sisfb_probe()
6327 sisfb_handle_ddc(ivideo, &ivideo->sisfb_thismonitor, 1); in sisfb_probe()
6331 if(ivideo->sisfb_mode_idx >= 0) { in sisfb_probe()
6332 int bu = ivideo->sisfb_mode_idx; in sisfb_probe()
6333 ivideo->sisfb_mode_idx = sisfb_validate_mode(ivideo, in sisfb_probe()
6334 ivideo->sisfb_mode_idx, ivideo->currentvbflags); in sisfb_probe()
6335 if(bu != ivideo->sisfb_mode_idx) { in sisfb_probe()
6343 if(ivideo->sisfb_mode_idx < 0) { in sisfb_probe()
6344 switch(ivideo->currentvbflags & VB_DISPTYPE_DISP2) { in sisfb_probe()
6346 ivideo->sisfb_mode_idx = ivideo->lcddefmodeidx; in sisfb_probe()
6349 ivideo->sisfb_mode_idx = ivideo->tvdefmodeidx; in sisfb_probe()
6352 ivideo->sisfb_mode_idx = ivideo->defmodeidx; in sisfb_probe()
6357 ivideo->mode_no = sisbios_mode[ivideo->sisfb_mode_idx].mode_no[ivideo->mni]; in sisfb_probe()
6359 if(ivideo->refresh_rate != 0) { in sisfb_probe()
6360 sisfb_search_refresh_rate(ivideo, ivideo->refresh_rate, in sisfb_probe()
6361 ivideo->sisfb_mode_idx); in sisfb_probe()
6364 if(ivideo->rate_idx == 0) { in sisfb_probe()
6365 ivideo->rate_idx = sisbios_mode[ivideo->sisfb_mode_idx].rate_idx; in sisfb_probe()
6366 ivideo->refresh_rate = 60; in sisfb_probe()
6369 if(ivideo->sisfb_thismonitor.datavalid) { in sisfb_probe()
6370 if(!sisfb_verify_rate(ivideo, &ivideo->sisfb_thismonitor, in sisfb_probe()
6371 ivideo->sisfb_mode_idx, in sisfb_probe()
6372 ivideo->rate_idx, in sisfb_probe()
6373 ivideo->refresh_rate)) { in sisfb_probe()
6379 ivideo->video_bpp = sisbios_mode[ivideo->sisfb_mode_idx].bpp; in sisfb_probe()
6380 ivideo->video_width = sisbios_mode[ivideo->sisfb_mode_idx].xres; in sisfb_probe()
6381 ivideo->video_height = sisbios_mode[ivideo->sisfb_mode_idx].yres; in sisfb_probe()
6383 sisfb_set_vparms(ivideo); in sisfb_probe()
6386 ivideo->video_width, ivideo->video_height, ivideo->video_bpp, in sisfb_probe()
6387 ivideo->refresh_rate); in sisfb_probe()
6390 ivideo->default_var.xres = ivideo->default_var.xres_virtual = ivideo->video_width; in sisfb_probe()
6391 ivideo->default_var.yres = ivideo->default_var.yres_virtual = ivideo->video_height; in sisfb_probe()
6392 ivideo->default_var.bits_per_pixel = ivideo->video_bpp; in sisfb_probe()
6394 sisfb_bpp_to_var(ivideo, &ivideo->default_var); in sisfb_probe()
6396 ivideo->default_var.pixclock = (u32) (1000000000 / in sisfb_probe()
6397 sisfb_mode_rate_to_dclock(&ivideo->SiS_Pr, ivideo->mode_no, ivideo->rate_idx)); in sisfb_probe()
6399 if(sisfb_mode_rate_to_ddata(&ivideo->SiS_Pr, ivideo->mode_no, in sisfb_probe()
6400 ivideo->rate_idx, &ivideo->default_var)) { in sisfb_probe()
6401 if((ivideo->default_var.vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) { in sisfb_probe()
6402 ivideo->default_var.pixclock <<= 1; in sisfb_probe()
6406 if(ivideo->sisfb_ypan) { in sisfb_probe()
6408 ivideo->default_var.yres_virtual = in sisfb_probe()
6409 sisfb_calc_maxyres(ivideo, &ivideo->default_var); in sisfb_probe()
6410 if(ivideo->default_var.yres_virtual < ivideo->default_var.yres) { in sisfb_probe()
6411 ivideo->default_var.yres_virtual = ivideo->default_var.yres; in sisfb_probe()
6415 sisfb_calc_pitch(ivideo, &ivideo->default_var); in sisfb_probe()
6417 ivideo->accel = 0; in sisfb_probe()
6418 if(ivideo->sisfb_accel) { in sisfb_probe()
6419 ivideo->accel = -1; in sisfb_probe()
6421 ivideo->default_var.accel_flags |= FB_ACCELF_TEXT; in sisfb_probe()
6424 sisfb_initaccel(ivideo); in sisfb_probe()
6432 ((ivideo->accel) ? 0 : FBINFO_HWACCEL_DISABLED); in sisfb_probe()
6436 sis_fb_info->var = ivideo->default_var; in sisfb_probe()
6437 sis_fb_info->fix = ivideo->sisfb_fix; in sisfb_probe()
6438 sis_fb_info->screen_base = ivideo->video_vbase + ivideo->video_offset; in sisfb_probe()
6440 sis_fb_info->pseudo_palette = ivideo->pseudo_palette; in sisfb_probe()
6444 printk(KERN_DEBUG "sisfb: Initial vbflags 0x%x\n", (int)ivideo->vbflags); in sisfb_probe()
6447 ivideo->mtrr = mtrr_add(ivideo->video_base, ivideo->video_size, in sisfb_probe()
6449 if(ivideo->mtrr < 0) { in sisfb_probe()
6457 iounmap(ivideo->mmio_vbase); in sisfb_probe()
6461 ivideo->registered = 1; in sisfb_probe()
6464 ivideo->next = card_list; in sisfb_probe()
6465 card_list = ivideo; in sisfb_probe()
6468 ivideo->sisfb_accel ? "enabled" : "disabled", in sisfb_probe()
6469 ivideo->sisfb_ypan ? in sisfb_probe()
6470 (ivideo->sisfb_max ? "enabled (auto-max)" : in sisfb_probe()
6476 ivideo->myid, VER_MAJOR, VER_MINOR, VER_LEVEL); in sisfb_probe()
6491 struct sis_video_info *ivideo = pci_get_drvdata(pdev); in sisfb_remove() local
6492 struct fb_info *sis_fb_info = ivideo->memyselfandi; in sisfb_remove()
6493 int registered = ivideo->registered; in sisfb_remove()
6494 int modechanged = ivideo->modechanged; in sisfb_remove()
6497 iounmap(ivideo->mmio_vbase); in sisfb_remove()
6498 iounmap(ivideo->video_vbase); in sisfb_remove()
6501 release_mem_region(ivideo->video_base, ivideo->video_size); in sisfb_remove()
6502 release_mem_region(ivideo->mmio_base, ivideo->mmio_size); in sisfb_remove()
6504 vfree(ivideo->bios_abase); in sisfb_remove()
6506 pci_dev_put(ivideo->lpcdev); in sisfb_remove()
6508 pci_dev_put(ivideo->nbridge); in sisfb_remove()
6512 if(ivideo->mtrr >= 0) in sisfb_remove()
6513 mtrr_del(ivideo->mtrr, ivideo->video_base, ivideo->video_size); in sisfb_remove()
6519 if(!ivideo->sisvga_enabled) in sisfb_remove()
6523 if(ivideo->registered) { in sisfb_remove()