Re: Error in fbcon_switch ?
From: Geert Uytterhoeven <geert@linux-m68k.org>
Date: 2008-05-21 07:17:53
On Tue, 20 May 2008, Krzysztof Helt wrote:
I run into issue when two virtual consoles (tty1 and tty2) are set to different display modes: one with interlace and one without. When console is switched, the setting of the interlaced mode is not honoured, ie. tty1 (lace) -> tty2 (non-lace) -> tty1 (lace) -> tty2 (non-lace) gives tty1 (lace) -> tty2 (lace) -> tty1 (lace) -> tty2 (lace) Of course, the refresh rate (and other timings) are not correct on the tty2 as the resolution and pixclock are preserved.
Interesting, I'll give it a try on my Amiga tonight...
I found that root of the problem is that fbcon_switch copies the var.vmode field from the previous console. If this copy is removed everything is alright, ie. tty1 (lace) -> tty2 (non-lace) -> tty1 (lace) -> tty2 (non-lace) Is this a correct solution to the problem? What is a purpose of copying vmode field? The vmode field contains following settings: #define FB_VMODE_INTERLACED 1 /* interlaced */ #define FB_VMODE_DOUBLE 2 /* double scan */ #define FB_VMODE_ODD_FLD_FIRST 4 /* interlaced: top line first */ #define FB_VMODE_MASK 255 #define FB_VMODE_YWRAP 256 /* ywrap instead of panning */ #define FB_VMODE_SMOOTH_XPAN 512 /* smooth xpan possible (internally used) */ #define FB_VMODE_CONUPDATE 512 /* don't update x/yoffset */ IMO, at least the first three should not be copied. I am not sure about YWRAP and CONUPDATE/SMOOTH_XPAN.
As it copies [xy]offset, it probably needs YWRAP/SMOOTH_XPAN/CONUPDATE. So I guess it should keep the bits under FB_VMODE_MASK.
quoted hunk ↗ jump to hunk
Regards, Krzysztof PS. The patch below is my fix: diff -urp linux-old/drivers/video/console/fbcon.c linux-new/drivers/video/console/fbcon.c--- linux-old/drivers/video/console/fbcon.c 2008-05-12 19:27:04.305519626 +0200 +++ linux-new/drivers/video/console/fbcon.c 2008-05-20 23:06:44.235878754 +0200@@ -2266,7 +2266,6 @@ static int fbcon_switch(struct vc_data * info->var.activate = var.activate; var.yoffset = info->var.yoffset; var.xoffset = info->var.xoffset; - var.vmode = info->var.vmode; fb_set_var(info, &var); ops->var = info->var;
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/