Commit d1521260 authored by Samuel Thibault's avatar Samuel Thibault Committed by Linus Torvalds

[PATCH] vgacon: no vertical resizing on EGA

EGA boards suck: they mostly have write-only registers.  This is
particularly problematic for the overflow register: for being able to write
to it, we would have to handle vertical sync & such too, which (I'd say)
would potentially break a lot of configurations.  Instead, just disabling
vertical resize for EGA boards is just nice enough (horizontal resize still
works).

Fixes http://bugzilla.kernel.org/show_bug.cgi?id=6106Signed-off-by: default avatarSamuel Thibault <samuel.thibault@ens-lyon.org>
Cc: Rafal Olearski <olearski@mail2.kim.net.pl>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent fe1db50c
...@@ -509,18 +509,19 @@ static int vgacon_doresize(struct vc_data *c, ...@@ -509,18 +509,19 @@ static int vgacon_doresize(struct vc_data *c,
{ {
unsigned long flags; unsigned long flags;
unsigned int scanlines = height * c->vc_font.height; unsigned int scanlines = height * c->vc_font.height;
u8 scanlines_lo, r7, vsync_end, mode, max_scan; u8 scanlines_lo = 0, r7 = 0, vsync_end = 0, mode, max_scan;
spin_lock_irqsave(&vga_lock, flags); spin_lock_irqsave(&vga_lock, flags);
vgacon_xres = width * VGA_FONTWIDTH;
vgacon_yres = height * c->vc_font.height;
if (vga_video_type >= VIDEO_TYPE_VGAC) {
outb_p(VGA_CRTC_MAX_SCAN, vga_video_port_reg); outb_p(VGA_CRTC_MAX_SCAN, vga_video_port_reg);
max_scan = inb_p(vga_video_port_val); max_scan = inb_p(vga_video_port_val);
if (max_scan & 0x80) if (max_scan & 0x80)
scanlines <<= 1; scanlines <<= 1;
vgacon_xres = width * VGA_FONTWIDTH;
vgacon_yres = height * c->vc_font.height;
outb_p(VGA_CRTC_MODE, vga_video_port_reg); outb_p(VGA_CRTC_MODE, vga_video_port_reg);
mode = inb_p(vga_video_port_val); mode = inb_p(vga_video_port_val);
...@@ -543,12 +544,14 @@ static int vgacon_doresize(struct vc_data *c, ...@@ -543,12 +544,14 @@ static int vgacon_doresize(struct vc_data *c,
vsync_end = inb_p(vga_video_port_val); vsync_end = inb_p(vga_video_port_val);
outb_p(VGA_CRTC_V_SYNC_END, vga_video_port_reg); outb_p(VGA_CRTC_V_SYNC_END, vga_video_port_reg);
outb_p(vsync_end & ~0x80, vga_video_port_val); outb_p(vsync_end & ~0x80, vga_video_port_val);
}
outb_p(VGA_CRTC_H_DISP, vga_video_port_reg); outb_p(VGA_CRTC_H_DISP, vga_video_port_reg);
outb_p(width - 1, vga_video_port_val); outb_p(width - 1, vga_video_port_val);
outb_p(VGA_CRTC_OFFSET, vga_video_port_reg); outb_p(VGA_CRTC_OFFSET, vga_video_port_reg);
outb_p(width >> 1, vga_video_port_val); outb_p(width >> 1, vga_video_port_val);
if (vga_video_type >= VIDEO_TYPE_VGAC) {
outb_p(VGA_CRTC_V_DISP_END, vga_video_port_reg); outb_p(VGA_CRTC_V_DISP_END, vga_video_port_reg);
outb_p(scanlines_lo, vga_video_port_val); outb_p(scanlines_lo, vga_video_port_val);
outb_p(VGA_CRTC_OVERFLOW, vga_video_port_reg); outb_p(VGA_CRTC_OVERFLOW, vga_video_port_reg);
...@@ -557,9 +560,9 @@ static int vgacon_doresize(struct vc_data *c, ...@@ -557,9 +560,9 @@ static int vgacon_doresize(struct vc_data *c,
/* reprotect registers */ /* reprotect registers */
outb_p(VGA_CRTC_V_SYNC_END, vga_video_port_reg); outb_p(VGA_CRTC_V_SYNC_END, vga_video_port_reg);
outb_p(vsync_end, vga_video_port_val); outb_p(vsync_end, vga_video_port_val);
}
spin_unlock_irqrestore(&vga_lock, flags); spin_unlock_irqrestore(&vga_lock, flags);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment