Index: uspace/drv/fb/amdm37x_dispc/amdm37x_dispc.c
===================================================================
--- uspace/drv/fb/amdm37x_dispc/amdm37x_dispc.c	(revision 7fa203110012b14d9ae5e1f71e0e0c9684707889)
+++ uspace/drv/fb/amdm37x_dispc/amdm37x_dispc.c	(revision f03f10744d42849b83f002d092b667ce95d167aa)
@@ -244,12 +244,4 @@
 }
 
-static int handle_damage(visualizer_t *vs,
-    sysarg_t x0, sysarg_t y0, sysarg_t width, sysarg_t height,
-    sysarg_t x_offset, sysarg_t y_offset)
-{
-	ddf_log_fatal("Handling damage\n");
-	return EOK;
-}
-
 static int change_mode(visualizer_t *vis, vslmode_t mode)
 {
@@ -258,5 +250,6 @@
 
 	amdm37x_dispc_t *dispc = vis->dev_ctx;
-	const unsigned bpp = visual2bpp(mode.cell_visual.pixel_visual);
+	const visual_t visual = mode.cell_visual.pixel_visual;
+	const unsigned bpp = visual2bpp(visual);
 	const unsigned x = mode.screen_width;
 	const unsigned y = mode.screen_height;
@@ -271,4 +264,10 @@
 	}
 	amdm37x_dispc_setup_fb(dispc->regs, x, y, bpp, (uint32_t)pa);
+	dispc->active_fb.idx = mode.index;
+	dispc->active_fb.width = x;
+	dispc->active_fb.height = y;
+	dispc->active_fb.pitch = 0;
+	dispc->active_fb.bpp = bpp;
+	assert(mode.index < 1);
 
 	if (dispc->fb_data)
@@ -276,2 +275,40 @@
 	return EOK;
 }
+
+static int handle_damage(visualizer_t *vs,
+    sysarg_t x0, sysarg_t y0, sysarg_t width, sysarg_t height,
+    sysarg_t x_offset, sysarg_t y_offset)
+{
+	assert(vs);
+	assert(vs->dev_ctx);
+	amdm37x_dispc_t *dispc = vs->dev_ctx;
+	pixelmap_t *map = &vs->cells;
+
+#define FB_POS(x, y) \
+	(((y) * (dispc->active_fb.width + dispc->active_fb.pitch) + (x)) \
+	    * dispc->active_fb.bpp)
+	if (x_offset == 0 && y_offset == 0) {
+		/* Faster damage routine ignoring offsets. */
+		for (sysarg_t y = y0; y < height + y0; ++y) {
+			pixel_t *pixel = pixelmap_pixel_at(map, x0, y);
+			for (sysarg_t x = x0; x < width + x0; ++x) {
+				dispc->pixel2visual(
+				    dispc->fb_data + FB_POS(x, y), *pixel++);
+			}
+		}
+	} else {
+		for (sysarg_t y = y0; y < height + y0; ++y) {
+			for (sysarg_t x = x0; x < width + x0; ++x) {
+				dispc->pixel2visual(
+				    dispc->fb_data + FB_POS(x, y),
+				    *pixelmap_pixel_at(map,
+				        (x + x_offset) % map->width,
+				        (y + y_offset) % map->height));
+			}
+		}
+	}
+
+	ddf_log_note("Handling damage\n");
+	return EOK;
+}
+
Index: uspace/drv/fb/amdm37x_dispc/amdm37x_dispc.h
===================================================================
--- uspace/drv/fb/amdm37x_dispc/amdm37x_dispc.h	(revision 7fa203110012b14d9ae5e1f71e0e0c9684707889)
+++ uspace/drv/fb/amdm37x_dispc/amdm37x_dispc.h	(revision f03f10744d42849b83f002d092b667ce95d167aa)
@@ -46,8 +46,5 @@
 	amdm37x_dispc_regs_t *regs;
 
-	unsigned fb_width;
-	unsigned fb_height;
 	unsigned offset;
-	unsigned scanline;
 	visual_t visual;
 
@@ -55,5 +52,12 @@
 	visual2pixel_t visual2pixel;
 	visual_mask_t visual_mask;
-	unsigned pixel_bytes;
+
+	struct {
+		unsigned width;
+		unsigned height;
+		unsigned pitch;
+		unsigned bpp;
+		unsigned idx;
+	} active_fb;
 
 	size_t size;
