Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=a140e94d92f82db7406e116b63e78bd024907657
Commit:     a140e94d92f82db7406e116b63e78bd024907657
Parent:     6993bea1b6ff49312f19339b3469db5887dfd633
Author:     Krzysztof Helt <[EMAIL PROTECTED]>
AuthorDate: Sun Aug 5 18:05:29 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Sat Oct 13 21:53:08 2007 -0700

    [CG6]: accelerated copyarea
    
    This patch adds accelerated copyarea and sets READS_FAST flag.
    This doubles scrolling speed on SparcStation20 85MHz.
    
    It also fixes a comment in cg6_fillrect function.
    
    Signed-off-by: Krzysztof Helt <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 drivers/video/cg6.c |   52 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 49 insertions(+), 3 deletions(-)

diff --git a/drivers/video/cg6.c b/drivers/video/cg6.c
index 137e475..549891d 100644
--- a/drivers/video/cg6.c
+++ b/drivers/video/cg6.c
@@ -37,6 +37,7 @@ static void cg6_fillrect(struct fb_info *, const struct 
fb_fillrect *);
 static int cg6_sync(struct fb_info *);
 static int cg6_mmap(struct fb_info *, struct vm_area_struct *);
 static int cg6_ioctl(struct fb_info *, unsigned int, unsigned long);
+static void cg6_copyarea(struct fb_info *info, const struct fb_copyarea *area);
 
 /*
  *  Frame buffer operations
@@ -47,7 +48,7 @@ static struct fb_ops cg6_ops = {
        .fb_setcolreg           = cg6_setcolreg,
        .fb_blank               = cg6_blank,
        .fb_fillrect            = cg6_fillrect,
-       .fb_copyarea            = cfb_copyarea,
+       .fb_copyarea            = cg6_copyarea,
        .fb_imageblit           = cg6_imageblit,
        .fb_sync                = cg6_sync,
        .fb_mmap                = cg6_mmap,
@@ -292,10 +293,12 @@ static void cg6_fillrect(struct fb_info *info, const 
struct fb_fillrect *rect)
        unsigned long flags;
        s32 val;
 
-       /* XXX doesn't handle ROP_XOR */
+       /* CG6 doesn't handle ROP_XOR */
 
        spin_lock_irqsave(&par->lock, flags);
+
        cg6_sync(info);
+
        sbus_writel(rect->color, &fbc->fg);
        sbus_writel(~(u32)0, &fbc->pixelm);
        sbus_writel(0xea80ff00, &fbc->alu);
@@ -313,6 +316,48 @@ static void cg6_fillrect(struct fb_info *info, const 
struct fb_fillrect *rect)
 }
 
 /**
+ *     cg6_copyarea - Copies one area of the screen to another area.
+ *
+ *     @info: frame buffer structure that represents a single frame buffer
+ *     @area: Structure providing the data to copy the framebuffer contents
+ *             from one region to another.
+ *
+ *     This drawing operation copies a rectangular area from one area of the
+ *     screen to another area.
+ */
+static void cg6_copyarea(struct fb_info *info, const struct fb_copyarea *area)
+{
+       struct cg6_par *par = (struct cg6_par *)info->par;
+       struct cg6_fbc __iomem *fbc = par->fbc;
+       unsigned long flags;
+       int i;
+
+       spin_lock_irqsave(&par->lock, flags);
+
+       cg6_sync(info);
+
+       sbus_writel(0xff, &fbc->fg);
+       sbus_writel(0x00, &fbc->bg);
+       sbus_writel(~0, &fbc->pixelm);
+       sbus_writel(0xe880cccc, &fbc->alu);
+       sbus_writel(0, &fbc->s);
+       sbus_writel(0, &fbc->clip);
+
+       sbus_writel(area->sy, &fbc->y0);
+       sbus_writel(area->sx, &fbc->x0);
+       sbus_writel(area->sy + area->height - 1, &fbc->y1);
+       sbus_writel(area->sx + area->width - 1, &fbc->x1);
+       sbus_writel(area->dy, &fbc->y2);
+       sbus_writel(area->dx, &fbc->x2);
+       sbus_writel(area->dy + area->height - 1, &fbc->y3);
+       sbus_writel(area->dx + area->width - 1, &fbc->x3);
+       do {
+               i = sbus_readl(&fbc->blit);
+       } while (i < 0 && (i & 0x20000000));
+       spin_unlock_irqrestore(&par->lock, flags);
+}
+
+/**
  *     cg6_imageblit - Copies a image from system memory to the screen.
  *
  *     @info: frame buffer structure that represents a single frame buffer
@@ -708,7 +753,8 @@ static int __devinit cg6_probe(struct of_device *op,
                                sizeof(u32), "cgsix fhc");
 
        info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_IMAGEBLIT |
-                       FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT;
+                       FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT |
+                       FBINFO_READS_FAST;
        info->fbops = &cg6_ops;
 
        info->screen_base = of_ioremap(&op->resource[0], CG6_RAM_OFFSET,
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to