Commit b7d40627 authored by Ian Forbes's avatar Ian Forbes Committed by Zack Rusin
Browse files

drm/vmwgfx: Add new keep_resv BO param



Adds a new BO param that keeps the reservation locked after creation.
This removes the need to re-reserve the BO after creation which is a
waste of cycles.

This also fixes a bug in vmw_prime_import_sg_table where the imported
reservation is unlocked twice.

Signed-off-by: default avatarIan Forbes <ian.forbes@broadcom.com>
Fixes: b32233ac ("drm/vmwgfx: Fix prime import/export")
Reviewed-by: default avatarZack Rusin <zack.rusin@broadcom.com>
Signed-off-by: default avatarZack Rusin <zack.rusin@broadcom.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250110185335.15301-1-ian.forbes@broadcom.com
parent 9cdebfa9
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -442,6 +442,7 @@ static int vmw_bo_init(struct vmw_private *dev_priv,

	if (params->pin)
		ttm_bo_pin(&vmw_bo->tbo);
	if (!params->keep_resv)
		ttm_bo_unreserve(&vmw_bo->tbo);

	return 0;
+2 −1
Original line number Diff line number Diff line
@@ -56,8 +56,9 @@ struct vmw_bo_params {
	u32 domain;
	u32 busy_domain;
	enum ttm_bo_type bo_type;
	size_t size;
	bool pin;
	bool keep_resv;
	size_t size;
	struct dma_resv *resv;
	struct sg_table *sg;
};
+2 −5
Original line number Diff line number Diff line
@@ -403,7 +403,8 @@ static int vmw_dummy_query_bo_create(struct vmw_private *dev_priv)
		.busy_domain = VMW_BO_DOMAIN_SYS,
		.bo_type = ttm_bo_type_kernel,
		.size = PAGE_SIZE,
		.pin = true
		.pin = true,
		.keep_resv = true,
	};

	/*
@@ -415,10 +416,6 @@ static int vmw_dummy_query_bo_create(struct vmw_private *dev_priv)
	if (unlikely(ret != 0))
		return ret;

	ret = ttm_bo_reserve(&vbo->tbo, false, true, NULL);
	BUG_ON(ret != 0);
	vmw_bo_pin_reserved(vbo, true);

	ret = ttm_bo_kmap(&vbo->tbo, 0, 1, &map);
	if (likely(ret == 0)) {
		result = ttm_kmap_obj_virtual(&map, &dummy);
+1 −0
Original line number Diff line number Diff line
@@ -206,6 +206,7 @@ struct drm_gem_object *vmw_prime_import_sg_table(struct drm_device *dev,
		.bo_type = ttm_bo_type_sg,
		.size = attach->dmabuf->size,
		.pin = false,
		.keep_resv = true,
		.resv = attach->dmabuf->resv,
		.sg = table,

+2 −5
Original line number Diff line number Diff line
@@ -896,7 +896,8 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,
		.busy_domain = VMW_BO_DOMAIN_SYS,
		.bo_type = ttm_bo_type_device,
		.size = size,
		.pin = true
		.pin = true,
		.keep_resv = true,
	};

	if (!vmw_shader_id_ok(user_key, shader_type))
@@ -906,10 +907,6 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,
	if (unlikely(ret != 0))
		goto out;

	ret = ttm_bo_reserve(&buf->tbo, false, true, NULL);
	if (unlikely(ret != 0))
		goto no_reserve;

	/* Map and copy shader bytecode. */
	ret = ttm_bo_kmap(&buf->tbo, 0, PFN_UP(size), &map);
	if (unlikely(ret != 0)) {
Loading