ソースを参照

Merge branch 'vmwgfx-next' of git://people.freedesktop.org/~thomash/linux into drm-next

some vmware fixes.

* 'vmwgfx-next' of git://people.freedesktop.org/~thomash/linux:
  drm/vmwgfx: (Re)bind shaders to MOBs with the correct offset
  drm/vmwgfx: Fix fence event code
  drm/vmwgfx: Don't use memory accounting for kernel-side fence objects
  drm/vmwgfx: Fix error printout on signals pending
Dave Airlie 10 年 前
コミット
d5b75dc01f

+ 6 - 2
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c

@@ -1062,8 +1062,12 @@ static long vmw_generic_ioctl(struct file *filp, unsigned int cmd,
 
 
 	vmaster = vmw_master_check(dev, file_priv, flags);
 	vmaster = vmw_master_check(dev, file_priv, flags);
 	if (unlikely(IS_ERR(vmaster))) {
 	if (unlikely(IS_ERR(vmaster))) {
-		DRM_INFO("IOCTL ERROR %d\n", nr);
-		return PTR_ERR(vmaster);
+		ret = PTR_ERR(vmaster);
+
+		if (ret != -ERESTARTSYS)
+			DRM_INFO("IOCTL ERROR Command %d, Error %ld.\n",
+				 nr, ret);
+		return ret;
 	}
 	}
 
 
 	ret = ioctl_func(filp, cmd, arg);
 	ret = ioctl_func(filp, cmd, arg);

+ 8 - 31
drivers/gpu/drm/vmwgfx/vmwgfx_fence.c

@@ -545,35 +545,19 @@ void vmw_fence_obj_flush(struct vmw_fence_obj *fence)
 
 
 static void vmw_fence_destroy(struct vmw_fence_obj *fence)
 static void vmw_fence_destroy(struct vmw_fence_obj *fence)
 {
 {
-	struct vmw_fence_manager *fman = fman_from_fence(fence);
-
 	fence_free(&fence->base);
 	fence_free(&fence->base);
-
-	/*
-	 * Free kernel space accounting.
-	 */
-	ttm_mem_global_free(vmw_mem_glob(fman->dev_priv),
-			    fman->fence_size);
 }
 }
 
 
 int vmw_fence_create(struct vmw_fence_manager *fman,
 int vmw_fence_create(struct vmw_fence_manager *fman,
 		     uint32_t seqno,
 		     uint32_t seqno,
 		     struct vmw_fence_obj **p_fence)
 		     struct vmw_fence_obj **p_fence)
 {
 {
-	struct ttm_mem_global *mem_glob = vmw_mem_glob(fman->dev_priv);
 	struct vmw_fence_obj *fence;
 	struct vmw_fence_obj *fence;
 	int ret;
 	int ret;
 
 
-	ret = ttm_mem_global_alloc(mem_glob, fman->fence_size,
-				   false, false);
-	if (unlikely(ret != 0))
-		return ret;
-
 	fence = kzalloc(sizeof(*fence), GFP_KERNEL);
 	fence = kzalloc(sizeof(*fence), GFP_KERNEL);
-	if (unlikely(fence == NULL)) {
-		ret = -ENOMEM;
-		goto out_no_object;
-	}
+	if (unlikely(fence == NULL))
+		return -ENOMEM;
 
 
 	ret = vmw_fence_obj_init(fman, fence, seqno,
 	ret = vmw_fence_obj_init(fman, fence, seqno,
 				 vmw_fence_destroy);
 				 vmw_fence_destroy);
@@ -585,8 +569,6 @@ int vmw_fence_create(struct vmw_fence_manager *fman,
 
 
 out_err_init:
 out_err_init:
 	kfree(fence);
 	kfree(fence);
-out_no_object:
-	ttm_mem_global_free(mem_glob, fman->fence_size);
 	return ret;
 	return ret;
 }
 }
 
 
@@ -1105,6 +1087,8 @@ static int vmw_event_fence_action_create(struct drm_file *file_priv,
 	if (ret != 0)
 	if (ret != 0)
 		goto out_no_queue;
 		goto out_no_queue;
 
 
+	return 0;
+
 out_no_queue:
 out_no_queue:
 	event->base.destroy(&event->base);
 	event->base.destroy(&event->base);
 out_no_event:
 out_no_event:
@@ -1180,17 +1164,10 @@ int vmw_fence_event_ioctl(struct drm_device *dev, void *data,
 
 
 	BUG_ON(fence == NULL);
 	BUG_ON(fence == NULL);
 
 
-	if (arg->flags & DRM_VMW_FE_FLAG_REQ_TIME)
-		ret = vmw_event_fence_action_create(file_priv, fence,
-						    arg->flags,
-						    arg->user_data,
-						    true);
-	else
-		ret = vmw_event_fence_action_create(file_priv, fence,
-						    arg->flags,
-						    arg->user_data,
-						    true);
-
+	ret = vmw_event_fence_action_create(file_priv, fence,
+					    arg->flags,
+					    arg->user_data,
+					    true);
 	if (unlikely(ret != 0)) {
 	if (unlikely(ret != 0)) {
 		if (ret != -ERESTARTSYS)
 		if (ret != -ERESTARTSYS)
 			DRM_ERROR("Failed to attach event to fence.\n");
 			DRM_ERROR("Failed to attach event to fence.\n");

+ 1 - 1
drivers/gpu/drm/vmwgfx/vmwgfx_shader.c

@@ -198,7 +198,7 @@ static int vmw_gb_shader_bind(struct vmw_resource *res,
 	cmd->header.size = sizeof(cmd->body);
 	cmd->header.size = sizeof(cmd->body);
 	cmd->body.shid = res->id;
 	cmd->body.shid = res->id;
 	cmd->body.mobid = bo->mem.start;
 	cmd->body.mobid = bo->mem.start;
-	cmd->body.offsetInBytes = 0;
+	cmd->body.offsetInBytes = res->backup_offset;
 	res->backup_dirty = false;
 	res->backup_dirty = false;
 	vmw_fifo_commit(dev_priv, sizeof(*cmd));
 	vmw_fifo_commit(dev_priv, sizeof(*cmd));