lkml.org 
[lkml]   [2004]   [Feb]   [27]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: Radeon Framebuffer Driver in 2.6.3?
Fromarief# <>
DateFri, 27 Feb 2004 17:06:13 +0700
Dear all.


This patch from Benjamin solved my problem.

To Zilvinas <zilvinas@gemtek.lt>, I've tried your suggestion to change
my XF86Config-4 file to include UseFBDev line. But it doesnt work. It
made my Xserver wont even start. But I'm not sure, it could be X problem
(Debian Unstable got some updated X package that I haven't got a chance
to upgrade to).

Anyway, thanks for all who cared.


Regards
-arief


On Fri, 2004-02-27 at 14:04, Benjamin Herrenschmidt wrote:
> On Fri, 2004-02-27 at 17:27, arief# wrote:> > Dear all,> > > > > > Before, please cc me the answer, as I'm not on the list right now.
> > > > In 2.6.3 (including -mmX patches), radeon framebuffer seems to having
> > problems. Everytime I do clear screen, it only 'half cleared'. I still
> > can see the mark of the previous texts in shaded mode. And it does not
> > do deletion well, too. > > > > Anybody else having the same problem?> > If it happens only after switching back from XFree, then it's a known
> problem. I have implemented a fix locally but got sidetracked before I
> could test it properly. > > Can you test the patch below ? :> > ===== drivers/char/vt.c 1.61 vs edited =====> --- 1.61/drivers/char/vt.c	Thu Feb 19 14:43:03 2004
> +++ edited/drivers/char/vt.c	Fri Feb 27 17:27:09 2004
> @@ -2743,12 +2743,12 @@>       *  Called only if powerdown features are allowed.
>       */
>      switch (vesa_blank_mode) {
> -	case VESA_NO_BLANKING:
> -	    c->vc_sw->con_blank(c, VESA_VSYNC_SUSPEND+1);
> +    case VESA_NO_BLANKING:
> +	    c->vc_sw->con_blank(c, VESA_VSYNC_SUSPEND+1, 0);
>  	    break;
> -	case VESA_VSYNC_SUSPEND:
> -	case VESA_HSYNC_SUSPEND:
> -	    c->vc_sw->con_blank(c, VESA_POWERDOWN+1);
> +    case VESA_VSYNC_SUSPEND:
> +    case VESA_HSYNC_SUSPEND:
> +	    c->vc_sw->con_blank(c, VESA_POWERDOWN+1, 0);
>  	    break;
>      }
>  }
> @@ -2776,7 +2776,7 @@
>  	if (entering_gfx) {
>  		hide_cursor(currcons);
>  		save_screen(currcons);
> -		sw->con_blank(vc_cons[currcons].d, -1);
> +		sw->con_blank(vc_cons[currcons].d, -1, 1);
>  		console_blanked = fg_console + 1;
>  		set_origin(currcons);
>  		return;
> @@ -2794,7 +2794,7 @@
> 
>  	save_screen(currcons);
>  	/* In case we need to reset origin, blanking hook returns 1 */
> -	i = sw->con_blank(vc_cons[currcons].d, 1);
> +	i = sw->con_blank(vc_cons[currcons].d, 1, 0);
>  	console_blanked = fg_console + 1;
>  	if (i)
>  		set_origin(currcons);
> @@ -2808,14 +2808,14 @@
>  	}
> 
>      	if (vesa_blank_mode)
> -		sw->con_blank(vc_cons[currcons].d, vesa_blank_mode + 1);
> +		sw->con_blank(vc_cons[currcons].d, vesa_blank_mode + 1, 0);
>  }
> 
> 
>  /*
>   * Called by timer as well as from vt_console_driver
>   */
> -void unblank_screen(void)
> +void do_unblank_screen(int leaving_gfx)
>  {
>  	int currcons;
> 
> @@ -2839,13 +2839,24 @@
>  	}
> 
>  	console_blanked = 0;
> -	if (sw->con_blank(vc_cons[currcons].d, 0))
> +	if (sw->con_blank(vc_cons[currcons].d, 0, leaving_gfx))
>  		/* Low-level driver cannot restore -> do it ourselves */
>  		update_screen(fg_console);
>  	if (console_blank_hook)
>  		console_blank_hook(0);
>  	set_palette(currcons);
>  	set_cursor(fg_console);
> +}
> +
> +/*
> + * This is called by the outside world to cause a forced unblank, mostly for
> + * oopses. Currently, I just call do_unblank_screen(0), but we could eventually
> + * call it with 1 as an argument and so force a mode restore... that may kill
> + * X or at least garbage the screen but would also make the Oops visible...
> + */
> +void unblank_screen(void)
> +{
> +	do_unblank_screen(0);
>  }
> 
>  /*
> ===== drivers/char/vt_ioctl.c 1.34 vs edited =====
> --- 1.34/drivers/char/vt_ioctl.c	Wed Feb 25 21:31:13 2004
> +++ edited/drivers/char/vt_ioctl.c	Fri Feb 27 17:27:21 2004
> @@ -497,7 +497,7 @@
>  		 */
>  		acquire_console_sem();
>  		if (arg == KD_TEXT)
> -			unblank_screen();
> +			do_unblank_screen(1);
>  		else
>  			do_blank_screen(1);
>  		release_console_sem();
> @@ -1103,7 +1103,7 @@
>  	if (old_vc_mode != vt_cons[new_console]->vc_mode)
>  	{
>  		if (vt_cons[new_console]->vc_mode == KD_TEXT)
> -			unblank_screen();
> +			do_unblank_screen(1);
>  		else
>  			do_blank_screen(1);
>  	}
> @@ -1138,7 +1138,7 @@
>  			if (old_vc_mode != vt_cons[new_console]->vc_mode)
>  			{
>  				if (vt_cons[new_console]->vc_mode == KD_TEXT)
> -					unblank_screen();
> +					do_unblank_screen(1);
>  				else
>  					do_blank_screen(1);
>  			}
> ===== drivers/video/fbmem.c 1.90 vs edited =====
> --- 1.90/drivers/video/fbmem.c	Mon Feb 16 23:42:15 2004
> +++ edited/drivers/video/fbmem.c	Fri Feb 27 17:25:21 2004
> @@ -943,7 +943,8 @@
>  {
>  	int err;
> 
> -	if (memcmp(&info->var, var, sizeof(struct fb_var_screeninfo))) {
> +	if ((var->activate & FB_ACTIVATE_FORCE) ||
> +	    memcmp(&info->var, var, sizeof(struct fb_var_screeninfo))) {
>  		if (!info->fbops->fb_check_var) {
>  			*var = info->var;
>  			return 0;
> ===== drivers/video/console/fbcon.c 1.109 vs edited =====
> --- 1.109/drivers/video/console/fbcon.c	Mon Feb 16 05:22:04 2004
> +++ edited/drivers/video/console/fbcon.c	Fri Feb 27 17:47:24 2004
> @@ -159,7 +159,7 @@
>  static void fbcon_bmove(struct vc_data *vc, int sy, int sx, int dy, int dx,
>  			int height, int width);
>  static int fbcon_switch(struct vc_data *vc);
> -static int fbcon_blank(struct vc_data *vc, int blank);
> +static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch);
>  static int fbcon_font_op(struct vc_data *vc, struct console_font_op *op);
>  static int fbcon_set_palette(struct vc_data *vc, unsigned char *table);
>  static int fbcon_scrolldelta(struct vc_data *vc, int lines);
> @@ -1696,14 +1696,23 @@
>  	return 1;
>  }
> 
> -static int fbcon_blank(struct vc_data *vc, int blank)
> +static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
>  {
>  	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
>  	struct fb_info *info = registered_fb[(int) con2fb_map[vc->vc_num]];
>  	struct display *p = &fb_display[vc->vc_num];
> 
> -	if (blank < 0)		/* Entering graphics mode */
> -		return 0;
> +	if (mode_switch) {
> +		struct fb_info *info = registered_fb[(int) con2fb_map[vc->vc_num]];
> +		struct fb_var_screeninfo var = info->var;
> +
> +		if (blank) {
> +			fbcon_cursor(vc, CM_ERASE);
> +			return 0;
> +		}
> +		var.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE;
> +		fb_set_var(info, &var);
> +	}
> 
>  	fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW);
> 
> ===== drivers/video/console/promcon.c 1.9 vs edited =====
> --- 1.9/drivers/video/console/promcon.c	Wed Dec 11 14:49:09 2002
> +++ edited/drivers/video/console/promcon.c	Fri Feb 27 17:24:34 2004
> @@ -463,7 +463,7 @@
>  }
> 
>  static int
> -promcon_blank(struct vc_data *conp, int blank)
> +promcon_blank(struct vc_data *conp, int blank, int mode_switch)
>  {
>  	if (blank) {
>  		promcon_puts("\033[H\033[J\033[7m \033[m\b", 15);
> ===== drivers/video/console/sticon.c 1.8 vs edited =====
> --- 1.8/drivers/video/console/sticon.c	Wed Jan  8 11:45:15 2003
> +++ edited/drivers/video/console/sticon.c	Fri Feb 27 17:24:42 2004
> @@ -250,26 +250,18 @@
>      return 0;
>  }
> 
> -static int sticon_blank(struct vc_data *c, int blank)
> +static int sticon_blank(struct vc_data *c, int blank, int mode_switch)
>  {
> -    switch (blank) {
> -    case 0:		/* unblank */
> -	vga_is_gfx = 0;
> -	/* Tell console.c that it has to restore the screen itself */
> -	return 1;
> -    case 1:		/* normal blanking */
> -    default:		/* VESA blanking */
> -	if (vga_is_gfx)
> -		return 0;
> -	sticon_set_origin(c);
> -	sti_clear(sticon_sti, 0,0, c->vc_rows, c->vc_cols, BLANK);
> -	return 1;
> -    case -1:		/* Entering graphic mode */
> -	sti_clear(sticon_sti, 0,0, c->vc_rows, c->vc_cols, BLANK);
> -	vga_is_gfx = 1;
> +    if (blank == 0) {
> +	if (mode_switch)
> +	    vga_is_gfx = 0;
>  	return 1;
>      }
> -    return 1;		/* console needs to restore screen itself */
> +    sticon_set_origin(c);
> +    sti_clear(sticon_sti, 0,0, c->vc_rows, c->vc_cols, BLANK);
> +    if (mode_switch)
> +	vga_is_gfx = 1;
> +    return 1;
>  }
> 
>  static int sticon_scrolldelta(struct vc_data *conp, int lines)
> ===== drivers/video/console/vgacon.c 1.15 vs edited =====
> --- 1.15/drivers/video/console/vgacon.c	Wed Mar 12 04:17:29 2003
> +++ edited/drivers/video/console/vgacon.c	Fri Feb 27 17:24:57 2004
> @@ -76,7 +76,7 @@
>  static void vgacon_deinit(struct vc_data *c);
>  static void vgacon_cursor(struct vc_data *c, int mode);
>  static int vgacon_switch(struct vc_data *c);
> -static int vgacon_blank(struct vc_data *c, int blank);
> +static int vgacon_blank(struct vc_data *c, int blank, int mode_switch);
>  static int vgacon_font_op(struct vc_data *c, struct console_font_op *op);
>  static int vgacon_set_palette(struct vc_data *vc, unsigned char *table);
>  static int vgacon_scrolldelta(struct vc_data *c, int lines);
> @@ -661,7 +661,7 @@
>  	}
>  }
> 
> -static int vgacon_blank(struct vc_data *c, int blank)
> +static int vgacon_blank(struct vc_data *c, int blank, int mode_switch)
>  {
>  	switch (blank) {
>  	case 0:		/* Unblank */
> @@ -678,7 +678,8 @@
>  		/* Tell console.c that it has to restore the screen itself */
>  		return 1;
>  	case 1:		/* Normal blanking */
> -		if (vga_video_type == VIDEO_TYPE_VGAC) {
> +	case -1:	/* Obsolete */
> +		if (!mode_switch && vga_video_type == VIDEO_TYPE_VGAC) {
>  			vga_pal_blank(&state);
>  			vga_palette_blanked = 1;
>  			return 0;
> @@ -686,11 +687,8 @@
>  		vgacon_set_origin(c);
>  		scr_memsetw((void *) vga_vram_base, BLANK,
>  			    c->vc_screenbuf_size);
> -		return 1;
> -	case -1:		/* Entering graphic mode */
> -		scr_memsetw((void *) vga_vram_base, BLANK,
> -			    c->vc_screenbuf_size);
> -		vga_is_gfx = 1;
> +		if (mode_switch)
> +			vga_is_gfx = 1;
>  		return 1;
>  	default:		/* VESA blanking */
>  		if (vga_video_type == VIDEO_TYPE_VGAC) {
> ===== include/linux/console.h 1.11 vs edited =====
> --- 1.11/include/linux/console.h	Wed Feb  4 16:28:11 2004
> +++ edited/include/linux/console.h	Fri Feb 27 17:26:10 2004
> @@ -37,7 +37,7 @@
>  	int	(*con_scroll)(struct vc_data *, int, int, int, int);
>  	void	(*con_bmove)(struct vc_data *, int, int, int, int, int, int);
>  	int	(*con_switch)(struct vc_data *);
> -	int	(*con_blank)(struct vc_data *, int);
> +	int	(*con_blank)(struct vc_data *, int, int);
>  	int	(*con_font_op)(struct vc_data *, struct console_font_op *);
>  	int	(*con_resize)(struct vc_data *, unsigned int, unsigned int);
>  	int	(*con_set_palette)(struct vc_data *, unsigned char *);
> ===== include/linux/fb.h 1.60 vs edited =====
> --- 1.60/include/linux/fb.h	Mon Feb 16 04:07:11 2004
> +++ edited/include/linux/fb.h	Fri Feb 27 17:26:19 2004
> @@ -152,6 +152,7 @@
>  #define FB_ACTIVATE_VBL	       16	/* activate values on next vbl  */
>  #define FB_CHANGE_CMAP_VBL     32	/* change colormap on vbl	*/
>  #define FB_ACTIVATE_ALL	       64	/* change all VCs on this fb	*/
> +#define FB_ACTIVATE_FORCE     128	/* force apply even when no change*/
> 
>  #define FB_ACCELF_TEXT		1	/* text mode acceleration */
> 
> ===== include/linux/vt_kern.h 1.9 vs edited =====
> --- 1.9/include/linux/vt_kern.h	Wed Mar 12 04:17:29 2003
> +++ edited/include/linux/vt_kern.h	Fri Feb 27 17:25:42 2004
> @@ -44,7 +44,8 @@
>  void vc_disallocate(unsigned int console);
>  void reset_palette(int currcons);
>  void set_palette(int currcons);
> -void do_blank_screen(int gfx_mode);
> +void do_blank_screen(int entering_gfx);
> +void do_unblank_screen(int leaving_gfx);
>  void unblank_screen(void);
>  void poke_blanked_console(void);
>  int con_font_op(int currcons, struct console_font_op *op);
> 
> 
> 

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:01    [from the cache]
©2003-2008