]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/mgag200: Move cursor BO swapping into mgag200_show_cursor()
authorThomas Zimmermann <tzimmermann@suse.de>
Fri, 27 Sep 2019 09:12:59 +0000 (11:12 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Fri, 4 Oct 2019 08:00:59 +0000 (10:00 +0200)
Selecting the correct BO for the new cursor image is not relevant
outside of mgag200_show_cursor(). Let the function do the work.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190927091301.10574-6-tzimmermann@suse.de
drivers/gpu/drm/mgag200/mgag200_cursor.c

index 5fc47ab0e8fdb45af76df5d52f06905044eb1656..ed69b396ac0266cd388b347f9d2104add7f5420b 100644 (file)
@@ -116,21 +116,69 @@ static void mgag200_cursor_set_base(struct mga_device *mdev, u64 address)
        WREG_DAC(MGA1064_CURSOR_BASE_ADR_HI, addrh);
 }
 
-static int mgag200_show_cursor(struct mga_device *mdev, void *dst, void *src,
-                              unsigned int width, unsigned int height,
-                              u64 dst_gpu)
+static int mgag200_show_cursor(struct mga_device *mdev, void *src,
+                              unsigned int width, unsigned int height)
 {
+       struct drm_device *dev = mdev->dev;
+       struct drm_gem_vram_object *pixels_1 = mdev->cursor.pixels_1;
+       struct drm_gem_vram_object *pixels_2 = mdev->cursor.pixels_2;
+       struct drm_gem_vram_object *pixels_current = mdev->cursor.pixels_current;
+       struct drm_gem_vram_object *pixels_next;
+       void *dst;
+       s64 off;
        int ret;
 
+       if (!pixels_1 || !pixels_2) {
+               WREG8(MGA_CURPOSXL, 0);
+               WREG8(MGA_CURPOSXH, 0);
+               return -ENOTSUPP; /* Didn't allocate space for cursors */
+       }
+
+       if (WARN_ON(pixels_current &&
+                   pixels_1 != pixels_current &&
+                   pixels_2 != pixels_current)) {
+               return -ENOTSUPP; /* inconsistent state */
+       }
+
+       if (pixels_current == pixels_1)
+               pixels_next = pixels_2;
+       else
+               pixels_next = pixels_1;
+
+       dst = drm_gem_vram_vmap(pixels_next);
+       if (IS_ERR(dst)) {
+               ret = PTR_ERR(dst);
+               dev_err(&dev->pdev->dev,
+                       "failed to map cursor updates: %d\n", ret);
+               return ret;
+       }
+       off = drm_gem_vram_offset(pixels_next);
+       if (off < 0) {
+               ret = (int)off;
+               dev_err(&dev->pdev->dev,
+                       "failed to get cursor scanout address: %d\n", ret);
+               goto err_drm_gem_vram_vunmap;
+       }
+
        ret = mgag200_cursor_update(mdev, dst, src, width, height);
        if (ret)
-               return ret;
-       mgag200_cursor_set_base(mdev, dst_gpu);
+               goto err_drm_gem_vram_vunmap;
+       mgag200_cursor_set_base(mdev, off);
 
        /* Adjust cursor control register to turn on the cursor */
        WREG_DAC(MGA1064_CURSOR_CTL, 4); /* 16-colour palletized cursor mode */
 
+       if (pixels_current)
+               drm_gem_vram_unpin(pixels_current);
+       mdev->cursor.pixels_current = pixels_next;
+
+       drm_gem_vram_vunmap(pixels_next, dst);
+
        return 0;
+
+err_drm_gem_vram_vunmap:
+       drm_gem_vram_vunmap(pixels_next, dst);
+       return ret;
 }
 
 /*
@@ -197,28 +245,10 @@ int mgag200_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
 {
        struct drm_device *dev = crtc->dev;
        struct mga_device *mdev = (struct mga_device *)dev->dev_private;
-       struct drm_gem_vram_object *pixels_1 = mdev->cursor.pixels_1;
-       struct drm_gem_vram_object *pixels_2 = mdev->cursor.pixels_2;
-       struct drm_gem_vram_object *pixels_current = mdev->cursor.pixels_current;
-       struct drm_gem_vram_object *pixels_next;
        struct drm_gem_object *obj;
        struct drm_gem_vram_object *gbo = NULL;
        int ret;
-       u8 *src, *dst;
-       s64 gpu_addr;
-       u64 dst_gpu;
-
-       if (!pixels_1 || !pixels_2) {
-               WREG8(MGA_CURPOSXL, 0);
-               WREG8(MGA_CURPOSXH, 0);
-               return -ENOTSUPP; /* Didn't allocate space for cursors */
-       }
-
-       if (WARN_ON(pixels_current &&
-                   pixels_1 != pixels_current &&
-                   pixels_2 != pixels_current)) {
-               return -ENOTSUPP; /* inconsistent state */
-       }
+       u8 *src;
 
        if (!handle || !file_priv) {
                mgag200_hide_cursor(mdev);
@@ -231,11 +261,6 @@ int mgag200_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
                return -EINVAL;
        }
 
-       if (pixels_current == pixels_1)
-               pixels_next = pixels_2;
-       else
-               pixels_next = pixels_1;
-
        obj = drm_gem_object_lookup(file_priv, handle);
        if (!obj)
                return -ENOENT;
@@ -248,48 +273,15 @@ int mgag200_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
                goto err_drm_gem_object_put_unlocked;
        }
 
-       /* Pin and map up-coming buffer to write colour indices */
-       ret = drm_gem_vram_pin(pixels_next, DRM_GEM_VRAM_PL_FLAG_VRAM);
-       if (ret) {
-               dev_err(&dev->pdev->dev,
-                       "failed to pin cursor buffer: %d\n", ret);
-               goto err_drm_gem_vram_vunmap;
-       }
-       dst = drm_gem_vram_kmap(pixels_next, true, NULL);
-       if (IS_ERR(dst)) {
-               ret = PTR_ERR(dst);
-               dev_err(&dev->pdev->dev,
-                       "failed to kmap cursor updates: %d\n", ret);
-               goto err_drm_gem_vram_unpin_dst;
-       }
-       gpu_addr = drm_gem_vram_offset(pixels_next);
-       if (gpu_addr < 0) {
-               ret = (int)gpu_addr;
-               dev_err(&dev->pdev->dev,
-                       "failed to get cursor scanout address: %d\n", ret);
-               goto err_drm_gem_vram_kunmap_dst;
-       }
-       dst_gpu = (u64)gpu_addr;
-
-       ret = mgag200_show_cursor(mdev, dst, src, width, height, dst_gpu);
+       ret = mgag200_show_cursor(mdev, src, width, height);
        if (ret)
-               goto err_drm_gem_vram_kunmap_dst;
+               goto err_drm_gem_vram_vunmap;
 
        /* Now update internal buffer pointers */
-       if (pixels_current)
-               drm_gem_vram_unpin(pixels_current);
-       mdev->cursor.pixels_current = pixels_next;
-
-       drm_gem_vram_kunmap(pixels_next);
        drm_gem_vram_vunmap(gbo, src);
        drm_gem_object_put_unlocked(obj);
 
        return 0;
-
-err_drm_gem_vram_kunmap_dst:
-       drm_gem_vram_kunmap(pixels_next);
-err_drm_gem_vram_unpin_dst:
-       drm_gem_vram_unpin(pixels_next);
 err_drm_gem_vram_vunmap:
        drm_gem_vram_vunmap(gbo, src);
 err_drm_gem_object_put_unlocked: