Lines Matching +full:max +full:- +full:pixelclock
2 * linux/drivers/video/atafb.c -- Atari builtin chipset frame buffer device
11 * - 03 Jan 95: Original version by Martin Schaller: The TT driver and
13 * - 09 Jan 95: Roman: I've added the hardware abstraction (hw_switch)
16 * - 07 May 95: Martin: Added colormap operations for the external driver
17 * - 21 May 95: Martin: Added support for overscan
19 * - Jul 95: Guenther Kelleter <guenther@pool.informatik.rwth-aachen.de>:
23 * - 27 Dec 95: Guenther: Implemented user definable video modes "user[0-7]"
28 * - 23 Sep 97: Juergen: added xres_virtual for cards like ProMST
29 * The external-part is legacy, therefore hardware-specific
32 * - 29 Sep 97: Juergen: added Romans suggestion for pan_display
33 * (var->xoffset was changed even if no set_screen_base avail.)
34 * - 05 Oct 97: Juergen: extfb (PACKED_PIXEL) is FB_PSEUDOCOLOR 'cause
40 * - For the Falcon it is not possible to set random video modes on
84 static int hwscroll = -1;
185 * not needed - atafb will never support panning/hardwarescroll with external
253 * * set the video mode according to info->var *
339 * succeeded, !=0 if un-/blanking failed due to e.g. a video mode which
394 * yres_virtual == 0 means use hw-scrolling if possible, else yres
397 0, 0, 0, 0, 0, 0, 0, 0, /* xres-grayscale */
399 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
403 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
407 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
411 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
415 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
419 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
423 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
427 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
431 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
435 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
439 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
443 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
447 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
465 "st-low", 60, 320, 200, 32000, 32, 16, 31, 14, 96, 4,
469 "st-mid", 60, 640, 200, 32000, 32, 16, 31, 14, 96, 4,
473 "st-high", 63, 640, 400, 32000, 128, 0, 40, 14, 128, 4,
477 "tt-low", 60, 320, 480, 31041, 120, 100, 8, 16, 140, 30,
481 "tt-mid", 60, 640, 480, 31041, 120, 100, 8, 16, 140, 30,
485 "tt-high", 72, 1280, 960, 7760, 260, 60, 36, 4, 192, 4,
520 #define DEFMODE_TT 5 /* "tt-high" for TT */
522 #define DEFMODE_STE 2 /* "st-high" for ST/E */
548 /* ------------------- TT specific functions ---------------------- */
556 strcpy(fix->id, "Atari Builtin"); in tt_encode_fix()
557 fix->smem_start = phys_screen_base; in tt_encode_fix()
558 fix->smem_len = screen_len; in tt_encode_fix()
559 fix->type = FB_TYPE_INTERLEAVED_PLANES; in tt_encode_fix()
560 fix->type_aux = 2; in tt_encode_fix()
561 fix->visual = FB_VISUAL_PSEUDOCOLOR; in tt_encode_fix()
562 mode = par->hw.tt.mode & TT_SHIFTER_MODEMASK; in tt_encode_fix()
564 fix->type = FB_TYPE_PACKED_PIXELS; in tt_encode_fix()
565 fix->type_aux = 0; in tt_encode_fix()
567 fix->visual = FB_VISUAL_MONO01; in tt_encode_fix()
569 fix->xpanstep = 0; in tt_encode_fix()
570 fix->ypanstep = 1; in tt_encode_fix()
571 fix->ywrapstep = 0; in tt_encode_fix()
572 fix->line_length = par->next_line; in tt_encode_fix()
573 fix->accel = FB_ACCEL_ATARIBLITT; in tt_encode_fix()
579 int xres = var->xres; in tt_decode_var()
580 int yres = var->yres; in tt_decode_var()
581 int bpp = var->bits_per_pixel; in tt_decode_var()
583 int yres_virtual = var->yres_virtual; in tt_decode_var()
587 return -EINVAL; in tt_decode_var()
588 par->hw.tt.mode = TT_SHIFTER_TTHIGH; in tt_decode_var()
594 return -EINVAL; in tt_decode_var()
597 return -EINVAL; in tt_decode_var()
598 par->hw.tt.mode = TT_SHIFTER_TTLOW; in tt_decode_var()
604 return -EINVAL; in tt_decode_var()
606 par->hw.tt.mode = TT_SHIFTER_TTMID; in tt_decode_var()
611 par->hw.tt.mode = TT_SHIFTER_STLOW; in tt_decode_var()
618 return -EINVAL; in tt_decode_var()
619 par->hw.tt.mode = TT_SHIFTER_STMID; in tt_decode_var()
623 } else if (var->xres > sttt_xres || var->yres > st_yres) { in tt_decode_var()
624 return -EINVAL; in tt_decode_var()
626 par->hw.tt.mode = TT_SHIFTER_STHIGH; in tt_decode_var()
636 if (var->sync & FB_SYNC_EXT) in tt_decode_var()
637 par->hw.tt.sync = 0; in tt_decode_var()
639 par->hw.tt.sync = 1; in tt_decode_var()
642 return -EINVAL; in tt_decode_var()
644 return -EINVAL; in tt_decode_var()
645 if (var->yoffset + yres > yres_virtual && yres_virtual) in tt_decode_var()
646 return -EINVAL; in tt_decode_var()
647 par->yres_virtual = yres_virtual; in tt_decode_var()
648 par->screen_base = screen_base + var->yoffset * linelen; in tt_decode_var()
649 par->next_line = linelen; in tt_decode_var()
657 var->red.offset = 0; in tt_encode_var()
658 var->red.length = 4; in tt_encode_var()
659 var->red.msb_right = 0; in tt_encode_var()
660 var->grayscale = 0; in tt_encode_var()
662 var->pixclock = 31041; in tt_encode_var()
663 var->left_margin = 120; /* these may be incorrect */ in tt_encode_var()
664 var->right_margin = 100; in tt_encode_var()
665 var->upper_margin = 8; in tt_encode_var()
666 var->lower_margin = 16; in tt_encode_var()
667 var->hsync_len = 140; in tt_encode_var()
668 var->vsync_len = 30; in tt_encode_var()
670 var->height = -1; in tt_encode_var()
671 var->width = -1; in tt_encode_var()
673 if (par->hw.tt.sync & 1) in tt_encode_var()
674 var->sync = 0; in tt_encode_var()
676 var->sync = FB_SYNC_EXT; in tt_encode_var()
678 switch (par->hw.tt.mode & TT_SHIFTER_MODEMASK) { in tt_encode_var()
680 var->xres = sttt_xres / 2; in tt_encode_var()
681 var->xres_virtual = sttt_xres_virtual / 2; in tt_encode_var()
682 var->yres = st_yres / 2; in tt_encode_var()
683 var->bits_per_pixel = 4; in tt_encode_var()
686 var->xres = sttt_xres; in tt_encode_var()
687 var->xres_virtual = sttt_xres_virtual; in tt_encode_var()
688 var->yres = st_yres / 2; in tt_encode_var()
689 var->bits_per_pixel = 2; in tt_encode_var()
692 var->xres = sttt_xres; in tt_encode_var()
693 var->xres_virtual = sttt_xres_virtual; in tt_encode_var()
694 var->yres = st_yres; in tt_encode_var()
695 var->bits_per_pixel = 1; in tt_encode_var()
698 var->xres = sttt_xres / 2; in tt_encode_var()
699 var->xres_virtual = sttt_xres_virtual / 2; in tt_encode_var()
700 var->yres = tt_yres; in tt_encode_var()
701 var->bits_per_pixel = 8; in tt_encode_var()
704 var->xres = sttt_xres; in tt_encode_var()
705 var->xres_virtual = sttt_xres_virtual; in tt_encode_var()
706 var->yres = tt_yres; in tt_encode_var()
707 var->bits_per_pixel = 4; in tt_encode_var()
710 var->red.length = 0; in tt_encode_var()
711 var->xres = sttt_xres * 2; in tt_encode_var()
712 var->xres_virtual = sttt_xres_virtual * 2; in tt_encode_var()
713 var->yres = tt_yres * 2; in tt_encode_var()
714 var->bits_per_pixel = 1; in tt_encode_var()
717 var->blue = var->green = var->red; in tt_encode_var()
718 var->transp.offset = 0; in tt_encode_var()
719 var->transp.length = 0; in tt_encode_var()
720 var->transp.msb_right = 0; in tt_encode_var()
721 linelen = var->xres_virtual * var->bits_per_pixel / 8; in tt_encode_var()
723 var->yres_virtual = var->yres; in tt_encode_var()
725 if (par->yres_virtual) in tt_encode_var()
726 var->yres_virtual = par->yres_virtual; in tt_encode_var()
729 var->yres_virtual = screen_len / linelen; in tt_encode_var()
732 var->yres_virtual = 2 * var->yres; in tt_encode_var()
734 var->yres_virtual = var->yres + hwscroll * 16; in tt_encode_var()
736 var->xoffset = 0; in tt_encode_var()
738 var->yoffset = (par->screen_base - screen_base) / linelen; in tt_encode_var()
740 var->yoffset = 0; in tt_encode_var()
741 var->nonstd = 0; in tt_encode_var()
742 var->activate = 0; in tt_encode_var()
743 var->vmode = FB_VMODE_NONINTERLACED; in tt_encode_var()
750 par->hw.tt.mode = shifter_tt.tt_shiftmode; in tt_get_par()
751 par->hw.tt.sync = shifter_st.syncmode; in tt_get_par()
755 par->screen_base = atari_stram_to_virt(addr); in tt_get_par()
760 shifter_tt.tt_shiftmode = par->hw.tt.mode; in tt_set_par()
761 shifter_st.syncmode = par->hw.tt.sync; in tt_set_par()
763 if (current_par.screen_base != par->screen_base) in tt_set_par()
764 fbhw->set_screen_base(par->screen_base); in tt_set_par()
809 /* ------------------- Falcon specific functions ---------------------- */
825 int sync_mask; /* or-mask for hw.falcon.sync to set this clock */
835 /* VIDEL-prescale values [mon_type][pixel_length from VCO] */
845 return hw->ste_mode ? 16 in hxx_prescale()
846 : vdl_prescale[mon_type][hw->vid_mode >> 2 & 0x3]; in hxx_prescale()
852 strcpy(fix->id, "Atari Builtin"); in falcon_encode_fix()
853 fix->smem_start = phys_screen_base; in falcon_encode_fix()
854 fix->smem_len = screen_len; in falcon_encode_fix()
855 fix->type = FB_TYPE_INTERLEAVED_PLANES; in falcon_encode_fix()
856 fix->type_aux = 2; in falcon_encode_fix()
857 fix->visual = FB_VISUAL_PSEUDOCOLOR; in falcon_encode_fix()
858 fix->xpanstep = 1; in falcon_encode_fix()
859 fix->ypanstep = 1; in falcon_encode_fix()
860 fix->ywrapstep = 0; in falcon_encode_fix()
861 if (par->hw.falcon.mono) { in falcon_encode_fix()
862 fix->type = FB_TYPE_PACKED_PIXELS; in falcon_encode_fix()
863 fix->type_aux = 0; in falcon_encode_fix()
865 fix->xpanstep = 32; in falcon_encode_fix()
866 } else if (par->hw.falcon.f_shift & 0x100) { in falcon_encode_fix()
867 fix->type = FB_TYPE_PACKED_PIXELS; in falcon_encode_fix()
868 fix->type_aux = 0; in falcon_encode_fix()
870 fix->visual = FB_VISUAL_TRUECOLOR; in falcon_encode_fix()
871 fix->xpanstep = 2; in falcon_encode_fix()
873 fix->line_length = par->next_line; in falcon_encode_fix()
874 fix->accel = FB_ACCEL_ATARIBLITT; in falcon_encode_fix()
881 int bpp = var->bits_per_pixel; in falcon_decode_var()
882 int xres = var->xres; in falcon_decode_var()
883 int yres = var->yres; in falcon_decode_var()
884 int xres_virtual = var->xres_virtual; in falcon_decode_var()
885 int yres_virtual = var->yres_virtual; in falcon_decode_var()
906 There is a maximum of screen resolution determined by pixelclock in falcon_decode_var()
907 and minimum frame rate -- (X+hmarg.)*(Y+vmarg.)*vfmin <= pixelclock. in falcon_decode_var()
908 In interlace mode this is " * " *vfmin <= pixelclock. in falcon_decode_var()
923 return -EINVAL; in falcon_decode_var()
926 return -EINVAL; in falcon_decode_var()
930 par->hw.falcon.f_shift = 0x400; in falcon_decode_var()
931 par->hw.falcon.st_shift = 0x200; in falcon_decode_var()
934 par->hw.falcon.f_shift = 0x000; in falcon_decode_var()
935 par->hw.falcon.st_shift = 0x100; in falcon_decode_var()
938 par->hw.falcon.f_shift = 0x000; in falcon_decode_var()
939 par->hw.falcon.st_shift = 0x000; in falcon_decode_var()
942 par->hw.falcon.f_shift = 0x010; in falcon_decode_var()
945 par->hw.falcon.f_shift = 0x100; /* hicolor, no overlay */ in falcon_decode_var()
947 return -EINVAL; in falcon_decode_var()
948 par->hw.falcon.bpp = bpp; in falcon_decode_var()
954 if (bpp > myvar->bits_per_pixel || in falcon_decode_var()
955 var->xres > myvar->xres || in falcon_decode_var()
956 var->yres > myvar->yres) in falcon_decode_var()
957 return -EINVAL; in falcon_decode_var()
958 fbhw->get_par(par); /* Current par will be new par */ in falcon_decode_var()
975 par->hw.falcon.ste_mode = bpp == 2; in falcon_decode_var()
976 par->hw.falcon.mono = bpp == 1; in falcon_decode_var()
986 if (par->hw.falcon.ste_mode) in falcon_decode_var()
1009 par->hw.falcon.line_width = bpp * xres / 16; in falcon_decode_var()
1010 par->hw.falcon.line_offset = bpp * (xres_virtual - xres) / 16; in falcon_decode_var()
1018 return -EINVAL; in falcon_decode_var()
1021 /* SM124-mode is special */ in falcon_decode_var()
1022 par->hw.falcon.ste_mode = 1; in falcon_decode_var()
1023 par->hw.falcon.f_shift = 0x000; in falcon_decode_var()
1024 par->hw.falcon.st_shift = 0x200; in falcon_decode_var()
1032 if (var->pixclock > f32.t * plen) in falcon_decode_var()
1033 return -EINVAL; in falcon_decode_var()
1037 if (var->pixclock == 0) { in falcon_decode_var()
1041 hsync_len = pclock->hsync / plen; in falcon_decode_var()
1046 left_margin = var->left_margin; in falcon_decode_var()
1047 right_margin = var->right_margin; in falcon_decode_var()
1048 hsync_len = var->hsync_len; in falcon_decode_var()
1049 upper_margin = var->upper_margin; in falcon_decode_var()
1050 lower_margin = var->lower_margin; in falcon_decode_var()
1051 vsync_len = var->vsync_len; in falcon_decode_var()
1052 if (var->vmode & FB_VMODE_INTERLACED) { in falcon_decode_var()
1056 } else if (var->vmode & FB_VMODE_DOUBLE) { in falcon_decode_var()
1065 /* Default values are used for vert./hor. timing if no pixelclock given. */ in falcon_decode_var()
1066 if (var->pixclock == 0) { in falcon_decode_var()
1067 /* Choose master pixelclock depending on hor. timing */ in falcon_decode_var()
1070 info->monspecs.hfmin < f25.f) in falcon_decode_var()
1073 f32.left) * info->monspecs.hfmin < f32.f) in falcon_decode_var()
1076 fext.left) * info->monspecs.hfmin < fext.f && in falcon_decode_var()
1080 return -EINVAL; in falcon_decode_var()
1082 left_margin = pclock->left / plen; in falcon_decode_var()
1083 right_margin = pclock->right / plen; in falcon_decode_var()
1084 hsync_len = pclock->hsync / plen; in falcon_decode_var()
1089 /* Choose largest pixelclock <= wanted clock */ in falcon_decode_var()
1094 if (f25.t * i >= var->pixclock && in falcon_decode_var()
1099 if (f32.t * i >= var->pixclock && in falcon_decode_var()
1104 if (fext.t && fext.t * i >= var->pixclock && in falcon_decode_var()
1111 return -EINVAL; in falcon_decode_var()
1112 plen = pcl / pclock->t; in falcon_decode_var()
1114 left_margin = var->left_margin; in falcon_decode_var()
1115 right_margin = var->right_margin; in falcon_decode_var()
1116 hsync_len = var->hsync_len; in falcon_decode_var()
1117 upper_margin = var->upper_margin; in falcon_decode_var()
1118 lower_margin = var->lower_margin; in falcon_decode_var()
1119 vsync_len = var->vsync_len; in falcon_decode_var()
1120 /* Internal unit is [single lines per (half-)frame] */ in falcon_decode_var()
1121 if (var->vmode & FB_VMODE_INTERLACED) { in falcon_decode_var()
1127 } else if (var->vmode & FB_VMODE_DOUBLE) { in falcon_decode_var()
1139 if (pclock->f / plen / 8 * bpp > 32000000L) in falcon_decode_var()
1140 return -EINVAL; in falcon_decode_var()
1150 * (which is a full frame in non-interlace mode), so we can switch in falcon_decode_var()
1151 * between interlace and non-interlace without messing around in falcon_decode_var()
1156 par->hw.falcon.vid_control = mon_type | f030_bus_width; in falcon_decode_var()
1158 par->hw.falcon.vid_control |= VCO_SHORTOFFS; /* base_offset 64 */ in falcon_decode_var()
1159 if (var->sync & FB_SYNC_HOR_HIGH_ACT) in falcon_decode_var()
1160 par->hw.falcon.vid_control |= VCO_HSYPOS; in falcon_decode_var()
1161 if (var->sync & FB_SYNC_VERT_HIGH_ACT) in falcon_decode_var()
1162 par->hw.falcon.vid_control |= VCO_VSYPOS; in falcon_decode_var()
1163 /* Pixelclock */ in falcon_decode_var()
1164 par->hw.falcon.vid_control |= pclock->control_mask; in falcon_decode_var()
1166 par->hw.falcon.sync = pclock->sync_mask | 0x2; in falcon_decode_var()
1168 par->hw.falcon.vid_mode = (2 / plen) << 2; in falcon_decode_var()
1170 par->hw.falcon.vid_mode |= VMO_DOUBLE; in falcon_decode_var()
1172 par->hw.falcon.vid_mode |= VMO_INTER; in falcon_decode_var()
1176 * unit of hxx-registers: [master clock cycles * prescale] in falcon_decode_var()
1177 * Hxx-registers are 9 bit wide in falcon_decode_var()
1182 * ((hht + 2) * 2 - hdb + hde) * prescale - hdboff + hdeoff: in falcon_decode_var()
1183 * (hht + 2 - hdb + hde) * prescale - hdboff + hdeoff in falcon_decode_var()
1188 * (hdb - hht - 2) * prescale + hdboff : in falcon_decode_var()
1196 prescale = hxx_prescale(&par->hw.falcon); in falcon_decode_var()
1197 base_off = par->hw.falcon.vid_control & VCO_SHORTOFFS ? 64 : 128; in falcon_decode_var()
1201 * calculate hd[be]-registers in falcon_decode_var()
1203 if (par->hw.falcon.f_shift & 0x100) { in falcon_decode_var()
1210 if (par->hw.falcon.ste_mode) in falcon_decode_var()
1217 /* gend1 is for hde (gend-gstart multiple of align), shifter's xres */ in falcon_decode_var()
1221 par->HHT = plen * (left_margin + xres + right_margin) / in falcon_decode_var()
1222 (2 * prescale) - 2; in falcon_decode_var()
1223 /* par->HHT = (gend2 + plen * right_margin / prescale) / 2 - 2;*/ in falcon_decode_var()
1225 par->HDB = gstart - hdb_off / prescale; in falcon_decode_var()
1226 par->HBE = gstart; in falcon_decode_var()
1227 if (par->HDB < 0) in falcon_decode_var()
1228 par->HDB += par->HHT + 2 + 0x200; in falcon_decode_var()
1229 par->HDE = gend1 - par->HHT - 2 - hde_off / prescale; in falcon_decode_var()
1230 par->HBB = gend2 - par->HHT - 2; in falcon_decode_var()
1233 if ((par->HDB & 0x200) && (par->HDB & ~0x200) - par->HDE <= 5) { in falcon_decode_var()
1238 par->HBB++; /* compensate for non matching hde and hbb */ in falcon_decode_var()
1239 par->HSS = par->HHT + 2 - plen * hsync_len / prescale; in falcon_decode_var()
1240 if (par->HSS < par->HBB) in falcon_decode_var()
1241 par->HSS = par->HBB; in falcon_decode_var()
1245 hfreq = pclock->f / ((par->HHT + 2) * prescale * 2); in falcon_decode_var()
1246 if (hfreq > info->monspecs.hfmax && mon_type != F_MON_VGA) { in falcon_decode_var()
1248 /* Too high -> enlarge margin */ in falcon_decode_var()
1253 if (hfreq > info->monspecs.hfmax || hfreq < info->monspecs.hfmin) in falcon_decode_var()
1254 return -EINVAL; in falcon_decode_var()
1256 /* Vxx-registers */ in falcon_decode_var()
1257 /* All Vxx must be odd in non-interlace, since frame starts in the middle in falcon_decode_var()
1260 * non-interlace, odd in interlace mode for synchronisation. in falcon_decode_var()
1261 * Vxx-registers are 11 bit wide in falcon_decode_var()
1263 par->VBE = (upper_margin * 2 + 1); /* must begin on odd halfline */ in falcon_decode_var()
1264 par->VDB = par->VBE; in falcon_decode_var()
1265 par->VDE = yres; in falcon_decode_var()
1267 par->VDE <<= 1; in falcon_decode_var()
1269 par->VDE <<= 1; /* VDE now half lines per (half-)frame */ in falcon_decode_var()
1270 par->VDE += par->VDB; in falcon_decode_var()
1271 par->VBB = par->VDE; in falcon_decode_var()
1272 par->VFT = par->VBB + (lower_margin * 2 - 1) - 1; in falcon_decode_var()
1273 par->VSS = par->VFT + 1 - (vsync_len * 2 - 1); in falcon_decode_var()
1276 par->VBB++; in falcon_decode_var()
1277 par->VSS++; in falcon_decode_var()
1278 par->VFT++; in falcon_decode_var()
1281 /* V-frequency check, hope I didn't create any loop here. */ in falcon_decode_var()
1283 vfreq = (hfreq * 2) / (par->VFT + 1); in falcon_decode_var()
1284 if (vfreq > info->monspecs.vfmax && !doubleline && !interlace) { in falcon_decode_var()
1285 /* Too high -> try again with doubleline */ in falcon_decode_var()
1288 } else if (vfreq < info->monspecs.vfmin && !interlace && !doubleline) { in falcon_decode_var()
1289 /* Too low -> try again with interlace */ in falcon_decode_var()
1292 } else if (vfreq < info->monspecs.vfmin && doubleline) { in falcon_decode_var()
1293 /* Doubleline too low -> clear doubleline and enlarge margins */ in falcon_decode_var()
1297 (hfreq * 2) / (par->VFT + 1 + 4 * lines - 2 * yres) > in falcon_decode_var()
1298 info->monspecs.vfmax; in falcon_decode_var()
1304 } else if (vfreq > info->monspecs.vfmax && doubleline) { in falcon_decode_var()
1305 /* Doubleline too high -> enlarge margins */ in falcon_decode_var()
1308 (hfreq * 2) / (par->VFT + 1 + 4 * lines) > in falcon_decode_var()
1309 info->monspecs.vfmax; in falcon_decode_var()
1315 } else if (vfreq > info->monspecs.vfmax && interlace) { in falcon_decode_var()
1316 /* Interlace, too high -> enlarge margins */ in falcon_decode_var()
1319 (hfreq * 2) / (par->VFT + 1 + 4 * lines) > in falcon_decode_var()
1320 info->monspecs.vfmax; in falcon_decode_var()
1326 } else if (vfreq < info->monspecs.vfmin || in falcon_decode_var()
1327 vfreq > info->monspecs.vfmax) in falcon_decode_var()
1328 return -EINVAL; in falcon_decode_var()
1333 return -EINVAL; in falcon_decode_var()
1335 return -EINVAL; in falcon_decode_var()
1336 if (var->yoffset + yres > yres_virtual && yres_virtual) in falcon_decode_var()
1337 return -EINVAL; in falcon_decode_var()
1338 par->yres_virtual = yres_virtual; in falcon_decode_var()
1339 par->screen_base = screen_base + var->yoffset * linelen; in falcon_decode_var()
1340 par->hw.falcon.xoffset = 0; in falcon_decode_var()
1342 par->next_line = linelen; in falcon_decode_var()
1354 struct falcon_hw *hw = &par->hw.falcon; in falcon_encode_var()
1358 var->pixclock = hw->sync & 0x1 ? fext.t : in falcon_encode_var()
1359 hw->vid_control & VCO_CLOCK25 ? f25.t : f32.t; in falcon_encode_var()
1361 var->height = -1; in falcon_encode_var()
1362 var->width = -1; in falcon_encode_var()
1364 var->sync = 0; in falcon_encode_var()
1365 if (hw->vid_control & VCO_HSYPOS) in falcon_encode_var()
1366 var->sync |= FB_SYNC_HOR_HIGH_ACT; in falcon_encode_var()
1367 if (hw->vid_control & VCO_VSYPOS) in falcon_encode_var()
1368 var->sync |= FB_SYNC_VERT_HIGH_ACT; in falcon_encode_var()
1370 var->vmode = FB_VMODE_NONINTERLACED; in falcon_encode_var()
1371 if (hw->vid_mode & VMO_INTER) in falcon_encode_var()
1372 var->vmode |= FB_VMODE_INTERLACED; in falcon_encode_var()
1373 if (hw->vid_mode & VMO_DOUBLE) in falcon_encode_var()
1374 var->vmode |= FB_VMODE_DOUBLE; in falcon_encode_var()
1378 * VDE. If interlace mode off unit of VC-registers is in falcon_encode_var()
1381 var->yres = hw->vde - hw->vdb; in falcon_encode_var()
1382 if (!(var->vmode & FB_VMODE_INTERLACED)) in falcon_encode_var()
1383 var->yres >>= 1; in falcon_encode_var()
1384 if (var->vmode & FB_VMODE_DOUBLE) in falcon_encode_var()
1385 var->yres >>= 1; in falcon_encode_var()
1395 if (hw->f_shift & 0x400) /* 2 colors */ in falcon_encode_var()
1396 var->bits_per_pixel = 1; in falcon_encode_var()
1397 else if (hw->f_shift & 0x100) /* hicolor */ in falcon_encode_var()
1398 var->bits_per_pixel = 16; in falcon_encode_var()
1399 else if (hw->f_shift & 0x010) /* 8 bitplanes */ in falcon_encode_var()
1400 var->bits_per_pixel = 8; in falcon_encode_var()
1401 else if (hw->st_shift == 0) in falcon_encode_var()
1402 var->bits_per_pixel = 4; in falcon_encode_var()
1403 else if (hw->st_shift == 0x100) in falcon_encode_var()
1404 var->bits_per_pixel = 2; in falcon_encode_var()
1405 else /* if (hw->st_shift == 0x200) */ in falcon_encode_var()
1406 var->bits_per_pixel = 1; in falcon_encode_var()
1408 var->xres = hw->line_width * 16 / var->bits_per_pixel; in falcon_encode_var()
1409 var->xres_virtual = var->xres + hw->line_offset * 16 / var->bits_per_pixel; in falcon_encode_var()
1410 if (hw->xoffset) in falcon_encode_var()
1411 var->xres_virtual += 16; in falcon_encode_var()
1413 if (var->bits_per_pixel == 16) { in falcon_encode_var()
1414 var->red.offset = 11; in falcon_encode_var()
1415 var->red.length = 5; in falcon_encode_var()
1416 var->red.msb_right = 0; in falcon_encode_var()
1417 var->green.offset = 5; in falcon_encode_var()
1418 var->green.length = 6; in falcon_encode_var()
1419 var->green.msb_right = 0; in falcon_encode_var()
1420 var->blue.offset = 0; in falcon_encode_var()
1421 var->blue.length = 5; in falcon_encode_var()
1422 var->blue.msb_right = 0; in falcon_encode_var()
1424 var->red.offset = 0; in falcon_encode_var()
1425 var->red.length = hw->ste_mode ? 4 : 6; in falcon_encode_var()
1426 if (var->red.length > var->bits_per_pixel) in falcon_encode_var()
1427 var->red.length = var->bits_per_pixel; in falcon_encode_var()
1428 var->red.msb_right = 0; in falcon_encode_var()
1429 var->grayscale = 0; in falcon_encode_var()
1430 var->blue = var->green = var->red; in falcon_encode_var()
1432 var->transp.offset = 0; in falcon_encode_var()
1433 var->transp.length = 0; in falcon_encode_var()
1434 var->transp.msb_right = 0; in falcon_encode_var()
1436 linelen = var->xres_virtual * var->bits_per_pixel / 8; in falcon_encode_var()
1438 if (par->yres_virtual) in falcon_encode_var()
1439 var->yres_virtual = par->yres_virtual; in falcon_encode_var()
1442 var->yres_virtual = screen_len / linelen; in falcon_encode_var()
1445 var->yres_virtual = 2 * var->yres; in falcon_encode_var()
1447 var->yres_virtual = var->yres + hwscroll * 16; in falcon_encode_var()
1449 var->xoffset = 0; /* TODO change this */ in falcon_encode_var()
1451 /* hdX-offsets */ in falcon_encode_var()
1453 plen = 4 >> (hw->vid_mode >> 2 & 0x3); in falcon_encode_var()
1454 base_off = hw->vid_control & VCO_SHORTOFFS ? 64 : 128; in falcon_encode_var()
1455 if (hw->f_shift & 0x100) { in falcon_encode_var()
1459 hde_off = ((128 / var->bits_per_pixel + 2) * plen); in falcon_encode_var()
1460 if (hw->ste_mode) in falcon_encode_var()
1461 hdb_off = (64 + base_off + (128 / var->bits_per_pixel + 2) * plen) in falcon_encode_var()
1464 hdb_off = (base_off + (128 / var->bits_per_pixel + 18) * plen) in falcon_encode_var()
1469 var->left_margin = hdb_off + prescale * ((hw->hdb & 0x1ff) - in falcon_encode_var()
1470 (hw->hdb & 0x200 ? 2 + hw->hht : 0)); in falcon_encode_var()
1471 if (hw->ste_mode || mon_type != F_MON_VGA) in falcon_encode_var()
1472 var->right_margin = prescale * (hw->hht + 2 - hw->hde) - hde_off; in falcon_encode_var()
1475 var->right_margin = prescale * (hw->hht + 2 - hw->hbb); in falcon_encode_var()
1476 var->hsync_len = prescale * (hw->hht + 2 - hw->hss); in falcon_encode_var()
1479 var->upper_margin = hw->vdb / 2; /* round down to full lines */ in falcon_encode_var()
1480 var->lower_margin = (hw->vft + 1 - hw->vde + 1) / 2; /* round up */ in falcon_encode_var()
1481 var->vsync_len = (hw->vft + 1 - hw->vss + 1) / 2; /* round up */ in falcon_encode_var()
1482 if (var->vmode & FB_VMODE_INTERLACED) { in falcon_encode_var()
1483 var->upper_margin *= 2; in falcon_encode_var()
1484 var->lower_margin *= 2; in falcon_encode_var()
1485 var->vsync_len *= 2; in falcon_encode_var()
1486 } else if (var->vmode & FB_VMODE_DOUBLE) { in falcon_encode_var()
1487 var->upper_margin = (var->upper_margin + 1) / 2; in falcon_encode_var()
1488 var->lower_margin = (var->lower_margin + 1) / 2; in falcon_encode_var()
1489 var->vsync_len = (var->vsync_len + 1) / 2; in falcon_encode_var()
1492 var->pixclock *= plen; in falcon_encode_var()
1493 var->left_margin /= plen; in falcon_encode_var()
1494 var->right_margin /= plen; in falcon_encode_var()
1495 var->hsync_len /= plen; in falcon_encode_var()
1497 var->right_margin -= var->hsync_len; in falcon_encode_var()
1498 var->lower_margin -= var->vsync_len; in falcon_encode_var()
1501 var->yoffset = (par->screen_base - screen_base) / linelen; in falcon_encode_var()
1503 var->yoffset = 0; in falcon_encode_var()
1504 var->nonstd = 0; /* what is this for? */ in falcon_encode_var()
1505 var->activate = 0; in falcon_encode_var()
1516 struct falcon_hw *hw = &par->hw.falcon; in falcon_get_par()
1518 hw->line_width = shifter_f030.scn_width; in falcon_get_par()
1519 hw->line_offset = shifter_f030.off_next; in falcon_get_par()
1520 hw->st_shift = videl.st_shift & 0x300; in falcon_get_par()
1521 hw->f_shift = videl.f_shift; in falcon_get_par()
1522 hw->vid_control = videl.control; in falcon_get_par()
1523 hw->vid_mode = videl.mode; in falcon_get_par()
1524 hw->sync = shifter_st.syncmode & 0x1; in falcon_get_par()
1525 hw->xoffset = videl.xoffset & 0xf; in falcon_get_par()
1526 hw->hht = videl.hht; in falcon_get_par()
1527 hw->hbb = videl.hbb; in falcon_get_par()
1528 hw->hbe = videl.hbe; in falcon_get_par()
1529 hw->hdb = videl.hdb; in falcon_get_par()
1530 hw->hde = videl.hde; in falcon_get_par()
1531 hw->hss = videl.hss; in falcon_get_par()
1532 hw->vft = videl.vft; in falcon_get_par()
1533 hw->vbb = videl.vbb; in falcon_get_par()
1534 hw->vbe = videl.vbe; in falcon_get_par()
1535 hw->vdb = videl.vdb; in falcon_get_par()
1536 hw->vde = videl.vde; in falcon_get_par()
1537 hw->vss = videl.vss; in falcon_get_par()
1542 par->screen_base = atari_stram_to_virt(addr); in falcon_get_par()
1545 hw->ste_mode = (hw->f_shift & 0x510) == 0 && hw->st_shift == 0x100; in falcon_get_par()
1546 hw->mono = (hw->f_shift & 0x400) || in falcon_get_par()
1547 ((hw->f_shift & 0x510) == 0 && hw->st_shift == 0x200); in falcon_get_par()
1555 if (current_par.screen_base != par->screen_base) in falcon_set_par()
1556 fbhw->set_screen_base(par->screen_base); in falcon_set_par()
1562 /* Tell vbl-handler to change video mode. in falcon_set_par()
1568 f_new_mode = par->hw.falcon; in falcon_set_par()
1579 if (hw->sync & 0x1) { in falcon_vbl_switcher()
1580 /* Enable external pixelclock. This code only for ScreenWonder */ in falcon_vbl_switcher()
1586 shifter_st.syncmode = hw->sync; in falcon_vbl_switcher()
1588 videl.hht = hw->hht; in falcon_vbl_switcher()
1589 videl.hbb = hw->hbb; in falcon_vbl_switcher()
1590 videl.hbe = hw->hbe; in falcon_vbl_switcher()
1591 videl.hdb = hw->hdb; in falcon_vbl_switcher()
1592 videl.hde = hw->hde; in falcon_vbl_switcher()
1593 videl.hss = hw->hss; in falcon_vbl_switcher()
1594 videl.vft = hw->vft; in falcon_vbl_switcher()
1595 videl.vbb = hw->vbb; in falcon_vbl_switcher()
1596 videl.vbe = hw->vbe; in falcon_vbl_switcher()
1597 videl.vdb = hw->vdb; in falcon_vbl_switcher()
1598 videl.vde = hw->vde; in falcon_vbl_switcher()
1599 videl.vss = hw->vss; in falcon_vbl_switcher()
1602 if (hw->ste_mode) { in falcon_vbl_switcher()
1603 videl.st_shift = hw->st_shift; /* write enables STE palette */ in falcon_vbl_switcher()
1606 * set st_shift 0, so we can tell the screen-depth if f_shift == 0. in falcon_vbl_switcher()
1613 videl.f_shift = hw->f_shift; in falcon_vbl_switcher()
1616 videl.xoffset = hw->xoffset; in falcon_vbl_switcher()
1617 shifter_f030.scn_width = hw->line_width; in falcon_vbl_switcher()
1618 shifter_f030.off_next = hw->line_offset; in falcon_vbl_switcher()
1619 videl.control = hw->vid_control; in falcon_vbl_switcher()
1620 videl.mode = hw->vid_mode; in falcon_vbl_switcher()
1633 struct atafb_par *par = info->par; in falcon_pan_display()
1636 int bpp = info->var.bits_per_pixel; in falcon_pan_display()
1639 var->xoffset = round_up(var->xoffset, 32); in falcon_pan_display()
1641 par->hw.falcon.xoffset = var->xoffset & 15; in falcon_pan_display()
1643 par->hw.falcon.xoffset = 0; in falcon_pan_display()
1644 var->xoffset = round_up(var->xoffset, 2); in falcon_pan_display()
1646 par->hw.falcon.line_offset = bpp * in falcon_pan_display()
1647 (info->var.xres_virtual - info->var.xres) / 16; in falcon_pan_display()
1648 if (par->hw.falcon.xoffset) in falcon_pan_display()
1649 par->hw.falcon.line_offset -= bpp; in falcon_pan_display()
1650 xoffset = var->xoffset - par->hw.falcon.xoffset; in falcon_pan_display()
1652 par->screen_base = screen_base + in falcon_pan_display()
1653 (var->yoffset * info->var.xres_virtual + xoffset) * bpp / 8; in falcon_pan_display()
1654 if (fbhw->set_screen_base) in falcon_pan_display()
1655 fbhw->set_screen_base(par->screen_base); in falcon_pan_display()
1657 return -EINVAL; /* shouldn't happen */ in falcon_pan_display()
1676 ((u32 *)info->pseudo_palette)[regno] = ((red & 0xf800) | in falcon_setcolreg()
1733 info->monspecs.vfmin = 70; in falcon_detect()
1734 info->monspecs.vfmax = 72; in falcon_detect()
1735 info->monspecs.hfmin = 35713; in falcon_detect()
1736 info->monspecs.hfmax = 35715; in falcon_detect()
1741 info->monspecs.vfmin = 49; /* not 50, since TOS defaults to 49.9x Hz */ in falcon_detect()
1742 info->monspecs.vfmax = 60; in falcon_detect()
1743 info->monspecs.hfmin = 15620; in falcon_detect()
1744 info->monspecs.hfmax = 15755; in falcon_detect()
1747 /* initialize hsync-len */ in falcon_detect()
1762 /* ------------------- ST(E) specific functions ---------------------- */
1771 strcpy(fix->id, "Atari Builtin"); in stste_encode_fix()
1772 fix->smem_start = phys_screen_base; in stste_encode_fix()
1773 fix->smem_len = screen_len; in stste_encode_fix()
1774 fix->type = FB_TYPE_INTERLEAVED_PLANES; in stste_encode_fix()
1775 fix->type_aux = 2; in stste_encode_fix()
1776 fix->visual = FB_VISUAL_PSEUDOCOLOR; in stste_encode_fix()
1777 mode = par->hw.st.mode & 3; in stste_encode_fix()
1779 fix->type = FB_TYPE_PACKED_PIXELS; in stste_encode_fix()
1780 fix->type_aux = 0; in stste_encode_fix()
1781 fix->visual = FB_VISUAL_MONO10; in stste_encode_fix()
1784 fix->xpanstep = 16; in stste_encode_fix()
1785 fix->ypanstep = 1; in stste_encode_fix()
1787 fix->xpanstep = 0; in stste_encode_fix()
1788 fix->ypanstep = 0; in stste_encode_fix()
1790 fix->ywrapstep = 0; in stste_encode_fix()
1791 fix->line_length = par->next_line; in stste_encode_fix()
1792 fix->accel = FB_ACCEL_ATARIBLITT; in stste_encode_fix()
1799 int xres = var->xres; in stste_decode_var()
1800 int yres = var->yres; in stste_decode_var()
1801 int bpp = var->bits_per_pixel; in stste_decode_var()
1803 int yres_virtual = var->yres_virtual; in stste_decode_var()
1807 return -EINVAL; in stste_decode_var()
1808 par->hw.st.mode = ST_HIGH; in stste_decode_var()
1814 return -EINVAL; in stste_decode_var()
1817 return -EINVAL; in stste_decode_var()
1818 par->hw.st.mode = ST_LOW; in stste_decode_var()
1824 return -EINVAL; in stste_decode_var()
1825 par->hw.st.mode = ST_MID; in stste_decode_var()
1830 return -EINVAL; in stste_decode_var()
1836 if (var->sync & FB_SYNC_EXT) in stste_decode_var()
1837 par->hw.st.sync = (par->hw.st.sync & ~1) | 1; in stste_decode_var()
1839 par->hw.st.sync = (par->hw.st.sync & ~1); in stste_decode_var()
1842 return -EINVAL; in stste_decode_var()
1844 return -EINVAL; in stste_decode_var()
1845 if (var->yoffset + yres > yres_virtual && yres_virtual) in stste_decode_var()
1846 return -EINVAL; in stste_decode_var()
1847 par->yres_virtual = yres_virtual; in stste_decode_var()
1848 par->screen_base = screen_base + var->yoffset * linelen; in stste_decode_var()
1849 par->next_line = linelen; in stste_decode_var()
1858 var->red.offset = 0; in stste_encode_var()
1859 var->red.length = ATARIHW_PRESENT(EXTD_SHIFTER) ? 4 : 3; in stste_encode_var()
1860 var->red.msb_right = 0; in stste_encode_var()
1861 var->grayscale = 0; in stste_encode_var()
1863 var->pixclock = 31041; in stste_encode_var()
1864 var->left_margin = 120; /* these are incorrect */ in stste_encode_var()
1865 var->right_margin = 100; in stste_encode_var()
1866 var->upper_margin = 8; in stste_encode_var()
1867 var->lower_margin = 16; in stste_encode_var()
1868 var->hsync_len = 140; in stste_encode_var()
1869 var->vsync_len = 30; in stste_encode_var()
1871 var->height = -1; in stste_encode_var()
1872 var->width = -1; in stste_encode_var()
1874 if (!(par->hw.st.sync & 1)) in stste_encode_var()
1875 var->sync = 0; in stste_encode_var()
1877 var->sync = FB_SYNC_EXT; in stste_encode_var()
1879 switch (par->hw.st.mode & 3) { in stste_encode_var()
1881 var->xres = sttt_xres / 2; in stste_encode_var()
1882 var->yres = st_yres / 2; in stste_encode_var()
1883 var->bits_per_pixel = 4; in stste_encode_var()
1886 var->xres = sttt_xres; in stste_encode_var()
1887 var->yres = st_yres / 2; in stste_encode_var()
1888 var->bits_per_pixel = 2; in stste_encode_var()
1891 var->xres = sttt_xres; in stste_encode_var()
1892 var->yres = st_yres; in stste_encode_var()
1893 var->bits_per_pixel = 1; in stste_encode_var()
1896 var->blue = var->green = var->red; in stste_encode_var()
1897 var->transp.offset = 0; in stste_encode_var()
1898 var->transp.length = 0; in stste_encode_var()
1899 var->transp.msb_right = 0; in stste_encode_var()
1900 var->xres_virtual = sttt_xres_virtual; in stste_encode_var()
1901 linelen = var->xres_virtual * var->bits_per_pixel / 8; in stste_encode_var()
1902 ovsc_addlen = linelen * (sttt_yres_virtual - st_yres); in stste_encode_var()
1905 var->yres_virtual = var->yres; in stste_encode_var()
1907 if (par->yres_virtual) in stste_encode_var()
1908 var->yres_virtual = par->yres_virtual; in stste_encode_var()
1911 var->yres_virtual = screen_len / linelen; in stste_encode_var()
1914 var->yres_virtual = 2 * var->yres; in stste_encode_var()
1916 var->yres_virtual = var->yres + hwscroll * 16; in stste_encode_var()
1918 var->xoffset = 0; in stste_encode_var()
1920 var->yoffset = (par->screen_base - screen_base) / linelen; in stste_encode_var()
1922 var->yoffset = 0; in stste_encode_var()
1923 var->nonstd = 0; in stste_encode_var()
1924 var->activate = 0; in stste_encode_var()
1925 var->vmode = FB_VMODE_NONINTERLACED; in stste_encode_var()
1932 par->hw.st.mode = shifter_tt.st_shiftmode; in stste_get_par()
1933 par->hw.st.sync = shifter_st.syncmode; in stste_get_par()
1938 par->screen_base = atari_stram_to_virt(addr); in stste_get_par()
1943 shifter_tt.st_shiftmode = par->hw.st.mode; in stste_set_par()
1944 shifter_st.syncmode = par->hw.st.sync; in stste_set_par()
1946 if (current_par.screen_base != par->screen_base) in stste_set_par()
1947 fbhw->set_screen_base(par->screen_base); in stste_set_par()
2064 /* ------------------- External Video ---------------------- */
2070 strcpy(fix->id, "Unknown Extern"); in ext_encode_fix()
2071 fix->smem_start = external_addr; in ext_encode_fix()
2072 fix->smem_len = PAGE_ALIGN(external_len); in ext_encode_fix()
2074 fix->type = FB_TYPE_PACKED_PIXELS; in ext_encode_fix()
2077 fix->visual = in ext_encode_fix()
2091 case -1: /* truecolor */ in ext_encode_fix()
2092 fix->type = FB_TYPE_PACKED_PIXELS; in ext_encode_fix()
2093 fix->visual = FB_VISUAL_TRUECOLOR; in ext_encode_fix()
2096 fix->type = FB_TYPE_PACKED_PIXELS; in ext_encode_fix()
2097 fix->visual = visual; in ext_encode_fix()
2100 fix->type = FB_TYPE_PLANES; in ext_encode_fix()
2101 fix->visual = visual; in ext_encode_fix()
2104 fix->type = FB_TYPE_INTERLEAVED_PLANES; in ext_encode_fix()
2105 fix->type_aux = 2; in ext_encode_fix()
2106 fix->visual = visual; in ext_encode_fix()
2110 fix->xpanstep = 0; in ext_encode_fix()
2111 fix->ypanstep = 0; in ext_encode_fix()
2112 fix->ywrapstep = 0; in ext_encode_fix()
2113 fix->line_length = par->next_line; in ext_encode_fix()
2122 if (var->bits_per_pixel > myvar->bits_per_pixel || in ext_decode_var()
2123 var->xres > myvar->xres || in ext_decode_var()
2124 var->xres_virtual > myvar->xres_virtual || in ext_decode_var()
2125 var->yres > myvar->yres || in ext_decode_var()
2126 var->xoffset > 0 || in ext_decode_var()
2127 var->yoffset > 0) in ext_decode_var()
2128 return -EINVAL; in ext_decode_var()
2130 par->next_line = external_xres_virtual * external_depth / 8; in ext_decode_var()
2137 var->red.offset = 0; in ext_encode_var()
2138 var->red.length = (external_pmode == -1) ? external_depth / 3 : in ext_encode_var()
2140 var->red.msb_right = 0; in ext_encode_var()
2141 var->grayscale = 0; in ext_encode_var()
2143 var->pixclock = 31041; in ext_encode_var()
2144 var->left_margin = 120; /* these are surely incorrect */ in ext_encode_var()
2145 var->right_margin = 100; in ext_encode_var()
2146 var->upper_margin = 8; in ext_encode_var()
2147 var->lower_margin = 16; in ext_encode_var()
2148 var->hsync_len = 140; in ext_encode_var()
2149 var->vsync_len = 30; in ext_encode_var()
2151 var->height = -1; in ext_encode_var()
2152 var->width = -1; in ext_encode_var()
2154 var->sync = 0; in ext_encode_var()
2156 var->xres = external_xres; in ext_encode_var()
2157 var->yres = external_yres; in ext_encode_var()
2158 var->xres_virtual = external_xres_virtual; in ext_encode_var()
2159 var->bits_per_pixel = external_depth; in ext_encode_var()
2161 var->blue = var->green = var->red; in ext_encode_var()
2162 var->transp.offset = 0; in ext_encode_var()
2163 var->transp.length = 0; in ext_encode_var()
2164 var->transp.msb_right = 0; in ext_encode_var()
2165 if (external_pmode == -1 && external_depth == 16) { in ext_encode_var()
2167 var->red.offset = 11; in ext_encode_var()
2168 var->red.length = 5; in ext_encode_var()
2169 var->green.offset = 5; in ext_encode_var()
2170 var->green.length = 6; in ext_encode_var()
2171 var->blue.offset = 0; in ext_encode_var()
2172 var->blue.length = 5; in ext_encode_var()
2173 } else if (external_pmode == -1 && external_depth == 32) { in ext_encode_var()
2175 var->red.offset = 16; in ext_encode_var()
2176 var->red.length = 8; in ext_encode_var()
2177 var->green.offset = 8; in ext_encode_var()
2178 var->green.length = 8; in ext_encode_var()
2179 var->blue.offset = 0; in ext_encode_var()
2180 var->blue.length = 8; in ext_encode_var()
2181 var->transp.offset = 24; in ext_encode_var()
2182 var->transp.length = 8; in ext_encode_var()
2187 * fbcon falls back to its 2-color palette — the console in ext_encode_var()
2190 var->red.length = 8; in ext_encode_var()
2191 var->green.length = 8; in ext_encode_var()
2192 var->blue.length = 8; in ext_encode_var()
2194 var->yres_virtual = var->yres; in ext_encode_var()
2195 var->xoffset = 0; in ext_encode_var()
2196 var->yoffset = 0; in ext_encode_var()
2197 var->nonstd = 0; in ext_encode_var()
2198 var->activate = 0; in ext_encode_var()
2199 var->vmode = FB_VMODE_NONINTERLACED; in ext_encode_var()
2205 par->screen_base = external_screen_base; in ext_get_par()
2226 unsigned char colmask = (1 << external_bitspercol) - 1; in ext_setcolreg()
2228 if (external_pmode == -1 && external_depth == 16) { in ext_setcolreg()
2232 ((u32 *)info->pseudo_palette)[regno] = (red & 0xf800) | in ext_setcolreg()
2237 if (external_pmode == -1 && external_depth == 32) { in ext_setcolreg()
2241 ((u32 *)info->pseudo_palette)[regno] = 0xff000000 | in ext_setcolreg()
2298 myvar->xres = external_xres; in ext_detect()
2299 myvar->xres_virtual = external_xres_virtual; in ext_detect()
2300 myvar->yres = external_yres; in ext_detect()
2301 myvar->bits_per_pixel = external_depth; in ext_detect()
2306 /* ------------------- SuperVidel SuperBlitter ---------------------- */
2311 * revisions are programmed directly with busy-polling.
2317 #define SVBLIT_COUNT 0x64 /* bytes per line - 1 */
2356 * FW >= 9 queues commands through the 512-longword FIFO: a command is
2361 * words would desync the 9-word framing until an SV reinit, which is
2363 * is programmed directly with busy-polling.
2379 svblit_wr(SVBLIT_FIFO, chunk - 1); in svblit_copy()
2391 svblit_wr(SVBLIT_COUNT, chunk - 1); in svblit_copy()
2401 nbytes -= chunk; in svblit_copy()
2414 u32 bytespp = info->var.bits_per_pixel / 8; in svblit_copyarea()
2415 u32 pitch = info->fix.line_length; in svblit_copyarea()
2423 if (area->height > 4095 || in svblit_copyarea()
2424 area->dy > area->sy || in svblit_copyarea()
2425 (area->dy == area->sy && area->dx > area->sx)) { in svblit_copyarea()
2431 svblit_copy(external_addr + area->sy * pitch + area->sx * bytespp, in svblit_copyarea()
2432 external_addr + area->dy * pitch + area->dx * bytespp, in svblit_copyarea()
2433 area->width * bytespp, pitch, pitch, area->height); in svblit_copyarea()
2440 u32 bytespp = info->var.bits_per_pixel / 8; in svblit_fillrect()
2441 u32 pitch = info->fix.line_length; in svblit_fillrect()
2447 if (rect->rop != ROP_COPY || rect->height <= 1 || in svblit_fillrect()
2448 rect->height > 4096) { in svblit_fillrect()
2453 pix = (info->fix.visual == FB_VISUAL_TRUECOLOR) ? in svblit_fillrect()
2454 ((u32 *)info->pseudo_palette)[rect->color] : rect->color; in svblit_fillrect()
2457 line = (u8 *)info->screen_base + rect->dy * pitch + in svblit_fillrect()
2458 rect->dx * bytespp; in svblit_fillrect()
2461 memset(line, pix, rect->width); in svblit_fillrect()
2464 memset16((u16 *)line, pix, rect->width); in svblit_fillrect()
2467 memset32((u32 *)line, pix, rect->width); in svblit_fillrect()
2472 svblit_copy(external_addr + rect->dy * pitch + rect->dx * bytespp, in svblit_fillrect()
2473 external_addr + (rect->dy + 1) * pitch + in svblit_fillrect()
2474 rect->dx * bytespp, in svblit_fillrect()
2475 rect->width * bytespp, 0, pitch, rect->height - 1); in svblit_fillrect()
2487 /* ------ This is the same for most hardware types -------- */
2502 struct atafb_par *par = info->par; in pan_display()
2504 if (!fbhw->set_screen_base || in pan_display()
2505 (!ATARIHW_PRESENT(EXTD_SHIFTER) && var->xoffset)) in pan_display()
2506 return -EINVAL; in pan_display()
2507 var->xoffset = round_up(var->xoffset, 16); in pan_display()
2508 par->screen_base = screen_base + in pan_display()
2509 (var->yoffset * info->var.xres_virtual + var->xoffset) in pan_display()
2510 * info->var.bits_per_pixel / 8; in pan_display()
2511 fbhw->set_screen_base(par->screen_base); in pan_display()
2515 /* ------------ Interfaces to hardware functions ------------ */
2573 fbhw->get_par(par); in ata_get_par()
2578 fbhw->set_par(par); in ata_set_par()
2595 err = fbhw->decode_var(info, var, &par); in do_fb_set_var()
2598 activate = var->activate; in do_fb_set_var()
2599 if (((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) && isactive) in do_fb_set_var()
2601 fbhw->encode_var(var, &par); in do_fb_set_var()
2602 var->activate = activate; in do_fb_set_var()
2606 /* fbhw->encode_fix() must be called with fb_info->mm_lock held
2607 * if it is called after the register_framebuffer() - not a case here
2613 // Get fix directly (case con == -1 before)?? in atafb_get_fix()
2614 err = fbhw->decode_var(info, &info->var, &par); in atafb_get_fix()
2618 err = fbhw->encode_fix(fix, &par); in atafb_get_fix()
2627 fbhw->encode_var(var, &par); in atafb_get_var()
2637 atafb_get_var(&info->var, info); in atafb_set_disp()
2638 atafb_get_fix(&info->fix, info); in atafb_set_disp()
2641 info->screen_base = (external_addr ? external_screen_base : in atafb_set_disp()
2642 atari_stram_to_virt(info->fix.smem_start)); in atafb_set_disp()
2648 if (!fbhw->pan_display) in atafb_pan_display()
2649 return -EINVAL; in atafb_pan_display()
2651 return fbhw->pan_display(var, info); in atafb_pan_display()
2660 struct atafb_par *par = info->par; in atafb_fillrect()
2664 if (!rect->width || !rect->height) in atafb_fillrect()
2669 if (info->fix.type == FB_TYPE_PACKED_PIXELS && in atafb_fillrect()
2670 info->var.bits_per_pixel > 1) { in atafb_fillrect()
2680 x2 = rect->dx + rect->width; in atafb_fillrect()
2681 y2 = rect->dy + rect->height; in atafb_fillrect()
2682 x2 = x2 < info->var.xres_virtual ? x2 : info->var.xres_virtual; in atafb_fillrect()
2683 y2 = y2 < info->var.yres_virtual ? y2 : info->var.yres_virtual; in atafb_fillrect()
2684 width = x2 - rect->dx; in atafb_fillrect()
2685 height = y2 - rect->dy; in atafb_fillrect()
2687 if (info->var.bits_per_pixel == 1) in atafb_fillrect()
2688 atafb_mfb_fillrect(info, par->next_line, rect->color, in atafb_fillrect()
2689 rect->dy, rect->dx, height, width); in atafb_fillrect()
2690 else if (info->var.bits_per_pixel == 2) in atafb_fillrect()
2691 atafb_iplan2p2_fillrect(info, par->next_line, rect->color, in atafb_fillrect()
2692 rect->dy, rect->dx, height, width); in atafb_fillrect()
2693 else if (info->var.bits_per_pixel == 4) in atafb_fillrect()
2694 atafb_iplan2p4_fillrect(info, par->next_line, rect->color, in atafb_fillrect()
2695 rect->dy, rect->dx, height, width); in atafb_fillrect()
2697 atafb_iplan2p8_fillrect(info, par->next_line, rect->color, in atafb_fillrect()
2698 rect->dy, rect->dx, height, width); in atafb_fillrect()
2705 struct atafb_par *par = info->par; in atafb_copyarea()
2712 if (info->fix.type == FB_TYPE_PACKED_PIXELS && in atafb_copyarea()
2713 info->var.bits_per_pixel > 1) { in atafb_copyarea()
2720 x2 = area->dx + area->width; in atafb_copyarea()
2721 y2 = area->dy + area->height; in atafb_copyarea()
2722 dx = area->dx > 0 ? area->dx : 0; in atafb_copyarea()
2723 dy = area->dy > 0 ? area->dy : 0; in atafb_copyarea()
2724 x2 = x2 < info->var.xres_virtual ? x2 : info->var.xres_virtual; in atafb_copyarea()
2725 y2 = y2 < info->var.yres_virtual ? y2 : info->var.yres_virtual; in atafb_copyarea()
2726 width = x2 - dx; in atafb_copyarea()
2727 height = y2 - dy; in atafb_copyarea()
2729 if (area->sx + dx < area->dx || area->sy + dy < area->dy) in atafb_copyarea()
2733 sx = area->sx + (dx - area->dx); in atafb_copyarea()
2734 sy = area->sy + (dy - area->dy); in atafb_copyarea()
2737 if (sx + width > info->var.xres_virtual || in atafb_copyarea()
2738 sy + height > info->var.yres_virtual) in atafb_copyarea()
2747 if (info->var.bits_per_pixel == 1) in atafb_copyarea()
2748 atafb_mfb_copyarea(info, par->next_line, sy, sx, dy, dx, height, width); in atafb_copyarea()
2749 else if (info->var.bits_per_pixel == 2) in atafb_copyarea()
2750 atafb_iplan2p2_copyarea(info, par->next_line, sy, sx, dy, dx, height, width); in atafb_copyarea()
2751 else if (info->var.bits_per_pixel == 4) in atafb_copyarea()
2752 atafb_iplan2p4_copyarea(info, par->next_line, sy, sx, dy, dx, height, width); in atafb_copyarea()
2754 atafb_iplan2p8_copyarea(info, par->next_line, sy, sx, dy, dx, height, width); in atafb_copyarea()
2761 struct atafb_par *par = info->par; in atafb_imageblit()
2768 if (info->fix.type == FB_TYPE_PACKED_PIXELS && in atafb_imageblit()
2769 info->var.bits_per_pixel > 1) { in atafb_imageblit()
2780 x2 = image->dx + image->width; in atafb_imageblit()
2781 y2 = image->dy + image->height; in atafb_imageblit()
2782 dx = image->dx; in atafb_imageblit()
2783 dy = image->dy; in atafb_imageblit()
2784 x2 = x2 < info->var.xres_virtual ? x2 : info->var.xres_virtual; in atafb_imageblit()
2785 y2 = y2 < info->var.yres_virtual ? y2 : info->var.yres_virtual; in atafb_imageblit()
2786 width = x2 - dx; in atafb_imageblit()
2787 height = y2 - dy; in atafb_imageblit()
2789 if (image->depth == 1) { in atafb_imageblit()
2791 src = image->data; in atafb_imageblit()
2792 pitch = (image->width + 7) / 8; in atafb_imageblit()
2793 while (height--) { in atafb_imageblit()
2795 if (info->var.bits_per_pixel == 1) in atafb_imageblit()
2796 atafb_mfb_linefill(info, par->next_line, in atafb_imageblit()
2798 image->bg_color, image->fg_color); in atafb_imageblit()
2799 else if (info->var.bits_per_pixel == 2) in atafb_imageblit()
2800 atafb_iplan2p2_linefill(info, par->next_line, in atafb_imageblit()
2802 image->bg_color, image->fg_color); in atafb_imageblit()
2803 else if (info->var.bits_per_pixel == 4) in atafb_imageblit()
2804 atafb_iplan2p4_linefill(info, par->next_line, in atafb_imageblit()
2806 image->bg_color, image->fg_color); in atafb_imageblit()
2808 atafb_iplan2p8_linefill(info, par->next_line, in atafb_imageblit()
2810 image->bg_color, image->fg_color); in atafb_imageblit()
2815 c2p_iplan2(info->screen_base, image->data, dx, dy, width, in atafb_imageblit()
2816 height, par->next_line, image->width, in atafb_imageblit()
2817 info->var.bits_per_pixel); in atafb_imageblit()
2829 return -EFAULT; in atafb_ioctl()
2836 return -EFAULT; in atafb_ioctl()
2841 return -EINVAL; in atafb_ioctl()
2855 if (fbhw->blank && !fbhw->blank(blank)) in atafb_blank()
2887 err = fbhw->decode_var(info, var, &par); in atafb_check_var()
2892 fbhw->encode_var(var, &par); in atafb_check_var()
2900 struct atafb_par *par = info->par; in atafb_set_par()
2903 fbhw->decode_var(info, &info->var, par); in atafb_set_par()
2904 mutex_lock(&info->mm_lock); in atafb_set_par()
2905 fbhw->encode_fix(&info->fix, par); in atafb_set_par()
2906 mutex_unlock(&info->mm_lock); in atafb_set_par()
2938 var = atafb_predefined[default_par - 1]; in check_default_par()
2945 var = atafb_predefined[detected_mode - 1]; /* autodetect */ in check_default_par()
2958 var = atafb_predefined[default_par - 1]; in check_default_par()
2978 * [;<screen mem length>[;<vgaiobase>[;<bits-per-col>[;<colorreg-type> in atafb_setup_ext()
2979 * [;<xres-virtual>]]]]] in atafb_setup_ext()
2982 * <xres_virtual>: hardware's x-resolution (f.e. ProMST) in atafb_setup_ext()
2984 * Even xres_virtual is available, we neither support panning nor hw-scrolling! in atafb_setup_ext()
3018 planes = -1; /* true color */ in atafb_setup_ext()
3092 * <xres>: x-resolution in atafb_setup_int()
3093 * <yres>: y-resolution in atafb_setup_int()
3096 * <xres_max>: max. length of a line in pixels your OverScan hardware would allow in atafb_setup_int()
3097 * <yres_max>: max. number of lines your OverScan hardware would allow in atafb_setup_int()
3182 atafb_predefined[default_par - 1].xres = xres; in atafb_setup_user()
3183 atafb_predefined[default_par - 1].yres = yres; in atafb_setup_user()
3184 atafb_predefined[default_par - 1].bits_per_pixel = depth; in atafb_setup_user()
3223 /* external pixelclock in kHz --> ps */ in atafb_setup()
3246 return -ENODEV; in atafb_probe()
3248 dev_dbg(&pdev->dev, "%s: start\n", __func__); in atafb_probe()
3250 fb_info = framebuffer_alloc(sizeof(struct atafb_par), &pdev->dev); in atafb_probe()
3252 strscpy(fb_info->fix.id, "Atari "); in atafb_probe()
3253 fb_info->fix.visual = FB_VISUAL_PSEUDOCOLOR; in atafb_probe()
3254 fb_info->fix.accel = FB_ACCEL_NONE; in atafb_probe()
3259 dev_dbg(&pdev->dev, "initializing external hw\n"); in atafb_probe()
3268 dev_dbg(&pdev->dev, "initializing TT hw\n"); in atafb_probe()
3277 dev_dbg(&pdev->dev, "initializing Falcon hw\n"); in atafb_probe()
3292 dev_dbg(&pdev->dev, "initializing ST/E hw\n"); in atafb_probe()
3300 dev_warn(&pdev->dev, in atafb_probe()
3304 /* Nobody will ever see this message :-) */ in atafb_probe()
3310 /* Atari-TOS defaults if no boot option present */ in atafb_probe()
3312 fb_info->monspecs.hfmin = 31000; in atafb_probe()
3313 fb_info->monspecs.hfmax = 32000; in atafb_probe()
3314 fb_info->monspecs.vfmin = 58; in atafb_probe()
3315 fb_info->monspecs.vfmax = 62; in atafb_probe()
3317 fb_info->monspecs.vfmin = mcap_vmin; in atafb_probe()
3318 fb_info->monspecs.vfmax = mcap_vmax; in atafb_probe()
3319 fb_info->monspecs.hfmin = mcap_hmin; in atafb_probe()
3320 fb_info->monspecs.hfmax = mcap_hmax; in atafb_probe()
3323 detected_mode = fbhw->detect(fb_info); in atafb_probe()
3334 pad = -(unsigned long)screen_base & (PAGE_SIZE - 1); in atafb_probe()
3337 screen_len = (mem_req - pad - ovsc_offset) & PAGE_MASK; in atafb_probe()
3341 * write-through also for internal video hardware! */ in atafb_probe()
3346 dev_info(&pdev->dev, "phys_screen_base %lx screen_len %d\n", in atafb_probe()
3366 (external_pmode == -1 && in atafb_probe()
3375 fb_info->flags |= FBINFO_HWACCEL_COPYAREA | in atafb_probe()
3377 dev_info(&pdev->dev, in atafb_probe()
3386 // strcpy(fb_info->mode->name, "Atari Builtin "); in atafb_probe()
3387 fb_info->fbops = &atafb_ops; in atafb_probe()
3389 do_fb_set_var(fb_info, &atafb_predefined[default_par - 1], 1); in atafb_probe()
3392 fb_info->par = ¤t_par; in atafb_probe()
3395 atafb_get_var(&(fb_info->var), fb_info); in atafb_probe()
3398 fb_info->pseudo_palette = current_par.hw.falcon.pseudo_palette; in atafb_probe()
3401 if (!fb_find_mode(&(fb_info->var), fb_info, mode_option, atafb_modedb, in atafb_probe()
3403 fb_info->var.bits_per_pixel)) { in atafb_probe()
3404 return -EINVAL; in atafb_probe()
3408 &(fb_info->modelist)); in atafb_probe()
3412 /* truecolor visuals only need the 16-entry console palette; this in atafb_probe()
3415 fb_alloc_cmap(&(fb_info->cmap), fb_info->var.bits_per_pixel > 8 ? in atafb_probe()
3416 16 : 1 << fb_info->var.bits_per_pixel, 0); in atafb_probe()
3418 dev_info(&pdev->dev, "Determined %dx%d, depth %d\n", fb_info->var.xres, in atafb_probe()
3419 fb_info->var.yres, fb_info->var.bits_per_pixel); in atafb_probe()
3420 if ((fb_info->var.xres != fb_info->var.xres_virtual) || in atafb_probe()
3421 (fb_info->var.yres != fb_info->var.yres_virtual)) in atafb_probe()
3422 dev_info(&pdev->dev, " virtual %dx%d\n", in atafb_probe()
3423 fb_info->var.xres_virtual, fb_info->var.yres_virtual); in atafb_probe()
3436 return -EINVAL; in atafb_probe()
3449 if (fbhw->blank) in atafb_shutdown()
3450 fbhw->blank(0); in atafb_shutdown()
3465 return -ENODEV; in atafb_init()
3467 pdev = platform_device_register_simple("atafb", -1, NULL, 0); in atafb_init()