OSDN Git Service

drm/qxl: add qxl_bo_vmap/qxl_bo_vunmap
authorGerd Hoffmann <kraxel@redhat.com>
Wed, 17 Feb 2021 12:32:08 +0000 (13:32 +0100)
committerGerd Hoffmann <kraxel@redhat.com>
Fri, 19 Feb 2021 08:13:25 +0000 (09:13 +0100)
Add vmap/vunmap variants which reserve (and pin) the bo.
They can be used in case the caller doesn't hold a reservation
for the bo.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: http://patchwork.freedesktop.org/patch/msgid/20210217123213.2199186-7-kraxel@redhat.com
drivers/gpu/drm/qxl/qxl_object.c
drivers/gpu/drm/qxl/qxl_object.h

index f4a0153..82c3bf1 100644 (file)
@@ -29,6 +29,9 @@
 #include "qxl_drv.h"
 #include "qxl_object.h"
 
+static int __qxl_bo_pin(struct qxl_bo *bo);
+static void __qxl_bo_unpin(struct qxl_bo *bo);
+
 static void qxl_ttm_bo_destroy(struct ttm_buffer_object *tbo)
 {
        struct qxl_bo *bo;
@@ -179,6 +182,25 @@ out:
        return 0;
 }
 
+int qxl_bo_vmap(struct qxl_bo *bo, struct dma_buf_map *map)
+{
+       int r;
+
+       r = qxl_bo_reserve(bo);
+       if (r)
+               return r;
+
+       r = __qxl_bo_pin(bo);
+       if (r) {
+               qxl_bo_unreserve(bo);
+               return r;
+       }
+
+       r = qxl_bo_vmap_locked(bo, map);
+       qxl_bo_unreserve(bo);
+       return r;
+}
+
 void *qxl_bo_kmap_atomic_page(struct qxl_device *qdev,
                              struct qxl_bo *bo, int page_offset)
 {
@@ -223,6 +245,20 @@ void qxl_bo_vunmap_locked(struct qxl_bo *bo)
        ttm_bo_vunmap(&bo->tbo, &bo->map);
 }
 
+int qxl_bo_vunmap(struct qxl_bo *bo)
+{
+       int r;
+
+       r = qxl_bo_reserve(bo);
+       if (r)
+               return r;
+
+       qxl_bo_vunmap_locked(bo);
+       __qxl_bo_unpin(bo);
+       qxl_bo_unreserve(bo);
+       return 0;
+}
+
 void qxl_bo_kunmap_atomic_page(struct qxl_device *qdev,
                               struct qxl_bo *bo, void *pmap)
 {
index 2495e5c..ee9c29d 100644 (file)
@@ -64,7 +64,9 @@ extern int qxl_bo_create(struct qxl_device *qdev,
                         u32 priority,
                         struct qxl_surface *surf,
                         struct qxl_bo **bo_ptr);
+int qxl_bo_vmap(struct qxl_bo *bo, struct dma_buf_map *map);
 int qxl_bo_vmap_locked(struct qxl_bo *bo, struct dma_buf_map *map);
+int qxl_bo_vunmap(struct qxl_bo *bo);
 void qxl_bo_vunmap_locked(struct qxl_bo *bo);
 void *qxl_bo_kmap_atomic_page(struct qxl_device *qdev, struct qxl_bo *bo, int page_offset);
 void qxl_bo_kunmap_atomic_page(struct qxl_device *qdev, struct qxl_bo *bo, void *map);