From: Egbert Eich <eich@suse.de>
To: linux-kernel@vger.kernel.org
Cc: eich@suse.de
Subject: vgacon fixes to help font restauration in X11
Date: Tue, 11 Jan 2005 15:28:41 +0100 [thread overview]
Message-ID: <16867.58009.828782.164427@xf14.fra.suse.de> (raw)
[-- Attachment #1: message body text --]
[-- Type: text/plain, Size: 1809 bytes --]
[Please leave me in Cc as I'm not subscribed to this list]
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 kernels 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.
Egbert.
<Patch against latest snapshot>
[-- Attachment #2: diff.vgacon --]
[-- Type: text/plain, Size: 1880 bytes --]
Index: drivers/video/console/vgacon.c
===================================================================
RCS file: /work/kernelcvs/linux/drivers/video/console/vgacon.c,v
retrieving revision 1.1.1.2
diff -u -p -r1.1.1.2 vgacon.c
--- drivers/video/console/vgacon.c 11 Jan 2005 10:27:11 -0000 1.1.1.2
+++ drivers/video/console/vgacon.c 11 Jan 2005 13:40:19 -0000
@@ -54,6 +54,7 @@
#include <asm/io.h>
static spinlock_t vga_lock = SPIN_LOCK_UNLOCKED;
+static int cursor_size_lastfrom = 0, cursor_size_lastto = 0;
static struct vgastate state;
#define BLANK 0x0020
@@ -409,17 +410,16 @@ static void vgacon_set_cursor_size(int x
{
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 +862,6 @@ static int vgacon_adjust_height(struct v
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 +900,11 @@ static int vgacon_adjust_height(struct v
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 = 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 */
}
next reply other threads:[~2005-01-11 15:29 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-11 14:28 Egbert Eich [this message]
2005-01-15 0:33 ` Alan Cox
2005-01-17 9:07 ` Egbert Eich
2005-01-17 12:23 ` Alan Cox
2005-01-17 14:29 ` Egbert Eich
2005-01-17 16:30 ` Alan Cox
2005-01-18 8:31 ` Egbert Eich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=16867.58009.828782.164427@xf14.fra.suse.de \
--to=eich@suse.de \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®