2007-04-26 01:53:07 +02:00
|
|
|
Index: xen-unstable/xen/drivers/video/vga.c
|
2007-02-11 11:48:10 +01:00
|
|
|
===================================================================
|
2007-04-26 01:53:07 +02:00
|
|
|
--- xen-unstable.orig/xen/drivers/video/vga.c
|
|
|
|
+++ xen-unstable/xen/drivers/video/vga.c
|
2007-02-11 11:48:10 +01:00
|
|
|
@@ -556,7 +556,6 @@ static int vga_load_font(const struct fo
|
|
|
|
*/
|
|
|
|
|
|
|
|
static int vgacon_enabled = 0;
|
|
|
|
-static int vgacon_keep = 0;
|
|
|
|
static int vgacon_lines = 50;
|
|
|
|
static const struct font_desc *font;
|
|
|
|
|
|
|
|
@@ -576,13 +575,16 @@ string_param("vga", opt_vga);
|
|
|
|
void vga_init(void)
|
|
|
|
{
|
|
|
|
char *p;
|
|
|
|
+ int keep = 0;
|
|
|
|
|
|
|
|
for ( p = opt_vga; p != NULL; p = strchr(p, ',') )
|
|
|
|
{
|
|
|
|
if ( *p == ',' )
|
|
|
|
p++;
|
|
|
|
if ( strncmp(p, "keep", 4) == 0 )
|
|
|
|
- vgacon_keep = 1;
|
|
|
|
+ keep = 1;
|
|
|
|
+ else if ( strncmp(p, "yield", 5) == 0 )
|
|
|
|
+ keep = -1;
|
|
|
|
else if ( strncmp(p, "text-80x", 8) == 0 )
|
|
|
|
vgacon_lines = simple_strtoul(p + 8, NULL, 10);
|
|
|
|
else if ( strncmp(p, "text", 4) == 0 && p[4] != '-' )
|
2007-04-26 01:53:07 +02:00
|
|
|
@@ -623,21 +625,48 @@ void vga_init(void)
|
2007-02-11 11:48:10 +01:00
|
|
|
/* Disable cursor. */
|
|
|
|
vga_wcrt(vgabase, VGA_CRTC_CURSOR_START, 0x20);
|
|
|
|
|
|
|
|
- vgacon_enabled = 1;
|
|
|
|
+ vgacon_enabled = 3 + keep;
|
|
|
|
}
|
|
|
|
|
|
|
|
void vga_endboot(void)
|
|
|
|
{
|
|
|
|
+ static const char *const str[] =
|
|
|
|
+ {
|
|
|
|
+ "relinquishing",
|
|
|
|
+ "auto-sensing",
|
|
|
|
+ "keeping"
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
if ( !vgacon_enabled )
|
|
|
|
return;
|
|
|
|
|
|
|
|
- if ( !vgacon_keep )
|
|
|
|
- vgacon_enabled = 0;
|
|
|
|
+ vgacon_enabled -= 2;
|
|
|
|
+ BUG_ON(vgacon_enabled < 0 || vgacon_enabled > 2);
|
|
|
|
|
|
|
|
- printk("Xen is %s VGA console.\n",
|
|
|
|
- vgacon_keep ? "keeping" : "relinquishing");
|
|
|
|
+ printk("Xen is %s VGA console.\n", str[vgacon_enabled]);
|
|
|
|
}
|
|
|
|
|
|
|
|
+static int gfx_vga(void)
|
|
|
|
+{
|
|
|
|
+ unsigned char idx, data;
|
|
|
|
+
|
|
|
|
+ idx = vga_r(vgabase, VGA_GFX_I);
|
|
|
|
+ data = vga_rgfx(vgabase, VGA_GFX_MISC);
|
|
|
|
+ vga_w(vgabase, VGA_GFX_I, idx);
|
|
|
|
+
|
|
|
|
+ if ( data & 0x01 )
|
|
|
|
+ return 1;
|
|
|
|
+
|
|
|
|
+ /* Unfortunately many cards don't reflect their mode in the GDC
|
|
|
|
+ * miscellaneous register, bit 0 (and even fewer reflect it in the
|
|
|
|
+ * ATC mode control register, bit 0). Therefore we further check
|
|
|
|
+ * horizontal display width against our original setting. */
|
|
|
|
+ idx = vga_r(vgabase, VGA_CRT_IC);
|
|
|
|
+ data = vga_rcrt(vgabase, VGA_CRTC_H_DISP);
|
|
|
|
+ vga_w(vgabase, VGA_CRT_IC, idx);
|
|
|
|
+
|
|
|
|
+ return data != COLUMNS - 1;
|
|
|
|
+}
|
|
|
|
|
|
|
|
static void put_newline(void)
|
|
|
|
{
|
2007-04-26 01:53:07 +02:00
|
|
|
@@ -655,14 +684,25 @@ static void put_newline(void)
|
2007-02-11 11:48:10 +01:00
|
|
|
|
|
|
|
void vga_putchar(int c)
|
|
|
|
{
|
|
|
|
- if ( !vgacon_enabled )
|
|
|
|
+ static int vga_in_gfx = -1;
|
|
|
|
+
|
|
|
|
+ switch ( vgacon_enabled )
|
|
|
|
+ {
|
|
|
|
+ case 0:
|
|
|
|
return;
|
|
|
|
+ case 1:
|
|
|
|
+ if ( vga_in_gfx < 0 )
|
|
|
|
+ vga_in_gfx = gfx_vga();
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
if ( c == '\n' )
|
|
|
|
{
|
|
|
|
- put_newline();
|
|
|
|
+ if ( vga_in_gfx <= 0 )
|
|
|
|
+ put_newline();
|
|
|
|
+ vga_in_gfx = -1;
|
|
|
|
}
|
|
|
|
- else
|
|
|
|
+ else if ( vga_in_gfx <= 0 )
|
|
|
|
{
|
|
|
|
if ( xpos >= COLUMNS )
|
|
|
|
put_newline();
|