for (i = 0; i < ARRAY_SIZE(ast->cursor.gbo); ++i) {
                gbo = ast->cursor.gbo[i];
-               drm_gem_vram_vunmap(gbo, &ast->cursor.map[i]);
                drm_gem_vram_unpin(gbo);
                drm_gem_vram_put(gbo);
        }
 }
 
 /*
- * Allocate cursor BOs and pins them at the end of VRAM.
+ * Allocate cursor BOs and pin them at the end of VRAM.
  */
 int ast_cursor_init(struct ast_private *ast)
 {
        struct drm_device *dev = &ast->base;
        size_t size, i;
        struct drm_gem_vram_object *gbo;
-       struct dma_buf_map map;
        int ret;
 
        size = roundup(AST_HWC_SIZE + AST_HWC_SIGNATURE_SIZE, PAGE_SIZE);
                        drm_gem_vram_put(gbo);
                        goto err_drm_gem_vram_put;
                }
-               ret = drm_gem_vram_vmap(gbo, &map);
-               if (ret) {
-                       drm_gem_vram_unpin(gbo);
-                       drm_gem_vram_put(gbo);
-                       goto err_drm_gem_vram_put;
-               }
-
                ast->cursor.gbo[i] = gbo;
-               ast->cursor.map[i] = map;
        }
 
        return drmm_add_action_or_reset(dev, ast_cursor_release, NULL);
        while (i) {
                --i;
                gbo = ast->cursor.gbo[i];
-               drm_gem_vram_vunmap(gbo, &ast->cursor.map[i]);
                drm_gem_vram_unpin(gbo);
                drm_gem_vram_put(gbo);
        }
 int ast_cursor_blit(struct ast_private *ast, struct drm_framebuffer *fb)
 {
        struct drm_device *dev = &ast->base;
-       struct drm_gem_vram_object *gbo;
-       struct dma_buf_map map;
-       int ret;
-       void *src;
+       struct drm_gem_vram_object *dst_gbo = ast->cursor.gbo[ast->cursor.next_index];
+       struct drm_gem_vram_object *src_gbo = drm_gem_vram_of_gem(fb->obj[0]);
+       struct dma_buf_map src_map, dst_map;
        void __iomem *dst;
+       void *src;
+       int ret;
 
        if (drm_WARN_ON_ONCE(dev, fb->width > AST_MAX_HWC_WIDTH) ||
            drm_WARN_ON_ONCE(dev, fb->height > AST_MAX_HWC_HEIGHT))
                return -EINVAL;
 
-       gbo = drm_gem_vram_of_gem(fb->obj[0]);
-
-       ret = drm_gem_vram_vmap(gbo, &map);
+       ret = drm_gem_vram_vmap(src_gbo, &src_map);
        if (ret)
                return ret;
-       src = map.vaddr; /* TODO: Use mapping abstraction properly */
+       src = src_map.vaddr; /* TODO: Use mapping abstraction properly */
 
-       dst = ast->cursor.map[ast->cursor.next_index].vaddr_iomem;
+       ret = drm_gem_vram_vmap(dst_gbo, &dst_map);
+       if (ret)
+               goto err_drm_gem_vram_vunmap;
+       dst = dst_map.vaddr_iomem; /* TODO: Use mapping abstraction properly */
 
        /* do data transfer to cursor BO */
        update_cursor_image(dst, src, fb->width, fb->height);
 
-       drm_gem_vram_vunmap(gbo, &map);
+       drm_gem_vram_vunmap(dst_gbo, &dst_map);
+       drm_gem_vram_vunmap(src_gbo, &src_map);
 
        return 0;
+
+err_drm_gem_vram_vunmap:
+       drm_gem_vram_vunmap(src_gbo, &src_map);
+       return ret;
 }
 
 static void ast_cursor_set_base(struct ast_private *ast, u64 address)
 void ast_cursor_show(struct ast_private *ast, int x, int y,
                     unsigned int offset_x, unsigned int offset_y)
 {
+       struct drm_device *dev = &ast->base;
+       struct drm_gem_vram_object *gbo = ast->cursor.gbo[ast->cursor.next_index];
+       struct dma_buf_map map;
        u8 x_offset, y_offset;
        u8 __iomem *dst;
        u8 __iomem *sig;
        u8 jreg;
+       int ret;
 
-       dst = ast->cursor.map[ast->cursor.next_index].vaddr;
+       ret = drm_gem_vram_vmap(gbo, &map);
+       if (drm_WARN_ONCE(dev, ret, "drm_gem_vram_vmap() failed, ret=%d\n", ret))
+               return;
+       dst = map.vaddr_iomem; /* TODO: Use mapping abstraction properly */
 
        sig = dst + AST_HWC_SIZE;
        writel(x, sig + AST_HWC_SIGNATURE_X);
        writel(y, sig + AST_HWC_SIGNATURE_Y);
 
+       drm_gem_vram_vunmap(gbo, &map);
+
        if (x < 0) {
                x_offset = (-x) + offset_x;
                x = 0;