Fixing switch to KD_TEXT, enhanced version
Subsystems (2)
PATCH 1/1 Fixing 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.
drivers/video/console/fbcon.c +2 -1
@@ -2103,7 +2103,8 @@ static int fbcon_switch(struct vc_data *fb_set_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_ALLWAYS_SETPAR )) {if (info->fbops->fb_set_par) info->fbops->fb_set_par (info);fbcon_del_cursor_timer (old_info);
include/linux/fb.h +12 -0
@@ -725,6 +725,18 @@ struct fb_tile_ops {#define FBINFO_MISC_USEREVENT 0x10000/* event request from userspace */ #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_ALLWAYS_SETPAR 0x40000 +struct fb_info {int node;
Quoted 20 lines · Knut Petersen
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 aset_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 aset_par()call on every console switch, working around the problems caused by the broken X releases.
Quoted 8 lines
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 Knut Petersen <[email protected]>
Quoted 1 line
+#define
FBINFO_MISC_ALLWAYS_SETPAR0x40000
^^^^^^^
Please post a follow up patch to fix the spelling.
Tony