Commit 39942fd8 authored by Knut Petersen's avatar Knut Petersen Committed by Linus Torvalds

[PATCH] fbdev: fix switch to KD_TEXT, enhanced version

Every framebuffer driver relies on the assumption that the set_par()
function of the driver is called before drawing functions and other
functions dependent on the hardware state are executed.

Whenever you switch from X to a framebuffer console for the very first
time, there is a chance that a broken X system has _not_ set the mode to
KD_GRAPHICS, thus the vt and framebuffer code executes a screen redraw and
several other functions before a set_par() is executed.  This is believed
to be not a bug of linux but a bug of X/xdm.  At least some X releases used
by SuSE and Debian show this behaviour.

There was a 2nd case, but that has been fixed by Antonino Daplas on
10-dec-2005.

This patch allows drivers to set a flag to inform fbcon_switch() that they
prefer a set_par() call on every console switch, working around the
problems caused by the broken X releases.

The flag will be used by the next release of cyblafb and might help other
drivers that assume a hardware state different to the one used by X.

As the default behaviour does not change, this patch should be acceptable
to everybody.
Signed-off-by: default avatarKnut Petersen <Knut_Petersen@t-online.de>
Acked-by: default avatar"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 4e1567d3
...@@ -2103,7 +2103,8 @@ static int fbcon_switch(struct vc_data *vc) ...@@ -2103,7 +2103,8 @@ static int fbcon_switch(struct vc_data *vc)
fb_set_var(info, &var); fb_set_var(info, &var);
ops->var = info->var; ops->var = info->var;
if (old_info != NULL && old_info != info) { if (old_info != NULL && (old_info != info ||
info->flags & FBINFO_MISC_ALWAYS_SETPAR)) {
if (info->fbops->fb_set_par) if (info->fbops->fb_set_par)
info->fbops->fb_set_par(info); info->fbops->fb_set_par(info);
fbcon_del_cursor_timer(old_info); fbcon_del_cursor_timer(old_info);
......
...@@ -732,6 +732,18 @@ struct fb_tile_ops { ...@@ -732,6 +732,18 @@ struct fb_tile_ops {
from userspace */ from userspace */
#define FBINFO_MISC_TILEBLITTING 0x20000 /* use tile blitting */ #define FBINFO_MISC_TILEBLITTING 0x20000 /* use tile blitting */
/* A driver may set this flag to indicate that it does want a set_par to be
* called every time when fbcon_switch is executed. The advantage is that with
* this flag set you can really be shure that set_par is always called before
* any of the functions dependant on the correct hardware state or altering
* that state, even if you are using some broken X releases. The disadvantage
* is that it introduces unwanted delays to every console switch if set_par
* is slow. It is a good idea to try this flag in the drivers initialization
* code whenever there is a bug report related to switching between X and the
* framebuffer console.
*/
#define FBINFO_MISC_ALWAYS_SETPAR 0x40000
struct fb_info { struct fb_info {
int node; int node;
int flags; int flags;
......
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