Commit dce39226 authored by Gerd Hoffmann's avatar Gerd Hoffmann

drm/qxl: add qxl_bo_vmap/qxl_bo_vunmap

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: default avatarGerd Hoffmann <kraxel@redhat.com>
Acked-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Link: http://patchwork.freedesktop.org/patch/msgid/20210217123213.2199186-7-kraxel@redhat.com
parent f7ed28e1
...@@ -29,6 +29,9 @@ ...@@ -29,6 +29,9 @@
#include "qxl_drv.h" #include "qxl_drv.h"
#include "qxl_object.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) static void qxl_ttm_bo_destroy(struct ttm_buffer_object *tbo)
{ {
struct qxl_bo *bo; struct qxl_bo *bo;
...@@ -179,6 +182,25 @@ int qxl_bo_vmap_locked(struct qxl_bo *bo, struct dma_buf_map *map) ...@@ -179,6 +182,25 @@ int qxl_bo_vmap_locked(struct qxl_bo *bo, struct dma_buf_map *map)
return 0; 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, void *qxl_bo_kmap_atomic_page(struct qxl_device *qdev,
struct qxl_bo *bo, int page_offset) struct qxl_bo *bo, int page_offset)
{ {
...@@ -223,6 +245,20 @@ void qxl_bo_vunmap_locked(struct qxl_bo *bo) ...@@ -223,6 +245,20 @@ void qxl_bo_vunmap_locked(struct qxl_bo *bo)
ttm_bo_vunmap(&bo->tbo, &bo->map); 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, void qxl_bo_kunmap_atomic_page(struct qxl_device *qdev,
struct qxl_bo *bo, void *pmap) struct qxl_bo *bo, void *pmap)
{ {
......
...@@ -64,7 +64,9 @@ extern int qxl_bo_create(struct qxl_device *qdev, ...@@ -64,7 +64,9 @@ extern int qxl_bo_create(struct qxl_device *qdev,
u32 priority, u32 priority,
struct qxl_surface *surf, struct qxl_surface *surf,
struct qxl_bo **bo_ptr); 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_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_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_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); void qxl_bo_kunmap_atomic_page(struct qxl_device *qdev, struct qxl_bo *bo, void *map);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment