Author: Elizabeth Myers <elizabeth@adelielinux.org>

I'm certain this fix is wrong fwiw, but it's the best I could come with

--- linux-4.14/drivers/gpu/drm/ast/ast_fb.c.old	2017-11-12 12:46:13.000000000 -0600
+++ linux-4.14/drivers/gpu/drm/ast/ast_fb.c	2018-06-30 20:54:43.530000000 -0500
@@ -109,9 +109,30 @@
 		unmap = true;
 	}
 	for (i = y; i <= y2; i++) {
+		int copy_width = x2 - x + 1;
 		/* assume equal stride for now */
 		src_offset = dst_offset = i * afbdev->afb.base.pitches[0] + (x * bpp);
-		memcpy_toio(bo->kmap.virtual + src_offset, afbdev->sysram + src_offset, (x2 - x + 1) * bpp);
+		switch (bpp) {
+			case 4:
+				while (copy_width) {
+					iowrite32(*(u32 *)(afbdev->sysram + src_offset),
+						    bo->kmap.virtual + src_offset);
+					src_offset += 4;
+					copy_width--;
+				}
+				break;
+			case 2:
+				while (copy_width) {
+					iowrite16(*(u16 *)(afbdev->sysram + src_offset),
+						   bo->kmap.virtual + src_offset);
+					src_offset += 2;
+					copy_width--;
+				}
+				break;
+			default:
+				memcpy_toio(bo->kmap.virtual + src_offset, afbdev->sysram + src_offset, (x2 - x + 1) * bpp);
+				break;
+		}
 
 	}
 	if (unmap)