Skip to contentSkip to conversation

ATI Rage 128 Pro (aty128fb) acceleration fix

PATCH New Marc-Christian Petersen 1 participant 1 message Dec 10, 2002 Framebuffer layer

lore
Share & tools
lore
#0 lore raw

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)
 };