drm/vmwgfx: Add "quirk" to handling command verification exceptions
[linux-2.6-block.git] / drivers / gpu / drm / vmwgfx / vmwgfx_execbuf.c
index 0792d8d5931593f9ebf171b0d62802ebac84cd41..497ad6aecfbbc07735d238bece6edfe28e5e1639 100644 (file)
@@ -679,6 +679,10 @@ static int vmw_cmd_surface_copy_check(struct vmw_private *dev_priv,
                                &cmd->body.src.sid, NULL);
        if (unlikely(ret != 0))
                return ret;
+
+       if (sw_context->quirks & VMW_QUIRK_SCREENTARGET)
+               return 0;
+
        return vmw_cmd_res_check(dev_priv, sw_context, vmw_res_surface,
                                 user_surface_converter,
                                 &cmd->body.dest.sid, NULL);
@@ -1260,6 +1264,9 @@ static int vmw_cmd_dma(struct vmw_private *dev_priv,
        if (unlikely(suffix->maximumOffset > bo_size))
                suffix->maximumOffset = bo_size;
 
+       if (sw_context->quirks & VMW_QUIRK_SCREENTARGET)
+               goto out_no_surface;
+
        ret = vmw_cmd_res_check(dev_priv, sw_context, vmw_res_surface,
                                user_surface_converter, &cmd->dma.host.sid,
                                NULL);
@@ -2544,6 +2551,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,
                        void *kernel_commands,
                        uint32_t command_size,
                        uint64_t throttle_us,
+                       uint32_t quirks,
                        struct drm_vmw_fence_rep __user *user_fence_rep,
                        struct vmw_fence_obj **out_fence)
 {
@@ -2598,6 +2606,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,
        sw_context->fp = vmw_fpriv(file_priv);
        sw_context->cur_reloc = 0;
        sw_context->cur_val_buf = 0;
+       sw_context->quirks = quirks;
        INIT_LIST_HEAD(&sw_context->resource_list);
        sw_context->cur_query_bo = dev_priv->pinned_bo;
        sw_context->last_query_ctx = NULL;
@@ -2904,6 +2913,7 @@ int vmw_execbuf_ioctl(struct drm_device *dev, void *data,
        ret = vmw_execbuf_process(file_priv, dev_priv,
                                  (void __user *)(unsigned long)arg->commands,
                                  NULL, arg->command_size, arg->throttle_us,
+                                 0,
                                  (void __user *)(unsigned long)arg->fence_rep,
                                  NULL);
        ttm_read_unlock(&dev_priv->reservation_sem);