]> git.hungrycats.org Git - linux/commitdiff
[PATCH] vgacon fixes to help font restauration in X11
authorEgbert Eich <eich@suse.de>
Fri, 21 Jan 2005 00:06:35 +0000 (16:06 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 21 Jan 2005 00:06:35 +0000 (16:06 -0800)
So far the X.Org/XFree86 Xservers use internal functions to perform
saving/restoring of console fonts.  This doesn't work under all
circumstances and has disadvantages:

1. On some platforms (IA64) X needs to POST the BIOS before
   it even has a chance to access the hardware itself. This POSTing
   will usually undo any changes to the graphics hardware that the
   kernel may have done.
2. More and more drivers fully rely on BIOS support. However
   the BIOS functions which could be used to save/restore
   register settings may be broken so the only way of mode
   save/restore is getting/setting the BIOS mode ID.
   This will restore the BIOSes default fonts, not the custom font
   that the user may have loaded.

I would like to utilize the kernel's save/restore console fonts ioctls to
save/restore the text mode console fonts from inside X.

The patch does two things:

1. Eliminates the optimization that returns from vgacon_adjust_height()
   early (without reprogramming the HW) when the hight of the font hasn't
   changed.
2. Resets the stored 'from' and 'to' lines for the text cursor in
   vgacon_adjust_height() to cause vgacon_set_cursor_size() reprogram
   the textcursor start and end line.

These are necessary to sanitize the HW in case something other than the
kernel has changed the register values without restoring them properly.

I'm fully aware that in the long run we will need to look into a new driver
model for graphics where no two instances fight over who gets register
access.  However such a model won't be created nor will we get the majority
of the drivers ported over night.  Therefore we need to find an interim
solution for the most pressing problems.

Signed-off-by: Egbert Eich <eich@freedesktop.org>
Approved-by: Alan Cox <alan@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/video/console/vgacon.c

index 3d8388348d401b7c3a430ff0ef8627b89481e89e..9c310221223318d378cb00e32fb446dff54d68ed 100644 (file)
@@ -54,6 +54,8 @@
 #include <asm/io.h>
 
 static spinlock_t vga_lock = SPIN_LOCK_UNLOCKED;
+static int cursor_size_lastfrom;
+static int cursor_size_lastto;
 static struct vgastate state;
 
 #define BLANK 0x0020
@@ -409,17 +411,16 @@ static void vgacon_set_cursor_size(int xpos, int from, int to)
 {
        unsigned long flags;
        int curs, cure;
-       static int lastfrom, lastto;
 
 #ifdef TRIDENT_GLITCH
        if (xpos < 16)
                from--, to--;
 #endif
 
-       if ((from == lastfrom) && (to == lastto))
+       if ((from == cursor_size_lastfrom) && (to == cursor_size_lastto))
                return;
-       lastfrom = from;
-       lastto = to;
+       cursor_size_lastfrom = from;
+       cursor_size_lastto = to;
 
        spin_lock_irqsave(&vga_lock, flags);
        outb_p(0x0a, vga_video_port_reg);       /* Cursor start */
@@ -862,11 +863,6 @@ static int vgacon_adjust_height(struct vc_data *vc, unsigned fontheight)
        unsigned char ovr, vde, fsr;
        int rows, maxscan, i;
 
-       if (fontheight == vc->vc_font.height)
-               return 0;
-
-       vc->vc_font.height = fontheight;
-
        rows = vc->vc_scan_lines / fontheight;  /* Number of video rows we end up with */
        maxscan = rows * fontheight - 1;        /* Scan lines to actually display-1 */
 
@@ -905,6 +901,12 @@ static int vgacon_adjust_height(struct vc_data *vc, unsigned fontheight)
                struct vc_data *c = vc_cons[i].d;
 
                if (c && c->vc_sw == &vga_con) {
+                       if (CON_IS_VISIBLE(c)) {
+                               /* void size to cause regs to be rewritten */
+                               cursor_size_lastfrom = 0;
+                               cursor_size_lastto = 0;
+                               c->vc_sw->con_cursor(c, CM_DRAW);
+                       }
                        c->vc_font.height = fontheight;
                        vc_resize(c->vc_num, 0, rows);  /* Adjust console size */
                }