mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-21 04:53:46 -04:00
drm/vmwgfx: Stop using raw ttm_buffer_object's
Various bits of the driver used raw ttm_buffer_object instead of the driver specific vmw_bo object. All those places used to duplicate the mapped bo caching policy of vmw_bo. Instead of duplicating all of that code and special casing various functions to work both with vmw_bo and raw ttm_buffer_object's unify the buffer object handling code. As part of that work fix the naming of bo's, e.g. insted of generic backup use 'guest_memory' because that's what it really is. All of it makes the driver easier to maintain and the code easier to read. Saves 100+ loc as well. Signed-off-by: Zack Rusin <zackr@vmware.com> Reviewed-by: Martin Krastev <krastevm@vmware.com> Reviewed-by: Maaz Mombasawala <mombasawalam@vmware.com> Acked-by: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patchwork.freedesktop.org/patch/msgid/20230131033542.953249-9-zack@kde.org
This commit is contained in:
@@ -153,9 +153,8 @@ static void vmw_cursor_update_mob(struct vmw_private *dev_priv,
|
||||
SVGAGBCursorHeader *header;
|
||||
SVGAGBAlphaCursorHeader *alpha_header;
|
||||
const u32 image_size = width * height * sizeof(*image);
|
||||
bool is_iomem;
|
||||
|
||||
header = ttm_kmap_obj_virtual(&vps->cursor.map, &is_iomem);
|
||||
header = vmw_bo_map_and_cache(vps->cursor.bo);
|
||||
alpha_header = &header->header.alphaHeader;
|
||||
|
||||
memset(header, 0, sizeof(*header));
|
||||
@@ -170,7 +169,7 @@ static void vmw_cursor_update_mob(struct vmw_private *dev_priv,
|
||||
|
||||
memcpy(header + 1, image, image_size);
|
||||
vmw_write(dev_priv, SVGA_REG_CURSOR_MOBID,
|
||||
vps->cursor.bo->resource->start);
|
||||
vps->cursor.bo->tbo.resource->start);
|
||||
}
|
||||
|
||||
|
||||
@@ -188,7 +187,7 @@ static u32 *vmw_du_cursor_plane_acquire_image(struct vmw_plane_state *vps)
|
||||
bool is_iomem;
|
||||
if (vps->surf) {
|
||||
if (vps->surf_mapped)
|
||||
return vmw_bo_map_and_cache(vps->surf->res.backup);
|
||||
return vmw_bo_map_and_cache(vps->surf->res.guest_memory_bo);
|
||||
return vps->surf->snooper.image;
|
||||
} else if (vps->bo)
|
||||
return ttm_kmap_obj_virtual(&vps->bo->map, &is_iomem);
|
||||
@@ -223,15 +222,13 @@ static bool vmw_du_cursor_plane_has_changed(struct vmw_plane_state *old_vps,
|
||||
return changed;
|
||||
}
|
||||
|
||||
static void vmw_du_destroy_cursor_mob(struct ttm_buffer_object **bo)
|
||||
static void vmw_du_destroy_cursor_mob(struct vmw_bo **vbo)
|
||||
{
|
||||
if (!(*bo))
|
||||
if (!(*vbo))
|
||||
return;
|
||||
|
||||
ttm_bo_unpin(*bo);
|
||||
ttm_bo_put(*bo);
|
||||
kfree(*bo);
|
||||
*bo = NULL;
|
||||
ttm_bo_unpin(&(*vbo)->tbo);
|
||||
vmw_bo_unreference(vbo);
|
||||
}
|
||||
|
||||
static void vmw_du_put_cursor_mob(struct vmw_cursor_plane *vcp,
|
||||
@@ -255,8 +252,8 @@ static void vmw_du_put_cursor_mob(struct vmw_cursor_plane *vcp,
|
||||
|
||||
/* Cache is full: See if this mob is bigger than an existing mob. */
|
||||
for (i = 0; i < ARRAY_SIZE(vcp->cursor_mobs); i++) {
|
||||
if (vcp->cursor_mobs[i]->base.size <
|
||||
vps->cursor.bo->base.size) {
|
||||
if (vcp->cursor_mobs[i]->tbo.base.size <
|
||||
vps->cursor.bo->tbo.base.size) {
|
||||
vmw_du_destroy_cursor_mob(&vcp->cursor_mobs[i]);
|
||||
vcp->cursor_mobs[i] = vps->cursor.bo;
|
||||
vps->cursor.bo = NULL;
|
||||
@@ -289,7 +286,7 @@ static int vmw_du_get_cursor_mob(struct vmw_cursor_plane *vcp,
|
||||
return -EINVAL;
|
||||
|
||||
if (vps->cursor.bo) {
|
||||
if (vps->cursor.bo->base.size >= size)
|
||||
if (vps->cursor.bo->tbo.base.size >= size)
|
||||
return 0;
|
||||
vmw_du_put_cursor_mob(vcp, vps);
|
||||
}
|
||||
@@ -297,26 +294,27 @@ static int vmw_du_get_cursor_mob(struct vmw_cursor_plane *vcp,
|
||||
/* Look for an unused mob in the cache. */
|
||||
for (i = 0; i < ARRAY_SIZE(vcp->cursor_mobs); i++) {
|
||||
if (vcp->cursor_mobs[i] &&
|
||||
vcp->cursor_mobs[i]->base.size >= size) {
|
||||
vcp->cursor_mobs[i]->tbo.base.size >= size) {
|
||||
vps->cursor.bo = vcp->cursor_mobs[i];
|
||||
vcp->cursor_mobs[i] = NULL;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/* Create a new mob if we can't find an existing one. */
|
||||
ret = vmw_bo_create_kernel(dev_priv, size, &vmw_mob_placement,
|
||||
&vps->cursor.bo);
|
||||
ret = vmw_bo_create_and_populate(dev_priv, size,
|
||||
VMW_BO_DOMAIN_MOB,
|
||||
&vps->cursor.bo);
|
||||
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
/* Fence the mob creation so we are guarateed to have the mob */
|
||||
ret = ttm_bo_reserve(vps->cursor.bo, false, false, NULL);
|
||||
ret = ttm_bo_reserve(&vps->cursor.bo->tbo, false, false, NULL);
|
||||
if (ret != 0)
|
||||
goto teardown;
|
||||
|
||||
vmw_bo_fence_single(vps->cursor.bo, NULL);
|
||||
ttm_bo_unreserve(vps->cursor.bo);
|
||||
vmw_bo_fence_single(&vps->cursor.bo->tbo, NULL);
|
||||
ttm_bo_unreserve(&vps->cursor.bo->tbo);
|
||||
return 0;
|
||||
|
||||
teardown:
|
||||
@@ -574,39 +572,30 @@ vmw_du_cursor_plane_map_cm(struct vmw_plane_state *vps)
|
||||
{
|
||||
int ret;
|
||||
u32 size = vmw_du_cursor_mob_size(vps->base.crtc_w, vps->base.crtc_h);
|
||||
struct ttm_buffer_object *bo = vps->cursor.bo;
|
||||
struct ttm_buffer_object *bo;
|
||||
|
||||
if (!bo)
|
||||
if (!vps->cursor.bo)
|
||||
return -EINVAL;
|
||||
|
||||
bo = &vps->cursor.bo->tbo;
|
||||
|
||||
if (bo->base.size < size)
|
||||
return -EINVAL;
|
||||
|
||||
if (vps->cursor.mapped)
|
||||
if (vps->cursor.bo->map.virtual)
|
||||
return 0;
|
||||
|
||||
ret = ttm_bo_reserve(bo, false, false, NULL);
|
||||
|
||||
if (unlikely(ret != 0))
|
||||
return -ENOMEM;
|
||||
|
||||
ret = ttm_bo_kmap(bo, 0, PFN_UP(size), &vps->cursor.map);
|
||||
|
||||
/*
|
||||
* We just want to try to get mob bind to finish
|
||||
* so that the first write to SVGA_REG_CURSOR_MOBID
|
||||
* is done with a buffer that the device has already
|
||||
* seen
|
||||
*/
|
||||
(void) ttm_bo_wait(bo, false, false);
|
||||
vmw_bo_map_and_cache(vps->cursor.bo);
|
||||
|
||||
ttm_bo_unreserve(bo);
|
||||
|
||||
if (unlikely(ret != 0))
|
||||
return -ENOMEM;
|
||||
|
||||
vps->cursor.mapped = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -623,19 +612,15 @@ static int
|
||||
vmw_du_cursor_plane_unmap_cm(struct vmw_plane_state *vps)
|
||||
{
|
||||
int ret = 0;
|
||||
struct ttm_buffer_object *bo = vps->cursor.bo;
|
||||
struct vmw_bo *vbo = vps->cursor.bo;
|
||||
|
||||
if (!vps->cursor.mapped)
|
||||
if (!vbo || !vbo->map.virtual)
|
||||
return 0;
|
||||
|
||||
if (!bo)
|
||||
return 0;
|
||||
|
||||
ret = ttm_bo_reserve(bo, true, false, NULL);
|
||||
ret = ttm_bo_reserve(&vbo->tbo, true, false, NULL);
|
||||
if (likely(ret == 0)) {
|
||||
ttm_bo_kunmap(&vps->cursor.map);
|
||||
ttm_bo_unreserve(bo);
|
||||
vps->cursor.mapped = false;
|
||||
vmw_bo_unmap(vbo);
|
||||
ttm_bo_unreserve(&vbo->tbo);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -661,16 +646,16 @@ vmw_du_cursor_plane_cleanup_fb(struct drm_plane *plane,
|
||||
bool is_iomem;
|
||||
|
||||
if (vps->surf_mapped) {
|
||||
vmw_bo_unmap(vps->surf->res.backup);
|
||||
vmw_bo_unmap(vps->surf->res.guest_memory_bo);
|
||||
vps->surf_mapped = false;
|
||||
}
|
||||
|
||||
if (vps->bo && ttm_kmap_obj_virtual(&vps->bo->map, &is_iomem)) {
|
||||
const int ret = ttm_bo_reserve(&vps->bo->base, true, false, NULL);
|
||||
const int ret = ttm_bo_reserve(&vps->bo->tbo, true, false, NULL);
|
||||
|
||||
if (likely(ret == 0)) {
|
||||
ttm_bo_kunmap(&vps->bo->map);
|
||||
ttm_bo_unreserve(&vps->bo->base);
|
||||
ttm_bo_unreserve(&vps->bo->tbo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -736,26 +721,26 @@ vmw_du_cursor_plane_prepare_fb(struct drm_plane *plane,
|
||||
* reserve the ttm_buffer_object first which
|
||||
* vmw_bo_map_and_cache() omits.
|
||||
*/
|
||||
ret = ttm_bo_reserve(&vps->bo->base, true, false, NULL);
|
||||
ret = ttm_bo_reserve(&vps->bo->tbo, true, false, NULL);
|
||||
|
||||
if (unlikely(ret != 0))
|
||||
return -ENOMEM;
|
||||
|
||||
ret = ttm_bo_kmap(&vps->bo->base, 0, PFN_UP(size), &vps->bo->map);
|
||||
ret = ttm_bo_kmap(&vps->bo->tbo, 0, PFN_UP(size), &vps->bo->map);
|
||||
|
||||
ttm_bo_unreserve(&vps->bo->base);
|
||||
ttm_bo_unreserve(&vps->bo->tbo);
|
||||
|
||||
if (unlikely(ret != 0))
|
||||
return -ENOMEM;
|
||||
} else if (vps->surf && !vps->bo && vps->surf->res.backup) {
|
||||
} else if (vps->surf && !vps->bo && vps->surf->res.guest_memory_bo) {
|
||||
|
||||
WARN_ON(vps->surf->snooper.image);
|
||||
ret = ttm_bo_reserve(&vps->surf->res.backup->base, true, false,
|
||||
ret = ttm_bo_reserve(&vps->surf->res.guest_memory_bo->tbo, true, false,
|
||||
NULL);
|
||||
if (unlikely(ret != 0))
|
||||
return -ENOMEM;
|
||||
vmw_bo_map_and_cache(vps->surf->res.backup);
|
||||
ttm_bo_unreserve(&vps->surf->res.backup->base);
|
||||
vmw_bo_map_and_cache(vps->surf->res.guest_memory_bo);
|
||||
ttm_bo_unreserve(&vps->surf->res.guest_memory_bo->tbo);
|
||||
vps->surf_mapped = true;
|
||||
}
|
||||
|
||||
@@ -926,7 +911,7 @@ int vmw_du_cursor_plane_atomic_check(struct drm_plane *plane,
|
||||
WARN_ON(!surface);
|
||||
|
||||
if (!surface ||
|
||||
(!surface->snooper.image && !surface->res.backup)) {
|
||||
(!surface->snooper.image && !surface->res.guest_memory_bo)) {
|
||||
DRM_ERROR("surface not suitable for cursor\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -1397,7 +1382,7 @@ static int vmw_framebuffer_bo_create_handle(struct drm_framebuffer *fb,
|
||||
struct vmw_framebuffer_bo *vfbd =
|
||||
vmw_framebuffer_to_vfbd(fb);
|
||||
|
||||
return drm_gem_handle_create(file_priv, &vfbd->buffer->base.base, handle);
|
||||
return drm_gem_handle_create(file_priv, &vfbd->buffer->tbo.base, handle);
|
||||
}
|
||||
|
||||
static void vmw_framebuffer_bo_destroy(struct drm_framebuffer *framebuffer)
|
||||
@@ -1546,9 +1531,9 @@ static int vmw_create_bo_proxy(struct drm_device *dev,
|
||||
/* Reserve and switch the backing mob. */
|
||||
mutex_lock(&res->dev_priv->cmdbuf_mutex);
|
||||
(void) vmw_resource_reserve(res, false, true);
|
||||
vmw_bo_unreference(&res->backup);
|
||||
res->backup = vmw_bo_reference(bo_mob);
|
||||
res->backup_offset = 0;
|
||||
vmw_bo_unreference(&res->guest_memory_bo);
|
||||
res->guest_memory_bo = vmw_bo_reference(bo_mob);
|
||||
res->guest_memory_offset = 0;
|
||||
vmw_resource_unreserve(res, false, false, false, NULL, 0);
|
||||
mutex_unlock(&res->dev_priv->cmdbuf_mutex);
|
||||
|
||||
@@ -1570,7 +1555,7 @@ static int vmw_kms_new_framebuffer_bo(struct vmw_private *dev_priv,
|
||||
int ret;
|
||||
|
||||
requested_size = mode_cmd->height * mode_cmd->pitches[0];
|
||||
if (unlikely(requested_size > bo->base.base.size)) {
|
||||
if (unlikely(requested_size > bo->tbo.base.size)) {
|
||||
DRM_ERROR("Screen buffer object size is too small "
|
||||
"for requested mode.\n");
|
||||
return -EINVAL;
|
||||
@@ -1591,7 +1576,7 @@ static int vmw_kms_new_framebuffer_bo(struct vmw_private *dev_priv,
|
||||
goto out_err1;
|
||||
}
|
||||
|
||||
vfbd->base.base.obj[0] = &bo->base.base;
|
||||
vfbd->base.base.obj[0] = &bo->tbo.base;
|
||||
drm_helper_mode_fill_fb_struct(dev, &vfbd->base.base, mode_cmd);
|
||||
vfbd->base.bo = true;
|
||||
vfbd->buffer = vmw_bo_reference(bo);
|
||||
|
||||
Reference in New Issue
Block a user