]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mach64: optimize wait_for_fifo
authorMikulas Patocka <mpatocka@redhat.com>
Mon, 8 Oct 2018 10:57:35 +0000 (12:57 +0200)
committerBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Mon, 8 Oct 2018 10:57:35 +0000 (12:57 +0200)
This is a simple optimization for fifo waiting that improves scrolling
performance by 5%. If the queue has more free entries that what we
consume, we can skip the costly register read next time.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Reviewed-by: Ville Syrjälä <syrjala@sci.fi>
Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
drivers/video/fbdev/aty/atyfb.h
drivers/video/fbdev/aty/mach64_accel.c

index d09bab3bf22412cd7ac4c52c5db42ebad5ded86a..e5a347c581801f6e4769df1fdf517e24d4a87ec1 100644 (file)
@@ -147,6 +147,7 @@ struct atyfb_par {
        u16 pci_id;
        u32 accel_flags;
        int blitter_may_be_busy;
+       unsigned fifo_space;
        int asleep;
        int lock_blank;
        unsigned long res_start;
@@ -346,10 +347,13 @@ extern int aty_init_cursor(struct fb_info *info);
      *  Hardware acceleration
      */
 
-static inline void wait_for_fifo(u16 entries, const struct atyfb_par *par)
+static inline void wait_for_fifo(u16 entries, struct atyfb_par *par)
 {
-       while ((aty_ld_le32(FIFO_STAT, par) & 0xffff) >
-              ((u32) (0x8000 >> entries)));
+       unsigned fifo_space = par->fifo_space;
+       while (entries > fifo_space) {
+               fifo_space = 16 - fls(aty_ld_le32(FIFO_STAT, par) & 0xffff);
+       }
+       par->fifo_space = fifo_space - entries;
 }
 
 static inline void wait_for_idle(struct atyfb_par *par)
@@ -359,7 +363,7 @@ static inline void wait_for_idle(struct atyfb_par *par)
        par->blitter_may_be_busy = 0;
 }
 
-extern void aty_reset_engine(const struct atyfb_par *par);
+extern void aty_reset_engine(struct atyfb_par *par);
 extern void aty_init_engine(struct atyfb_par *par, struct fb_info *info);
 
 void atyfb_copyarea(struct fb_info *info, const struct fb_copyarea *area);
index 3ad46255f9904eee63b1c4d4f40cc2c95a3bfab4..e4b2c89baee2d4e1cb422078605baa1c2cfe56b3 100644 (file)
@@ -37,7 +37,7 @@ static u32 rotation24bpp(u32 dx, u32 direction)
        return ((rotation << 8) | DST_24_ROTATION_ENABLE);
 }
 
-void aty_reset_engine(const struct atyfb_par *par)
+void aty_reset_engine(struct atyfb_par *par)
 {
        /* reset engine */
        aty_st_le32(GEN_TEST_CNTL,
@@ -50,6 +50,8 @@ void aty_reset_engine(const struct atyfb_par *par)
        /* HOST errors */
        aty_st_le32(BUS_CNTL,
                aty_ld_le32(BUS_CNTL, par) | BUS_HOST_ERR_ACK | BUS_FIFO_ERR_ACK, par);
+
+       par->fifo_space = 0;
 }
 
 static void reset_GTC_3D_engine(const struct atyfb_par *par)