drm/vmwgfx: Add "quirk" to handling command verification exceptions
[sfrench/cifs-2.6.git] / drivers / gpu / drm / vmwgfx / vmwgfx_drv.h
index d26a6daa9719a23542cb8c575691f1d63851dba4..c3f8fc97b336b5a14d84143c052bfe6a93181176 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
  *
- * Copyright © 2009 VMware, Inc., Palo Alto, CA., USA
+ * Copyright © 2009-2014 VMware, Inc., Palo Alto, CA., USA
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
@@ -113,6 +113,7 @@ struct vmw_resource {
        bool backup_dirty; /* Protected by backup buffer reserved */
        struct vmw_dma_buffer *backup;
        unsigned long backup_offset;
+       unsigned long pin_count; /* Protected by resource reserved */
        const struct vmw_res_func *func;
        struct list_head lru_head; /* Protected by the resource lock */
        struct list_head mob_head; /* Protected by @backup reserved */
@@ -329,6 +330,19 @@ struct vmw_ctx_binding_state {
        struct vmw_ctx_binding shaders[SVGA3D_SHADERTYPE_MAX];
 };
 
+
+/*
+ * enum vmw_display_unit_type - Describes the display unit
+ */
+enum vmw_display_unit_type {
+       vmw_du_invalid = 0,
+       vmw_du_legacy,
+       vmw_du_screen_object
+};
+
+
+#define VMW_QUIRK_SCREENTARGET (1U << 0)
+
 struct vmw_sw_context{
        struct drm_open_hash res_ht;
        bool res_ht_initialized;
@@ -351,6 +365,7 @@ struct vmw_sw_context{
        struct vmw_resource *error_resource;
        struct vmw_ctx_binding_state staged_bindings;
        struct list_head staged_cmd_res;
+       uint32_t quirks;
 };
 
 struct vmw_legacy_display;
@@ -420,6 +435,7 @@ struct vmw_private {
         */
 
        void *fb_info;
+       enum vmw_display_unit_type active_display_unit;
        struct vmw_legacy_display *ldu_priv;
        struct vmw_screen_object_display *sou_priv;
        struct vmw_overlay *overlay_priv;
@@ -453,6 +469,8 @@ struct vmw_private {
        spinlock_t waiter_lock;
        int fence_queue_waiters; /* Protected by waiter_lock */
        int goal_queue_waiters; /* Protected by waiter_lock */
+       int cmdbuf_waiters; /* Protected by irq_lock */
+       int error_waiters; /* Protected by irq_lock */
        atomic_t fifo_queue_waiters;
        uint32_t last_read_seqno;
        spinlock_t irq_lock;
@@ -484,6 +502,7 @@ struct vmw_private {
 
        bool stealth;
        bool enable_fb;
+       spinlock_t svga_lock;
 
        /**
         * Master management.
@@ -493,9 +512,10 @@ struct vmw_private {
        struct vmw_master fbdev_master;
        struct notifier_block pm_nb;
        bool suspended;
+       bool refuse_hibernation;
 
        struct mutex release_mutex;
-       uint32_t num_3d_resources;
+       atomic_t num_fifo_resources;
 
        /*
         * Replace this with an rwsem as soon as we have down_xx_interruptible()
@@ -533,6 +553,8 @@ struct vmw_private {
         */
        struct ttm_buffer_object *otable_bo;
        struct vmw_otable *otables;
+
+       struct vmw_cmdbuf_man *cman;
 };
 
 static inline struct vmw_surface *vmw_res_to_srf(struct vmw_resource *res)
@@ -587,8 +609,9 @@ static inline uint32_t vmw_read(struct vmw_private *dev_priv,
        return val;
 }
 
-int vmw_3d_resource_inc(struct vmw_private *dev_priv, bool unhide_svga);
-void vmw_3d_resource_dec(struct vmw_private *dev_priv, bool hide_svga);
+extern void vmw_svga_enable(struct vmw_private *dev_priv);
+extern void vmw_svga_disable(struct vmw_private *dev_priv);
+
 
 /**
  * GMR utilities - vmwgfx_gmr.c
@@ -726,6 +749,8 @@ extern bool vmw_fifo_have_3d(struct vmw_private *dev_priv);
 extern bool vmw_fifo_have_pitchlock(struct vmw_private *dev_priv);
 extern int vmw_fifo_emit_dummy_query(struct vmw_private *dev_priv,
                                     uint32_t cid);
+extern int vmw_fifo_flush(struct vmw_private *dev_priv,
+                         bool interruptible);
 
 /**
  * TTM glue - vmwgfx_ttm_glue.c
@@ -750,6 +775,7 @@ extern struct ttm_placement vmw_sys_ne_placement;
 extern struct ttm_placement vmw_evictable_placement;
 extern struct ttm_placement vmw_srf_placement;
 extern struct ttm_placement vmw_mob_placement;
+extern struct ttm_placement vmw_mob_ne_placement;
 extern struct ttm_bo_driver vmw_bo_driver;
 extern int vmw_dma_quiescent(struct drm_device *dev);
 extern int vmw_bo_map_dma(struct ttm_buffer_object *bo);
@@ -808,6 +834,7 @@ extern 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);
@@ -833,8 +860,8 @@ extern void vmw_execbuf_copy_fence_user(struct vmw_private *dev_priv,
 
 extern irqreturn_t vmw_irq_handler(int irq, void *arg);
 extern int vmw_wait_seqno(struct vmw_private *dev_priv, bool lazy,
-                            uint32_t seqno, bool interruptible,
-                            unsigned long timeout);
+                         uint32_t seqno, bool interruptible,
+                         unsigned long timeout);
 extern void vmw_irq_preinstall(struct drm_device *dev);
 extern int vmw_irq_postinstall(struct drm_device *dev);
 extern void vmw_irq_uninstall(struct drm_device *dev);
@@ -852,6 +879,10 @@ extern void vmw_seqno_waiter_add(struct vmw_private *dev_priv);
 extern void vmw_seqno_waiter_remove(struct vmw_private *dev_priv);
 extern void vmw_goal_waiter_add(struct vmw_private *dev_priv);
 extern void vmw_goal_waiter_remove(struct vmw_private *dev_priv);
+extern void vmw_generic_waiter_add(struct vmw_private *dev_priv, u32 flag,
+                                  int *waiter_count);
+extern void vmw_generic_waiter_remove(struct vmw_private *dev_priv,
+                                     u32 flag, int *waiter_count);
 
 /**
  * Rudimentary fence-like objects currently used only for throttling -
@@ -861,9 +892,9 @@ extern void vmw_goal_waiter_remove(struct vmw_private *dev_priv);
 extern void vmw_marker_queue_init(struct vmw_marker_queue *queue);
 extern void vmw_marker_queue_takedown(struct vmw_marker_queue *queue);
 extern int vmw_marker_push(struct vmw_marker_queue *queue,
-                         uint32_t seqno);
+                          uint32_t seqno);
 extern int vmw_marker_pull(struct vmw_marker_queue *queue,
-                         uint32_t signaled_seqno);
+                          uint32_t signaled_seqno);
 extern int vmw_wait_lag(struct vmw_private *dev_priv,
                        struct vmw_marker_queue *queue, uint32_t us);
 
@@ -927,6 +958,9 @@ int vmw_dumb_map_offset(struct drm_file *file_priv,
 int vmw_dumb_destroy(struct drm_file *file_priv,
                     struct drm_device *dev,
                     uint32_t handle);
+extern int vmw_resource_pin(struct vmw_resource *res);
+extern void vmw_resource_unpin(struct vmw_resource *res);
+
 /**
  * Overlay control - vmwgfx_overlay.c
  */
@@ -1025,6 +1059,15 @@ extern int vmw_surface_check(struct vmw_private *dev_priv,
                             uint32_t handle, int *id);
 extern int vmw_surface_validate(struct vmw_private *dev_priv,
                                struct vmw_surface *srf);
+int vmw_surface_gb_priv_define(struct drm_device *dev,
+                              uint32_t user_accounting_size,
+                              uint32_t svga3d_flags,
+                              SVGA3dSurfaceFormat format,
+                              bool for_scanout,
+                              uint32_t num_mip_levels,
+                              uint32_t multisample_count,
+                              struct drm_vmw_size size,
+                              struct vmw_surface **srf_out);
 
 /*
  * Shader management - vmwgfx_shader.c
@@ -1074,6 +1117,35 @@ extern int vmw_cmdbuf_res_remove(struct vmw_cmdbuf_res_manager *man,
                                 struct list_head *list);
 
 
+/*
+ * Command buffer managerment vmwgfx_cmdbuf.c
+ */
+struct vmw_cmdbuf_man;
+struct vmw_cmdbuf_header;
+
+extern struct vmw_cmdbuf_man *
+vmw_cmdbuf_man_create(struct vmw_private *dev_priv);
+extern int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man,
+                                   size_t size, size_t default_size);
+extern void vmw_cmdbuf_remove_pool(struct vmw_cmdbuf_man *man);
+extern void vmw_cmdbuf_man_destroy(struct vmw_cmdbuf_man *man);
+extern int vmw_cmdbuf_idle(struct vmw_cmdbuf_man *man, bool interruptible,
+                          unsigned long timeout);
+extern void *vmw_cmdbuf_reserve(struct vmw_cmdbuf_man *man, size_t size,
+                               int ctx_id, bool interruptible,
+                               struct vmw_cmdbuf_header *header);
+extern void vmw_cmdbuf_commit(struct vmw_cmdbuf_man *man, size_t size,
+                             struct vmw_cmdbuf_header *header,
+                             bool flush);
+extern void vmw_cmdbuf_tasklet_schedule(struct vmw_cmdbuf_man *man);
+extern void *vmw_cmdbuf_alloc(struct vmw_cmdbuf_man *man,
+                             size_t size, bool interruptible,
+                             struct vmw_cmdbuf_header **p_header);
+extern void vmw_cmdbuf_header_free(struct vmw_cmdbuf_header *header);
+extern int vmw_cmdbuf_cur_flush(struct vmw_cmdbuf_man *man,
+                               bool interruptible);
+
+
 /**
  * Inline helper functions
  */
@@ -1116,4 +1188,14 @@ static inline struct ttm_mem_global *vmw_mem_glob(struct vmw_private *dev_priv)
 {
        return (struct ttm_mem_global *) dev_priv->mem_global_ref.object;
 }
+
+static inline void vmw_fifo_resource_inc(struct vmw_private *dev_priv)
+{
+       atomic_inc(&dev_priv->num_fifo_resources);
+}
+
+static inline void vmw_fifo_resource_dec(struct vmw_private *dev_priv)
+{
+       atomic_dec(&dev_priv->num_fifo_resources);
+}
 #endif