Level: Advanced
 
+Garbage collect fbdev scrolling acceleration
+--------------------------------------------
+
+Scroll acceleration is disabled in fbcon by hard-wiring p->scrollmode =
+SCROLL_REDRAW. There's a ton of code this will allow us to remove:
+- lots of code in fbcon.c
+- a bunch of the hooks in fbcon_ops, maybe the remaining hooks could be called
+  directly instead of the function table (with a switch on p->rotate)
+- fb_copyarea is unused after this, and can be deleted from all drivers
+
+Note that not all acceleration code can be deleted, since clearing and cursor
+support is still accelerated, which might be good candidates for further
+deletion projects.
+
+Contact: Daniel Vetter
+
+Level: Intermediate
+
 idr_init_base()
 ---------------
 
 
        struct vc_data *svc = *default_mode;
        struct fbcon_display *t, *p = &fb_display[vc->vc_num];
        int logo = 1, new_rows, new_cols, rows, cols;
-       int cap, ret;
+       int ret;
 
        if (WARN_ON(info_idx == -1))
            return;
                con2fb_map[vc->vc_num] = info_idx;
 
        info = registered_fb[con2fb_map[vc->vc_num]];
-       cap = info->flags;
 
        if (logo_shown < 0 && console_loglevel <= CONSOLE_LOGLEVEL_QUIET)
                logo_shown = FBCON_LOGO_DONTSHOW;
 
        ops->graphics = 0;
 
-       if ((cap & FBINFO_HWACCEL_COPYAREA) &&
-           !(cap & FBINFO_HWACCEL_DISABLED))
-               p->scrollmode = SCROLL_MOVE;
-       else /* default to something safe */
-               p->scrollmode = SCROLL_REDRAW;
+       /*
+        * No more hw acceleration for fbcon.
+        *
+        * FIXME: Garbage collect all the now dead code after sufficient time
+        * has passed.
+        */
+       p->scrollmode = SCROLL_REDRAW;
 
        /*
         *  ++guenther: console.c:vc_allocate() relies on initializing
 {
        struct fbcon_ops *ops = info->fbcon_par;
        int fh = vc->vc_font.height;
-       int cap = info->flags;
-       u16 t = 0;
-       int ypan = FBCON_SWAP(ops->rotate, info->fix.ypanstep,
-                                 info->fix.xpanstep);
-       int ywrap = FBCON_SWAP(ops->rotate, info->fix.ywrapstep, t);
        int yres = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
        int vyres = FBCON_SWAP(ops->rotate, info->var.yres_virtual,
                                   info->var.xres_virtual);
-       int good_pan = (cap & FBINFO_HWACCEL_YPAN) &&
-               divides(ypan, vc->vc_font.height) && vyres > yres;
-       int good_wrap = (cap & FBINFO_HWACCEL_YWRAP) &&
-               divides(ywrap, vc->vc_font.height) &&
-               divides(vc->vc_font.height, vyres) &&
-               divides(vc->vc_font.height, yres);
-       int reading_fast = cap & FBINFO_READS_FAST;
-       int fast_copyarea = (cap & FBINFO_HWACCEL_COPYAREA) &&
-               !(cap & FBINFO_HWACCEL_DISABLED);
-       int fast_imageblit = (cap & FBINFO_HWACCEL_IMAGEBLIT) &&
-               !(cap & FBINFO_HWACCEL_DISABLED);
 
        p->vrows = vyres/fh;
        if (yres > (fh * (vc->vc_rows + 1)))
                p->vrows -= (yres - (fh * vc->vc_rows)) / fh;
        if ((yres % fh) && (vyres % fh < yres % fh))
                p->vrows--;
-
-       if (good_wrap || good_pan) {
-               if (reading_fast || fast_copyarea)
-                       p->scrollmode = good_wrap ?
-                               SCROLL_WRAP_MOVE : SCROLL_PAN_MOVE;
-               else
-                       p->scrollmode = good_wrap ? SCROLL_REDRAW :
-                               SCROLL_PAN_REDRAW;
-       } else {
-               if (reading_fast || (fast_copyarea && !fast_imageblit))
-                       p->scrollmode = SCROLL_MOVE;
-               else
-                       p->scrollmode = SCROLL_REDRAW;
-       }
 }
 
 #define PITCH(w) (((w) + 7) >> 3)