Messages in this thread |  | | | Subject | Re: Radeon Framebuffer Driver in 2.6.3? | | From | arief# <> | | Date | Fri, 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/
|  |