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)