188,17 → 188,6 |
|
} |
|
static struct fb_ops vesafb_ops = { |
.owner = THIS_MODULE, |
.fb_setcolreg = vesafb_setcolreg, |
.fb_pan_display = vesafb_pan_display, |
.fb_fillrect = cfb_fillrect, |
.fb_copyarea = cfb_copyarea, |
.fb_imageblit = cfb_imageblit, |
.fb_cursor = soft_cursor, |
.fb_release = vesafb_release, |
}; |
|
int __init vesafb_setup(char *options) |
{ |
char *this_opt; |
233,6 → 222,116 |
extern int vbe_getifo(void); |
extern void vm86_init(void); |
|
static int vesafb_set_par(struct fb_info *info) |
{ |
|
ModeInfoBlock ModeInfo; |
int wx,wy,bpp,mode; |
int video_cmap_len; |
|
wx = info->var.xres; |
wy = info->var.yres; |
bpp = info->var.bits_per_pixel; |
|
mode = vbe_modenum(wx,wy,bpp); |
if (mode == -1) return -1; |
|
screen_info.lfb_base = vbe_getmodeinfo(&ModeInfo,mode); |
|
screen_info.orig_video_isVGA = VIDEO_TYPE_VLFB; |
|
if (screen_info.orig_video_isVGA != VIDEO_TYPE_VLFB) |
return -ENXIO; |
|
screen_info.lfb_depth = ModeInfo.BitsPerPixel; |
screen_info.lfb_width = ModeInfo.XResolution; |
screen_info.lfb_height = ModeInfo.YResolution; |
screen_info.lfb_linelength = ModeInfo.BytesPerScanLine; |
screen_info.lfb_size = VbeInfo.TotalMemory; |
screen_info.pages = ModeInfo.NumberOfImagePages; |
|
screen_info.vesapm_seg = 0; |
screen_info.vesapm_off = 0; |
|
screen_info.red_pos = ModeInfo.RedFieldPosition; |
screen_info.red_size = ModeInfo.RedMaskSize; |
screen_info.green_pos = ModeInfo.GreenFieldPosition; |
screen_info.green_size = ModeInfo.GreenMaskSize; |
screen_info.blue_pos = ModeInfo.BlueFieldPosition; |
screen_info.blue_size = ModeInfo.BlueMaskSize; |
screen_info.rsvd_pos = ModeInfo.RsvdFieldPosition; |
screen_info.rsvd_size = ModeInfo.RsvdMaskSize; |
|
vbe_setmode(mode); |
|
info->fix.smem_start = screen_info.lfb_base; |
info->var.bits_per_pixel = screen_info.lfb_depth; |
if (15 == info->var.bits_per_pixel) |
info->var.bits_per_pixel = 16; |
info->var.xres = screen_info.lfb_width; |
info->var.yres = screen_info.lfb_height; |
info->fix.line_length = screen_info.lfb_linelength; |
info->fix.smem_len = screen_info.lfb_size; |
info->fix.visual = (info->var.bits_per_pixel == 8) ? |
FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR; |
|
/* limit framebuffer size to 16 MB. Otherwise we'll eat tons of |
* kernel address space for nothing if the gfx card has alot of |
* memory (>= 128 MB isn't uncommon these days ...) */ |
if (info->fix.smem_len > 16 * 1024 * 1024) |
info->fix.smem_len = 16 * 1024 * 1024; |
|
/* some dummy values for timing to make fbset happy */ |
info->var.pixclock = 10000000 / info->var.xres * 1000 / info->var.yres; |
info->var.left_margin = (info->var.xres / 8) & 0xf8; |
info->var.hsync_len = (info->var.xres / 8) & 0xf8; |
|
if (info->var.bits_per_pixel > 8) { |
info->var.red.offset = screen_info.red_pos; |
info->var.red.length = screen_info.red_size; |
info->var.green.offset = screen_info.green_pos; |
info->var.green.length = screen_info.green_size; |
info->var.blue.offset = screen_info.blue_pos; |
info->var.blue.length = screen_info.blue_size; |
info->var.transp.offset = screen_info.rsvd_pos; |
info->var.transp.length = screen_info.rsvd_size; |
video_cmap_len = 16; |
} else { |
info->var.red.length = 6; |
info->var.green.length = 6; |
info->var.blue.length = 6; |
video_cmap_len = 256; |
} |
|
info->fix.ypanstep = ypan ? 1 : 0; |
info->fix.ywrapstep = (ypan>1) ? 1 : 0; |
|
return 0; |
|
} |
|
static int vesafb_check_var(struct fb_var_screeninfo *var, |
struct fb_info *info) |
{ |
|
return 0; |
|
} |
|
static struct fb_ops vesafb_ops = { |
.owner = THIS_MODULE, |
.fb_setcolreg = vesafb_setcolreg, |
.fb_pan_display = vesafb_pan_display, |
.fb_set_par = vesafb_set_par, |
.fb_check_var = vesafb_check_var, |
.fb_fillrect = cfb_fillrect, |
.fb_copyarea = cfb_copyarea, |
.fb_imageblit = cfb_imageblit, |
.fb_cursor = soft_cursor, |
.fb_release = vesafb_release, |
}; |
|
|
int __init vesafb_init(void) |
{ |
ModeInfoBlock ModeInfo; |