Skip to contentSkip to conversation

Fixing switch to KD_TEXT, enhanced version

PATCH In review Knut Petersen 2 participants 2 messages Dec 10, 2005

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
diff -uprN -X linux/Documentation/dontdiff -x '*.bak' -x '*.ctx' linuxorig/drivers/video/console/fbcon.c linux/drivers/video/console/fbcon.c
@@ -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
diff -uprN -X linux/Documentation/dontdiff -x '*.bak' -x '*.ctx' linuxorig/include/linux/fb.h linux/include/linux/fb.h
@@ -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;
Acked-by Antonino Daplas on v1 1/1
#1 lore raw
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 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.

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.

Quoted 1 line

+#define FBINFO_MISC_ALLWAYS_SETPAR 0x40000

                       ^^^^^^^

Please post a follow up patch to fix the spelling.

Tony