Commit dce39226 authored by Gerd Hoffmann's avatar Gerd Hoffmann
Browse files

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
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -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 @@ int qxl_bo_vmap_locked(struct qxl_bo *bo, struct dma_buf_map *map)
	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)
{
+2 −0
Original line number Diff line number Diff line
@@ -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);