ATI Rage 128 Pro (aty128fb) acceleration fix
PATCH 1/1 ATI Rage 128 Pro (aty128fb) acceleration fix
Hi Marcelo, Hi Ani,
this bug (marc.theaimsgroup.com/?l=linux-fbdev-devel&m=102977461504322&w=2) is still not fixed in latest -BK 2.4.21.
I had the same errors as mentioned in that email. After that patch applied, problems are gone and all is working very well.
Patch credits go to Sergey Vlasov.
This fix has been in WOLK for ages.
ciao, Marc
drivers/video/aty128fb.c renamed from drivers/video/aty128fb.c.aty128fb_fix +112 -9
@@ -2599,6 +2599,15 @@return ; } +if (srcx < dstx) { + srcx += width -1 ; + dstx += width -1 ; + } +if (srcy < dsty) { + srcy += height -1 ; + dsty += height -1 ; + } +wait_for_fifo (2 , info); save_dp_datatype =aty_ld_le32 (DP_DATATYPE ); save_dp_cntl =aty_ld_le32 (DP_CNTL );
@@ -2606,7 +2615,9 @@wait_for_fifo (6 , info);aty_st_le32 (SRC_Y_X , (srcy <<16 ) | srcx);aty_st_le32 (DP_MIX ,ROP3_SRCCOPY |DP_SRC_RECT ); -aty_st_le32 (DP_CNTL ,DST_X_LEFT_TO_RIGHT |DST_Y_TOP_TO_BOTTOM ); +aty_st_le32 (DP_CNTL , + ((srcx >= dstx) ?DST_X_LEFT_TO_RIGHT :0 ) | + ((srcy >= dsty) ?DST_Y_TOP_TO_BOTTOM :0 ));aty_st_le32 (DP_DATATYPE , save_dp_datatype | dstval |SRC_DSTCOLOR );aty_st_le32 (DST_Y_X , (dsty <<16 ) | dstx);
@@ -2641,6 +2652,18 @@#ifdef FBCON_HAS_CFB8 +static void fbcon_aty8_clear (struct vc_data *conp,struct display *p, +int sy,int sx,int height,int width) +{ +struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info); + +if (fb->blitter_may_be_busy) +wait_for_idle (fb); + +fbcon_cfb8_clear (conp, p, sy, sx, height, width); +} + +static void fbcon_aty8_putc (struct vc_data *conp,struct display *p,int c,int yy,int xx) {
@@ -2666,6 +2689,17 @@ } +static void fbcon_aty8_revc (struct display *p,int xx,int yy) +{ +struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info); + +if (fb->blitter_may_be_busy) +wait_for_idle (fb); + +fbcon_cfb8_revc (p, xx, yy); +} + +static void fbcon_aty8_clear_margins (struct vc_data *conp,struct display *p,int bottom_only) {
@@ -2680,15 +2714,27 @@static struct display_switch fbcon_aty128_8 = { setup: fbcon_cfb8_setup, bmove: fbcon_aty128_bmove, - clear: fbcon_cfb8_clear, + clear: fbcon_aty8_clear, putc: fbcon_aty8_putc, putcs: fbcon_aty8_putcs, - revc: fbcon_cfb8_revc, + revc: fbcon_aty8_revc, clear_margins: fbcon_aty8_clear_margins, fontwidthmask:FONTWIDTH (4 )|FONTWIDTH (8 )|FONTWIDTH (12 )|FONTWIDTH (16 ) };#endif #ifdef FBCON_HAS_CFB16 +static void fbcon_aty16_clear (struct vc_data *conp,struct display *p, +int sy,int sx,int height,int width) +{ +struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info); + +if (fb->blitter_may_be_busy) +wait_for_idle (fb); + +fbcon_cfb16_clear (conp, p, sy, sx, height, width); +} + +static void fbcon_aty16_putc (struct vc_data *conp,struct display *p,int c,int yy,int xx) {
@@ -2714,6 +2760,17 @@ } +static void fbcon_aty16_revc (struct display *p,int xx,int yy) +{ +struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info); + +if (fb->blitter_may_be_busy) +wait_for_idle (fb); + +fbcon_cfb16_revc (p, xx, yy); +} + +static void fbcon_aty16_clear_margins (struct vc_data *conp,struct display *p,int bottom_only) {
@@ -2728,15 +2785,27 @@static struct display_switch fbcon_aty128_16 = { setup: fbcon_cfb16_setup, bmove: fbcon_aty128_bmove, - clear: fbcon_cfb16_clear, + clear: fbcon_aty16_clear, putc: fbcon_aty16_putc, putcs: fbcon_aty16_putcs, - revc: fbcon_cfb16_revc, + revc: fbcon_aty16_revc, clear_margins: fbcon_aty16_clear_margins, fontwidthmask:FONTWIDTH (4 )|FONTWIDTH (8 )|FONTWIDTH (12 )|FONTWIDTH (16 ) };#endif #ifdef FBCON_HAS_CFB24 +static void fbcon_aty24_clear (struct vc_data *conp,struct display *p, +int sy,int sx,int height,int width) +{ +struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info); + +if (fb->blitter_may_be_busy) +wait_for_idle (fb); + +fbcon_cfb24_clear (conp, p, sy, sx, height, width); +} + +static void fbcon_aty24_putc (struct vc_data *conp,struct display *p,int c,int yy,int xx) {
@@ -2762,6 +2831,17 @@ } +static void fbcon_aty24_revc (struct display *p,int xx,int yy) +{ +struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info); + +if (fb->blitter_may_be_busy) +wait_for_idle (fb); + +fbcon_cfb24_revc (p, xx, yy); +} + +static void fbcon_aty24_clear_margins (struct vc_data *conp,struct display *p,int bottom_only) {
@@ -2776,15 +2856,27 @@static struct display_switch fbcon_aty128_24 = { setup: fbcon_cfb24_setup, bmove: fbcon_aty128_bmove, - clear: fbcon_cfb24_clear, + clear: fbcon_aty24_clear, putc: fbcon_aty24_putc, putcs: fbcon_aty24_putcs, - revc: fbcon_cfb24_revc, + revc: fbcon_aty24_revc, clear_margins: fbcon_aty24_clear_margins, fontwidthmask:FONTWIDTH (4 )|FONTWIDTH (8 )|FONTWIDTH (12 )|FONTWIDTH (16 ) };#endif #ifdef FBCON_HAS_CFB32 +static void fbcon_aty32_clear (struct vc_data *conp,struct display *p, +int sy,int sx,int height,int width) +{ +struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info); + +if (fb->blitter_may_be_busy) +wait_for_idle (fb); + +fbcon_cfb32_clear (conp, p, sy, sx, height, width); +} + +static void fbcon_aty32_putc (struct vc_data *conp,struct display *p,int c,int yy,int xx) {
@@ -2810,6 +2902,17 @@ } +static void fbcon_aty32_revc (struct display *p,int xx,int yy) +{ +struct fb_info_aty128 *fb = (struct fb_info_aty128 *)(p->fb_info); + +if (fb->blitter_may_be_busy) +wait_for_idle (fb); + +fbcon_cfb32_revc (p, xx, yy); +} + +static void fbcon_aty32_clear_margins (struct vc_data *conp,struct display *p,int bottom_only) {
@@ -2824,10 +2927,10 @@static struct display_switch fbcon_aty128_32 = { setup: fbcon_cfb32_setup, bmove: fbcon_aty128_bmove, - clear: fbcon_cfb32_clear, + clear: fbcon_aty32_clear, putc: fbcon_aty32_putc, putcs: fbcon_aty32_putcs, - revc: fbcon_cfb32_revc, + revc: fbcon_aty32_revc, clear_margins: fbcon_aty32_clear_margins, fontwidthmask:FONTWIDTH (4 )|FONTWIDTH (8 )|FONTWIDTH (12 )|FONTWIDTH (16 ) };