static int sun3fbcon_switch(int con, struct fb_info *info) { int x_margin, y_margin; struct fb_info_sbusfb *fb = sbusfbinfo(info); int lastconsole; /* Do we have to save the colormap? */ if (fb_display[info->currcon].cmap.len) fb_get_cmap(&fb_display[info->currcon].cmap, 1, sun3fb_getcolreg, info); if (info->display_fg) { lastconsole = info->display_fg->vc_num; if (lastconsole != con && (fontwidth(&fb_display[lastconsole]) != fontwidth(&fb_display[con]) || fontheight(&fb_display[lastconsole]) != fontheight(&fb_display[con]))) fb->cursor.mode |= CURSOR_SHAPE; } x_margin = (fb_display[con].var.xres_virtual - fb_display[con].var.xres) / 2; y_margin = (fb_display[con].var.yres_virtual - fb_display[con].var.yres) / 2; if (fb->margins) fb->margins(fb, &fb_display[con], x_margin, y_margin); if (fb->graphmode || fb->x_margin != x_margin || fb->y_margin != y_margin) { fb->x_margin = x_margin; fb->y_margin = y_margin; sun3fb_clear_margin(&fb_display[con], 0); } info->currcon = con; /* Install new colormap */ do_install_cmap(con, info); return 0; }
static int crt_fb_set_var(struct fb_var_screeninfo *var, int con) { int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp; if ((err = do_fb_set_var(var, con == currcon))) return(err); if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) { oldxres = disp[con].var.xres; oldyres = disp[con].var.yres; oldvxres = disp[con].var.xres_virtual; oldvyres = disp[con].var.yres_virtual; oldbpp = disp[con].var.bits_per_pixel; disp[con].var = *var; if (oldxres != var->xres || oldyres != var->yres || oldvxres != var->xres_virtual || oldvyres != var->yres_virtual || oldbpp != var->bits_per_pixel) { crt_fb_set_disp(con); (*fb_info.changevar)(con); alloc_cmap(&disp[con].cmap, 0, 0); do_install_cmap(con); } } var->activate = 0; return(0); }
struct fb_info *crt_fb_init(long *mem_start) { int err; struct crt_fb_par par; memstart = mem_start; fbhw = &crt_switch; err = register_framebuffer(crt_fb_name, &node, &crt_fb_ops, NUM_TOTAL_MODES, crt_fb_predefined); if (err < 0) panic("Cannot register frame buffer\n"); fbhw->init(); fbhw->decode_var(&crt_fb_predefined[crtfb_mode], &par); fbhw->encode_var(&crt_fb_predefined[0], &par); strcpy(fb_info.modename, crt_fb_name); fb_info.disp = disp; strcpy(fb_info.fontname, "VGA8x16"); fb_info.switch_con = &crtfb_switch; fb_info.updatevar = &crtfb_updatevar; fb_info.blank = &crtfb_blank; do_fb_set_var(&crt_fb_predefined[0], 1); crt_fb_get_var(&disp[0].var, -1); crt_fb_set_disp(-1); do_install_cmap(0); return(&fb_info); }
static int vfbcon_switch(int con, struct fb_info *info) { /* Do we have to save the colormap? */ if (fb_display[currcon].cmap.len) fb_get_cmap(&fb_display[currcon].cmap, 1, vfb_getcolreg, info); currcon = con; /* Install new colormap */ do_install_cmap(con, info); return 0; }
static int crtfb_switch(int con) { /* Do we have to save the colormap? */ if (disp[currcon].cmap.len) do_fb_get_cmap(&disp[currcon].cmap, &disp[currcon].var, 1); do_fb_set_var(&disp[con].var, 1); currcon = con; /* Install new colormap */ do_install_cmap(con); return(0); }
static int igafb_switch(int con, struct fb_info *fb_info) { struct fb_info_iga *info = (struct fb_info_iga*) fb_info; /* Do we have to save the colormap? */ if (fb_display[info->currcon].cmap.len) fb_get_cmap(&fb_display[info->currcon].cmap, 1, iga_getcolreg, fb_info); info->currcon = con; /* Install new colormap */ do_install_cmap(con, fb_info); igafb_update_var(con, fb_info); return 1; }
static int vfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { int err, activate = var->activate; int oldxres, oldyres, oldvxres, oldvyres, oldbpp; u_long line_length; struct display *display; if (con >= 0) display = &fb_display[con]; else display = &disp; /* used during initialization */ /* * FB_VMODE_CONUPDATE and FB_VMODE_SMOOTH_XPAN are equal! * as FB_VMODE_SMOOTH_XPAN is only used internally */ if (var->vmode & FB_VMODE_CONUPDATE) { var->vmode |= FB_VMODE_YWRAP; var->xoffset = display->var.xoffset; var->yoffset = display->var.yoffset; } /* * Some very basic checks */ if (!var->xres) var->xres = 1; if (!var->yres) var->yres = 1; if (var->xres > var->xres_virtual) var->xres_virtual = var->xres; if (var->yres > var->yres_virtual) var->yres_virtual = var->yres; if (var->bits_per_pixel <= 1) var->bits_per_pixel = 1; else if (var->bits_per_pixel <= 8) var->bits_per_pixel = 8; else if (var->bits_per_pixel <= 16) var->bits_per_pixel = 16; #if 0 /* fbcon doesn't support this (yet) */ else if (var->bits_per_pixel <= 24) var->bits_per_pixel = 24; else if (var->bits_per_pixel <= 32) var->bits_per_pixel = 32; #endif else return -EINVAL; /* * Memory limit */ line_length = get_line_length(var->xres_virtual, var->bits_per_pixel); if (line_length*var->yres_virtual > videomemorysize) return -ENOMEM; set_color_bitfields(var); if ((activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) { oldxres = display->var.xres; oldyres = display->var.yres; oldvxres = display->var.xres_virtual; oldvyres = display->var.yres_virtual; oldbpp = display->var.bits_per_pixel; display->var = *var; if (oldxres != var->xres || oldyres != var->yres || oldvxres != var->xres_virtual || oldvyres != var->yres_virtual || oldbpp != var->bits_per_pixel) { struct fb_fix_screeninfo fix; vfb_encode_fix(&fix, var); display->screen_base = (char *)videomemory; display->visual = fix.visual; display->type = fix.type; display->type_aux = fix.type_aux; display->ypanstep = fix.ypanstep; display->ywrapstep = fix.ywrapstep; display->line_length = fix.line_length; display->can_soft_blank = 1; display->inverse = 0; switch (var->bits_per_pixel) { #ifdef FBCON_HAS_MFB case 1: display->dispsw = &fbcon_mfb; break; #endif #ifdef FBCON_HAS_CFB2 case 2: display->dispsw = &fbcon_cfb2; break; #endif #ifdef FBCON_HAS_CFB4 case 4: display->dispsw = &fbcon_cfb4; break; #endif #ifdef FBCON_HAS_CFB8 case 8: display->dispsw = &fbcon_cfb8; break; #endif #ifdef FBCON_HAS_CFB16 case 16: display->dispsw = &fbcon_cfb16; display->dispsw_data = fbcon_cmap.cfb16; break; #endif #ifdef FBCON_HAS_CFB24 case 24: display->dispsw = &fbcon_cfb24; display->dispsw_data = fbcon_cmap.cfb24; break; #endif #ifdef FBCON_HAS_CFB32 case 32: display->dispsw = &fbcon_cfb32; display->dispsw_data = fbcon_cmap.cfb32; break; #endif default: display->dispsw = &fbcon_dummy; break; } if (fb_info.changevar) (*fb_info.changevar)(con); } if (oldbpp != var->bits_per_pixel) { if ((err = fb_alloc_cmap(&display->cmap, 0, 0))) return err; do_install_cmap(con, info); } } return 0; }