Re: Radeon Framebuffer Driver in 2.6.3?

From: arief#
Date: Fri Feb 27 2004 - 05:02:25 EST


Dear all.


This patch from Benjamin solved my problem.

To Zilvinas <zilvinas@xxxxxxxxx>, 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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/