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

Hello, 

thanks, it look good for me.

Regards

Alex Kern
Am Montag, 20. Januar 2003 09:45 schrieb Antonino Daplas:
> 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
> _______________________________________________
> Linux-fbdev-devel mailing list
> Linux-fbdev-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linux-fbdev-devel



-------------------------------------------------------
This SF.net email is sponsored by: Scholarships for Techies!
Can't afford IT training? All 2003 ictp students receive scholarships.
Get hands-on training in Microsoft, Cisco, Sun, Linux/UNIX, and more.
www.ictp.com/training/sourceforge.asp

  reply	other threads:[~2003-01-22 17:45 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
2003-01-22 17:45   ` Alexander Kern [this message]
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=200301221845.16983.alex.kern@gmx.de \
    --to=alex.kern@gmx.de \
    --cc=adaplas@pol.net \
    --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).