mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 05:11:48 +00:00
[PATCH] vgacon: Workaround for resize bug in some chipsets
Reported from Redhat Bugzilla Bug 170450 "I updated to the development kernel and now during boot only the top of the text is visable. For example the monitor screen the is the lines and I can only see text in the asterisk area.
This commit is contained in:
parent
954de9141e
commit
53dbb26dbc
@ -56,6 +56,8 @@
|
|||||||
static DEFINE_SPINLOCK(vga_lock);
|
static DEFINE_SPINLOCK(vga_lock);
|
||||||
static int cursor_size_lastfrom;
|
static int cursor_size_lastfrom;
|
||||||
static int cursor_size_lastto;
|
static int cursor_size_lastto;
|
||||||
|
static u32 vgacon_xres;
|
||||||
|
static u32 vgacon_yres;
|
||||||
static struct vgastate state;
|
static struct vgastate state;
|
||||||
|
|
||||||
#define BLANK 0x0020
|
#define BLANK 0x0020
|
||||||
@ -69,7 +71,7 @@ static struct vgastate state;
|
|||||||
* appear.
|
* appear.
|
||||||
*/
|
*/
|
||||||
#undef TRIDENT_GLITCH
|
#undef TRIDENT_GLITCH
|
||||||
|
#define VGA_FONTWIDTH 8 /* VGA does not support fontwidths != 8 */
|
||||||
/*
|
/*
|
||||||
* Interface used by the world
|
* Interface used by the world
|
||||||
*/
|
*/
|
||||||
@ -325,6 +327,10 @@ static const char __init *vgacon_startup(void)
|
|||||||
vga_scan_lines =
|
vga_scan_lines =
|
||||||
vga_video_font_height * vga_video_num_lines;
|
vga_video_font_height * vga_video_num_lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vgacon_xres = ORIG_VIDEO_COLS * VGA_FONTWIDTH;
|
||||||
|
vgacon_yres = vga_scan_lines;
|
||||||
|
|
||||||
return display_desc;
|
return display_desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -513,6 +519,8 @@ static int vgacon_doresize(struct vc_data *c,
|
|||||||
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);
|
||||||
|
|
||||||
@ -557,6 +565,10 @@ static int vgacon_doresize(struct vc_data *c,
|
|||||||
|
|
||||||
static int vgacon_switch(struct vc_data *c)
|
static int vgacon_switch(struct vc_data *c)
|
||||||
{
|
{
|
||||||
|
int x = c->vc_cols * VGA_FONTWIDTH;
|
||||||
|
int y = c->vc_rows * c->vc_font.height;
|
||||||
|
int rows = ORIG_VIDEO_LINES * vga_default_font_height/
|
||||||
|
c->vc_font.height;
|
||||||
/*
|
/*
|
||||||
* We need to save screen size here as it's the only way
|
* We need to save screen size here as it's the only way
|
||||||
* we can spot the screen has been resized and we need to
|
* we can spot the screen has been resized and we need to
|
||||||
@ -572,10 +584,11 @@ static int vgacon_switch(struct vc_data *c)
|
|||||||
scr_memcpyw((u16 *) c->vc_origin, (u16 *) c->vc_screenbuf,
|
scr_memcpyw((u16 *) c->vc_origin, (u16 *) c->vc_screenbuf,
|
||||||
c->vc_screenbuf_size > vga_vram_size ?
|
c->vc_screenbuf_size > vga_vram_size ?
|
||||||
vga_vram_size : c->vc_screenbuf_size);
|
vga_vram_size : c->vc_screenbuf_size);
|
||||||
if (!(vga_video_num_columns % 2) &&
|
|
||||||
|
if ((vgacon_xres != x || vgacon_yres != y) &&
|
||||||
|
(!(vga_video_num_columns % 2) &&
|
||||||
vga_video_num_columns <= ORIG_VIDEO_COLS &&
|
vga_video_num_columns <= ORIG_VIDEO_COLS &&
|
||||||
vga_video_num_lines <= (ORIG_VIDEO_LINES *
|
vga_video_num_lines <= rows))
|
||||||
vga_default_font_height) / c->vc_font.height)
|
|
||||||
vgacon_doresize(c, c->vc_cols, c->vc_rows);
|
vgacon_doresize(c, c->vc_cols, c->vc_rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -999,7 +1012,8 @@ static int vgacon_font_set(struct vc_data *c, struct console_font *font, unsigne
|
|||||||
if (vga_video_type < VIDEO_TYPE_EGAM)
|
if (vga_video_type < VIDEO_TYPE_EGAM)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (font->width != 8 || (charcount != 256 && charcount != 512))
|
if (font->width != VGA_FONTWIDTH ||
|
||||||
|
(charcount != 256 && charcount != 512))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
rc = vgacon_do_font_op(&state, font->data, 1, charcount == 512);
|
rc = vgacon_do_font_op(&state, font->data, 1, charcount == 512);
|
||||||
@ -1016,7 +1030,7 @@ static int vgacon_font_get(struct vc_data *c, struct console_font *font)
|
|||||||
if (vga_video_type < VIDEO_TYPE_EGAM)
|
if (vga_video_type < VIDEO_TYPE_EGAM)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
font->width = 8;
|
font->width = VGA_FONTWIDTH;
|
||||||
font->height = c->vc_font.height;
|
font->height = c->vc_font.height;
|
||||||
font->charcount = vga_512_chars ? 512 : 256;
|
font->charcount = vga_512_chars ? 512 : 256;
|
||||||
if (!font->data)
|
if (!font->data)
|
||||||
|
Loading…
Reference in New Issue
Block a user