--- linux/drivers/video/aty128fb.c.aty128fb_fix Sat Jun 1 14:51:15 2002 +++ linux/drivers/video/aty128fb.c Sun Jun 2 11:11:03 2002 @@ -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) };