Skip to content

Commit

Permalink
drm/vboxvideo: Use drm_gem_vram_vmap() interfaces
Browse files Browse the repository at this point in the history
VRAM helpers support ref counting for pin and vmap operations, no need
to avoid these operations by employing the internal kmap interface. Just
use drm_gem_vram_vmap() and let it handle the details.

Also unexport the kmap interfaces from VRAM helpers. Vboxvideo was the
last user of these internal functions.

v2:
	* fixed a comma in commit description

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Tested-by: Hans de Goede <hdegoede@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200911075922.19317-1-tzimmermann@suse.de
  • Loading branch information
Thomas Zimmermann committed Sep 14, 2020
1 parent 5684daa commit d88656f
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 61 deletions.
56 changes: 2 additions & 54 deletions drivers/gpu/drm/drm_gem_vram_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@ static const struct drm_gem_object_funcs drm_gem_vram_object_funcs;
* hardware's draing engine.
*
* To access a buffer object's memory from the DRM driver, call
* drm_gem_vram_kmap(). It (optionally) maps the buffer into kernel address
* space and returns the memory address. Use drm_gem_vram_kunmap() to
* drm_gem_vram_vmap(). It maps the buffer into kernel address
* space and returns the memory address. Use drm_gem_vram_vunmap() to
* release the mapping.
*/

Expand Down Expand Up @@ -437,39 +437,6 @@ static void *drm_gem_vram_kmap_locked(struct drm_gem_vram_object *gbo,
return kmap->virtual;
}

/**
* drm_gem_vram_kmap() - Maps a GEM VRAM object into kernel address space
* @gbo: the GEM VRAM object
* @map: establish a mapping if necessary
* @is_iomem: returns true if the mapped memory is I/O memory, or false \
otherwise; can be NULL
*
* This function maps the buffer object into the kernel's address space
* or returns the current mapping. If the parameter map is false, the
* function only queries the current mapping, but does not establish a
* new one.
*
* Returns:
* The buffers virtual address if mapped, or
* NULL if not mapped, or
* an ERR_PTR()-encoded error code otherwise.
*/
void *drm_gem_vram_kmap(struct drm_gem_vram_object *gbo, bool map,
bool *is_iomem)
{
int ret;
void *virtual;

ret = ttm_bo_reserve(&gbo->bo, true, false, NULL);
if (ret)
return ERR_PTR(ret);
virtual = drm_gem_vram_kmap_locked(gbo, map, is_iomem);
ttm_bo_unreserve(&gbo->bo);

return virtual;
}
EXPORT_SYMBOL(drm_gem_vram_kmap);

static void drm_gem_vram_kunmap_locked(struct drm_gem_vram_object *gbo)
{
if (WARN_ON_ONCE(!gbo->kmap_use_count))
Expand All @@ -485,22 +452,6 @@ static void drm_gem_vram_kunmap_locked(struct drm_gem_vram_object *gbo)
*/
}

/**
* drm_gem_vram_kunmap() - Unmaps a GEM VRAM object
* @gbo: the GEM VRAM object
*/
void drm_gem_vram_kunmap(struct drm_gem_vram_object *gbo)
{
int ret;

ret = ttm_bo_reserve(&gbo->bo, false, false, NULL);
if (WARN_ONCE(ret, "ttm_bo_reserve_failed(): ret=%d\n", ret))
return;
drm_gem_vram_kunmap_locked(gbo);
ttm_bo_unreserve(&gbo->bo);
}
EXPORT_SYMBOL(drm_gem_vram_kunmap);

/**
* drm_gem_vram_vmap() - Pins and maps a GEM VRAM object into kernel address
* space
Expand All @@ -512,9 +463,6 @@ EXPORT_SYMBOL(drm_gem_vram_kunmap);
* permanently. Call drm_gem_vram_vunmap() with the returned address to
* unmap and unpin the GEM VRAM object.
*
* If you have special requirements for the pinning or mapping operations,
* call drm_gem_vram_pin() and drm_gem_vram_kmap() directly.
*
* Returns:
* The buffer's virtual address on success, or
* an ERR_PTR()-encoded error code otherwise.
Expand Down
10 changes: 6 additions & 4 deletions drivers/gpu/drm/vboxvideo/vbox_mode.c
Original file line number Diff line number Diff line change
Expand Up @@ -397,11 +397,13 @@ static void vbox_cursor_atomic_update(struct drm_plane *plane,

vbox_crtc->cursor_enabled = true;

/* pinning is done in prepare/cleanup framebuffer */
src = drm_gem_vram_kmap(gbo, true, NULL);
src = drm_gem_vram_vmap(gbo);
if (IS_ERR(src)) {
/*
* BUG: we should have pinned the BO in prepare_fb().
*/
mutex_unlock(&vbox->hw_mutex);
DRM_WARN("Could not kmap cursor bo, skipping update\n");
DRM_WARN("Could not map cursor bo, skipping update\n");
return;
}

Expand All @@ -414,7 +416,7 @@ static void vbox_cursor_atomic_update(struct drm_plane *plane,
data_size = width * height * 4 + mask_size;

copy_cursor_image(src, vbox->cursor_data, width, height, mask_size);
drm_gem_vram_kunmap(gbo);
drm_gem_vram_vunmap(gbo, src);

flags = VBOX_MOUSE_POINTER_VISIBLE | VBOX_MOUSE_POINTER_SHAPE |
VBOX_MOUSE_POINTER_ALPHA;
Expand Down
3 changes: 0 additions & 3 deletions include/drm/drm_gem_vram_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,6 @@ u64 drm_gem_vram_mmap_offset(struct drm_gem_vram_object *gbo);
s64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo);
int drm_gem_vram_pin(struct drm_gem_vram_object *gbo, unsigned long pl_flag);
int drm_gem_vram_unpin(struct drm_gem_vram_object *gbo);
void *drm_gem_vram_kmap(struct drm_gem_vram_object *gbo, bool map,
bool *is_iomem);
void drm_gem_vram_kunmap(struct drm_gem_vram_object *gbo);
void *drm_gem_vram_vmap(struct drm_gem_vram_object *gbo);
void drm_gem_vram_vunmap(struct drm_gem_vram_object *gbo, void *vaddr);

Expand Down

0 comments on commit d88656f

Please sign in to comment.