linux-fbdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Antonino Daplas <adaplas@pol.net>
To: Alexander Kern <alex.kern@gmx.de>
Cc: Linux Fbdev development list <linux-fbdev-devel@lists.sourceforge.net>
Subject: Re: Fwd: [PATCH 2.5.59] fix for fbcon.c
Date: 20 Jan 2003 16:45:24 +0800	[thread overview]
Message-ID: <1043052322.3282.41.camel@localhost.localdomain> (raw)
In-Reply-To: <200301191956.33826.alex.kern@gmx.de>

On Mon, 2003-01-20 at 02:56, Alexander Kern wrote: 
[...] 
> --- linux-2.5.orig/drivers/video/console/fbcon.c	2003-01-17 16:13:53.000000000 +0100
> +++ linux/drivers/video/console/fbcon.c	2003-01-19 19:17:23.000000000 +0100
> @@ -1876,17 +1876,23 @@
>  	struct display *p = &fb_display[vc->vc_num];
>  	struct fb_info *info = p->fb_info;
>  	struct fb_var_screeninfo var = info->var;
> -	int err;
> +	int err; int x_diff, y_diff;
>  
>  	var.xres = width * vc->vc_font.width;
>  	var.yres = height * vc->vc_font.height;
>  	var.activate = FB_ACTIVATE_NOW;
> -
> +	x_diff = info->var.xres - var.xres;
> +	y_diff = info->var.yres - var.yres;
> +	if(x_diff < 0 || x_diff > vc->vc_font.width ||
> +	  (y_diff < 0 || y_diff > vc->vc_font.height)) {
> +		DPRINTK("resize now %ix%i\n", var.xres, var.yres);
>  	err = fb_set_var(&var, info);
>  	return  (err || var.xres != info->var.xres ||
> -		 var.yres != info->var.yres) ?
> -		-EINVAL : 0;
> -	  
> +			var.yres != info->var.yres) ? -EINVAL : 0;
> +	} else {
> +		DPRINTK("prevent resize\n");
> +		return 0;
> +	}
>  }
>  
>  static int fbcon_switch(struct vc_data *vc)

Yes, that will work, only if all your console have the same window
size.  If the size of one of your console is different, then these tests
(x_diff > vc->vc_font.width || y_diff > vc->vc_font.height) will become
true each time you switch consoles, so you'll be back with a yres of
1040 instead of 1050.  The best solution is for the driver to round up
to 1050 if 1040 is not acceptable. 

Still, its much better than the old one :-).  If you don't mind, I'll
add a few things to your patch: 

a.  We do not need to activate the hardware immediately if there is a
chance of failure. 

b.  The xres/yres returned from fb_set_var() will be acceptable as long
as the value is within a fontwidth/fontheight. This should fix hardware
that only has a limited set of video modes. 

BTW, I'm also attaching a diff to fix vc_resize() in vt.c. In
vc_resize(), if con_resize() exits with an error, the new console
dimensions are not reset to the original, and memory from kmalloc() is
not freed.  

Tony 

PATCH 1: fbcon_resize 
<< begin >> 

diff -Naur linux-2.5.59/drivers/video/console/fbcon.c linux/drivers/video/console/fbcon.c
--- linux-2.5.59/drivers/video/console/fbcon.c	2003-01-20 08:19:50.000000000 +0000
+++ linux/drivers/video/console/fbcon.c	2003-01-20 08:37:06.000000000 +0000
@@ -1870,23 +1870,35 @@
 }
 

-static int fbcon_resize(struct vc_data *vc, unsigned int width, 
-			unsigned int height)
+ static int fbcon_resize(struct vc_data *vc, unsigned int width, 
+			 unsigned int height)
 {
 	struct display *p = &fb_display[vc->vc_num];
 	struct fb_info *info = p->fb_info;
 	struct fb_var_screeninfo var = info->var;
-	int err;
-
-	var.xres = width * vc->vc_font.width;
-	var.yres = height * vc->vc_font.height;
-	var.activate = FB_ACTIVATE_NOW;
-
-	err = fb_set_var(&var, info);
-	return  (err || var.xres != info->var.xres ||
-		 var.yres != info->var.yres) ?
-		-EINVAL : 0;
-	  
+	int err; int x_diff, y_diff;
+	int fw = vc->vc_font.width;
+	int fh = vc->vc_font.height;
+
+	var.xres = width * fw;
+	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)) {
+		var.activate = FB_ACTIVATE_TEST;
+		err = fb_set_var(&var, info);
+		if (err || width != var.xres/fw ||
+		    height != var.yres/fh)
+			return -EINVAL;
+		DPRINTK("resize now %ix%i\n", var.xres, var.yres);
+		var.activate = FB_ACTIVATE_NOW;
+		fb_set_var(&var, info);
+		p->vrows = info->var.yres_virtual/fh;
+	} else {
+		DPRINTK("prevent resize\n");
+	}
+	return 0;
 }
 
 static int fbcon_switch(struct vc_data *vc)
<< end >> 

PATCH 2: vc_resize 

<< begin >> 

diff -Naur linux-2.5.59/drivers/char/vt.c linux/drivers/char/vt.c
--- linux-2.5.59/drivers/char/vt.c	2003-01-20 08:18:11.000000000 +0000
+++ linux/drivers/char/vt.c	2003-01-20 08:17:37.000000000 +0000
@@ -732,6 +732,10 @@
 	if (new_cols == video_num_columns && new_rows == video_num_lines)
 		return 0;
 
+	err = resize_screen(currcons, new_cols, new_rows);
+	if (err)
+		return err;
+
 	newscreen = (unsigned short *) kmalloc(new_screen_size, GFP_USER);
 	if (!newscreen)
 		return -ENOMEM;
@@ -746,9 +750,6 @@
 	video_size_row = new_row_size;
 	screenbuf_size = new_screen_size;
 
-	err = resize_screen(currcons, new_cols, new_rows);
-	if (err)
-		return err;
 
 	rlth = min(old_row_size, new_row_size);
 	rrem = new_row_size - rlth;
<< end >>



-------------------------------------------------------
This SF.NET email is sponsored by: FREE  SSL Guide from Thawte
are you planning your Web Server Security? Click here to get a FREE
Thawte SSL guide and find the answers to all your  SSL security issues.
http://ads.sourceforge.net/cgi-bin/redirect.pl?thaw0026en

  reply	other threads:[~2003-01-20  8:55 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-01-19 18:56 Fwd: [PATCH 2.5.59] fix for fbcon.c Alexander Kern
2003-01-20  8:45 ` Antonino Daplas [this message]
2003-01-22 17:45   ` Alexander Kern
2003-02-17 11:33   ` Antonino Daplas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1043052322.3282.41.camel@localhost.localdomain \
    --to=adaplas@pol.net \
    --cc=alex.kern@gmx.de \
    --cc=linux-fbdev-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).