diff options
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_shader.c')
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_shader.c | 67 | 
1 files changed, 38 insertions, 29 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c index 51e83dfa1cac..e7226db8b242 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c @@ -1,7 +1,7 @@  // SPDX-License-Identifier: GPL-2.0 OR MIT  /**************************************************************************   * - * Copyright 2009-2015 VMware, Inc., Palo Alto, CA., USA + * Copyright 2009-2023 VMware, Inc., Palo Alto, CA., USA   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the @@ -27,9 +27,10 @@  #include <drm/ttm/ttm_placement.h> +#include "vmwgfx_binding.h" +#include "vmwgfx_bo.h"  #include "vmwgfx_drv.h"  #include "vmwgfx_resource_priv.h" -#include "vmwgfx_binding.h"  struct vmw_shader {  	struct vmw_resource res; @@ -88,12 +89,13 @@ const struct vmw_user_resource_conv *user_shader_converter =  static const struct vmw_res_func vmw_gb_shader_func = {  	.res_type = vmw_res_shader, -	.needs_backup = true, +	.needs_guest_memory = true,  	.may_evict = true,  	.prio = 3,  	.dirty_prio = 3,  	.type_name = "guest backed shaders", -	.backup_placement = &vmw_mob_placement, +	.domain = VMW_BO_DOMAIN_MOB, +	.busy_domain = VMW_BO_DOMAIN_MOB,  	.create = vmw_gb_shader_create,  	.destroy = vmw_gb_shader_destroy,  	.bind = vmw_gb_shader_bind, @@ -102,12 +104,13 @@ static const struct vmw_res_func vmw_gb_shader_func = {  static const struct vmw_res_func vmw_dx_shader_func = {  	.res_type = vmw_res_shader, -	.needs_backup = true, +	.needs_guest_memory = true,  	.may_evict = true,  	.prio = 3,  	.dirty_prio = 3,  	.type_name = "dx shaders", -	.backup_placement = &vmw_mob_placement, +	.domain = VMW_BO_DOMAIN_MOB, +	.busy_domain = VMW_BO_DOMAIN_MOB,  	.create = vmw_dx_shader_create,  	/*  	 * The destroy callback is only called with a committed resource on @@ -158,7 +161,7 @@ static int vmw_gb_shader_init(struct vmw_private *dev_priv,  			      SVGA3dShaderType type,  			      uint8_t num_input_sig,  			      uint8_t num_output_sig, -			      struct vmw_buffer_object *byte_code, +			      struct vmw_bo *byte_code,  			      void (*res_free) (struct vmw_resource *res))  {  	struct vmw_shader *shader = vmw_res_to_shader(res); @@ -175,10 +178,10 @@ static int vmw_gb_shader_init(struct vmw_private *dev_priv,  		return ret;  	} -	res->backup_size = size; +	res->guest_memory_size = size;  	if (byte_code) { -		res->backup = vmw_bo_reference(byte_code); -		res->backup_offset = offset; +		res->guest_memory_bo = vmw_bo_reference(byte_code); +		res->guest_memory_offset = offset;  	}  	shader->size = size;  	shader->type = type; @@ -259,8 +262,8 @@ static int vmw_gb_shader_bind(struct vmw_resource *res,  	cmd->header.size = sizeof(cmd->body);  	cmd->body.shid = res->id;  	cmd->body.mobid = bo->resource->start; -	cmd->body.offsetInBytes = res->backup_offset; -	res->backup_dirty = false; +	cmd->body.offsetInBytes = res->guest_memory_offset; +	res->guest_memory_dirty = false;  	vmw_cmd_commit(dev_priv, sizeof(*cmd));  	return 0; @@ -277,7 +280,7 @@ static int vmw_gb_shader_unbind(struct vmw_resource *res,  	} *cmd;  	struct vmw_fence_obj *fence; -	BUG_ON(res->backup->base.resource->mem_type != VMW_PL_MOB); +	BUG_ON(res->guest_memory_bo->tbo.resource->mem_type != VMW_PL_MOB);  	cmd = VMW_CMD_RESERVE(dev_priv, sizeof(*cmd));  	if (unlikely(cmd == NULL)) @@ -397,8 +400,8 @@ static int vmw_dx_shader_unscrub(struct vmw_resource *res)  	cmd->header.size = sizeof(cmd->body);  	cmd->body.cid = shader->ctx->id;  	cmd->body.shid = shader->id; -	cmd->body.mobid = res->backup->base.resource->start; -	cmd->body.offsetInBytes = res->backup_offset; +	cmd->body.mobid = res->guest_memory_bo->tbo.resource->start; +	cmd->body.offsetInBytes = res->guest_memory_offset;  	vmw_cmd_commit(dev_priv, sizeof(*cmd));  	vmw_cotable_add_resource(shader->cotable, &shader->cotable_head); @@ -508,7 +511,7 @@ static int vmw_dx_shader_unbind(struct vmw_resource *res,  	struct vmw_fence_obj *fence;  	int ret; -	BUG_ON(res->backup->base.resource->mem_type != VMW_PL_MOB); +	BUG_ON(res->guest_memory_bo->tbo.resource->mem_type != VMW_PL_MOB);  	mutex_lock(&dev_priv->binding_mutex);  	ret = vmw_dx_shader_scrub(res); @@ -680,7 +683,7 @@ int vmw_shader_destroy_ioctl(struct drm_device *dev, void *data,  }  static int vmw_user_shader_alloc(struct vmw_private *dev_priv, -				 struct vmw_buffer_object *buffer, +				 struct vmw_bo *buffer,  				 size_t shader_size,  				 size_t offset,  				 SVGA3dShaderType shader_type, @@ -734,7 +737,7 @@ out:  static struct vmw_resource *vmw_shader_alloc(struct vmw_private *dev_priv, -					     struct vmw_buffer_object *buffer, +					     struct vmw_bo *buffer,  					     size_t shader_size,  					     size_t offset,  					     SVGA3dShaderType shader_type) @@ -771,7 +774,7 @@ static int vmw_shader_define(struct drm_device *dev, struct drm_file *file_priv,  {  	struct vmw_private *dev_priv = vmw_priv(dev);  	struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile; -	struct vmw_buffer_object *buffer = NULL; +	struct vmw_bo *buffer = NULL;  	SVGA3dShaderType shader_type;  	int ret; @@ -782,7 +785,7 @@ static int vmw_shader_define(struct drm_device *dev, struct drm_file *file_priv,  			return ret;  		} -		if ((u64)buffer->base.base.size < (u64)size + (u64)offset) { +		if ((u64)buffer->tbo.base.size < (u64)size + (u64)offset) {  			VMW_DEBUG_USER("Illegal buffer- or shader size.\n");  			ret = -EINVAL;  			goto out_bad_arg; @@ -807,7 +810,7 @@ static int vmw_shader_define(struct drm_device *dev, struct drm_file *file_priv,  				    num_output_sig, tfile, shader_handle);  out_bad_arg:  	vmw_bo_unreference(&buffer); -	drm_gem_object_put(&buffer->base.base); +	drm_gem_object_put(&buffer->tbo.base);  	return ret;  } @@ -884,28 +887,34 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,  			  struct list_head *list)  {  	struct ttm_operation_ctx ctx = { false, true }; -	struct vmw_buffer_object *buf; +	struct vmw_bo *buf;  	struct ttm_bo_kmap_obj map;  	bool is_iomem;  	int ret;  	struct vmw_resource *res; +	struct vmw_bo_params bo_params = { +		.domain = VMW_BO_DOMAIN_SYS, +		.busy_domain = VMW_BO_DOMAIN_SYS, +		.bo_type = ttm_bo_type_device, +		.size = size, +		.pin = true +	};  	if (!vmw_shader_id_ok(user_key, shader_type))  		return -EINVAL; -	ret = vmw_bo_create(dev_priv, size, &vmw_sys_placement, -			    true, true, vmw_bo_bo_free, &buf); +	ret = vmw_bo_create(dev_priv, &bo_params, &buf);  	if (unlikely(ret != 0))  		goto out; -	ret = ttm_bo_reserve(&buf->base, false, true, NULL); +	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->base, 0, PFN_UP(size), &map); +	ret = ttm_bo_kmap(&buf->tbo, 0, PFN_UP(size), &map);  	if (unlikely(ret != 0)) { -		ttm_bo_unreserve(&buf->base); +		ttm_bo_unreserve(&buf->tbo);  		goto no_reserve;  	} @@ -913,9 +922,9 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,  	WARN_ON(is_iomem);  	ttm_bo_kunmap(&map); -	ret = ttm_bo_validate(&buf->base, &vmw_sys_placement, &ctx); +	ret = ttm_bo_validate(&buf->tbo, &buf->placement, &ctx);  	WARN_ON(ret != 0); -	ttm_bo_unreserve(&buf->base); +	ttm_bo_unreserve(&buf->tbo);  	res = vmw_shader_alloc(dev_priv, buf, size, 0, shader_type);  	if (unlikely(ret != 0))  |