Re: Re: [PATCH][FBCON]: Mode Switch in fbcon_blank()
flat view
From: Antonino A. Daplas <hidden>
Date: 2004-07-04 15:48:07
On Friday 02 July 2004 18:25, Javier Marcet wrote:
Benjamin Herrenschmidt wrote:quoted
quoted
As we've discussed in another thread, below is a diff that will do a set_par() as late as possible when there is KD_TEXT<->KD_GRAPHICS switch. The set_par() will be forced in fbcon_resize() instead. Not sure if this has repercussions with the other drivers, but this patch fixed the X nv driver hanging when switching to the console. (I believe the crash is actually caused by an early set_par() -- while in fbcon_blank. Removing the set_par in fbcon_blank fixed the hang but caused cursor sprite and display corruption).Well... I don't know. It seem to work, so it's probably an acceptable workaround, but I'd like to find out what's wrong with doing it in blank precisely (that is what is the bug in XFree or in the kernel VT), since it's shared by many X drivers, I don't suppose it's a bug in them.This was included in 2.6.7-mm5 -that's how I noticed it- and I had to revert it. I use radeonfb and when switching from X to console my two monitors will go out of sync. The VT is actually there since I can type on it, but I can't see anything on neither of my two monitors :(
Jurriaan's problem told me that I'm probably over-engineering the mode switch code. Perhaps the ugly workaround patch is not necessary. All that is needed is to bypass fbcon_resize() and just do a simple set_par(). David, Javier, can you try the patch below? Reverse the one with the big HACK ALERT comment first. If it works for you two, the code just became simpler. Tony Signed-off-by: Antonino A. Daplas <redacted> diff -Naur linux-2.6.7-mm5-orig/drivers/video/console/fbcon.c linux-2.6.7-mm5/drivers/video/console/fbcon.c
--- linux-2.6.7-mm5-orig/drivers/video/console/fbcon.c 2004-07-04 23:34:29.873322872 +0800
+++ linux-2.6.7-mm5/drivers/video/console/fbcon.c 2004-07-04 23:36:18.169859296 +0800@@ -1679,8 +1679,7 @@ var.yres = height * fh; x_diff = info->var.xres - var.xres; y_diff = info->var.yres - var.yres; - if (x_diff < 0 || x_diff > fw || (y_diff < 0 || y_diff > fh) || - (info->flags & FBINFO_MISC_MODESWITCH)) { + if (x_diff < 0 || x_diff > fw || (y_diff < 0 || y_diff > fh)) { char mode[40]; DPRINTK("attempting resize %ix%i\n", var.xres, var.yres);
@@ -1695,12 +1694,9 @@ return -EINVAL; DPRINTK("resize now %ix%i\n", var.xres, var.yres); if (CON_IS_VISIBLE(vc)) { - var.activate = FB_ACTIVATE_NOW | - (info->flags & FBINFO_MISC_MODESWITCH) ? - FB_ACTIVATE_FORCE : 0; + var.activate = FB_ACTIVATE_NOW; fb_set_var(info, &var); } - info->flags &= ~FBINFO_MISC_MODESWITCH; } updatescrollmode(p, info, vc); return 0;
@@ -1752,6 +1748,13 @@ } fbcon_resize(vc, vc->vc_cols, vc->vc_rows); + + if (info->flags & FBINFO_MISC_MODESWITCH && + info->fbops->fb_set_par) { + info->fbops->fb_set_par(info); + } + info->flags &= ~FBINFO_MISC_MODESWITCH; + switch (p->scrollmode) { case SCROLL_WRAP: scrollback_phys_max = p->vrows - vc->vc_rows; -------------------------------------------------------
This SF.Net email sponsored by Black Hat Briefings & Training. Attend Black Hat Briefings & Training, Las Vegas July 24-29 - digital self defense, top technical experts, no vendor pitches, unmatched networking opportunities. Visit www.blackhat.com