]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
[karo-tx-linux.git] / drivers / gpu / drm / vmwgfx / vmwgfx_drv.h
index 0336d49e3d4c29da8fbe4c403bb68680e5afd4f6..6d02de6dc36c2957993fc7b3e1ab465ec99d9743 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
  *
- * Copyright © 2009 VMware, Inc., Palo Alto, CA., USA
+ * Copyright © 2009-2015 VMware, Inc., Palo Alto, CA., USA
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
 #include <drm/ttm/ttm_module.h>
 #include "vmwgfx_fence.h"
 
-#define VMWGFX_DRIVER_DATE "20140704"
+#define VMWGFX_DRIVER_DATE "20150810"
 #define VMWGFX_DRIVER_MAJOR 2
-#define VMWGFX_DRIVER_MINOR 6
-#define VMWGFX_DRIVER_PATCHLEVEL 1
+#define VMWGFX_DRIVER_MINOR 9
+#define VMWGFX_DRIVER_PATCHLEVEL 0
 #define VMWGFX_FILE_PAGE_OFFSET 0x00100000
 #define VMWGFX_FIFO_STATIC_SIZE (1024*1024)
 #define VMWGFX_MAX_RELOCATIONS 2048
 #define VMWGFX_MAX_VALIDATIONS 2048
 #define VMWGFX_MAX_DISPLAYS 16
 #define VMWGFX_CMD_BOUNCE_INIT_SIZE 32768
-#define VMWGFX_ENABLE_SCREEN_TARGET_OTABLE 0
+#define VMWGFX_ENABLE_SCREEN_TARGET_OTABLE 1
 
 /*
  * Perhaps we should have sysfs entries for these.
@@ -59,6 +59,8 @@
 #define VMWGFX_NUM_GB_SHADER 20000
 #define VMWGFX_NUM_GB_SURFACE 32768
 #define VMWGFX_NUM_GB_SCREEN_TARGET VMWGFX_MAX_DISPLAYS
+#define VMWGFX_NUM_DXCONTEXT 256
+#define VMWGFX_NUM_DXQUERY 512
 #define VMWGFX_NUM_MOB (VMWGFX_NUM_GB_CONTEXT +\
                        VMWGFX_NUM_GB_SHADER +\
                        VMWGFX_NUM_GB_SURFACE +\
@@ -85,6 +87,9 @@ struct vmw_fpriv {
 struct vmw_dma_buffer {
        struct ttm_buffer_object base;
        struct list_head res_list;
+       s32 pin_count;
+       /* Not ref-counted.  Protected by binding_mutex */
+       struct vmw_resource *dx_query_ctx;
 };
 
 /**
@@ -113,6 +118,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 */
@@ -130,6 +136,9 @@ enum vmw_res_type {
        vmw_res_surface,
        vmw_res_stream,
        vmw_res_shader,
+       vmw_res_dx_context,
+       vmw_res_cotable,
+       vmw_res_view,
        vmw_res_max
 };
 
@@ -137,7 +146,8 @@ enum vmw_res_type {
  * Resources that are managed using command streams.
  */
 enum vmw_cmdbuf_res_type {
-       vmw_cmdbuf_res_compat_shader
+       vmw_cmdbuf_res_shader,
+       vmw_cmdbuf_res_view
 };
 
 struct vmw_cmdbuf_res_manager;
@@ -160,11 +170,13 @@ struct vmw_surface {
        struct drm_vmw_size *sizes;
        uint32_t num_sizes;
        bool scanout;
+       uint32_t array_size;
        /* TODO so far just a extra pointer */
        struct vmw_cursor_snooper snooper;
        struct vmw_surface_offset *offsets;
        SVGA3dTextureFilter autogen_filter;
        uint32_t multisample_count;
+       struct list_head view_list;
 };
 
 struct vmw_marker_queue {
@@ -176,14 +188,15 @@ struct vmw_marker_queue {
 
 struct vmw_fifo_state {
        unsigned long reserved_size;
-       __le32 *dynamic_buffer;
-       __le32 *static_buffer;
+       u32 *dynamic_buffer;
+       u32 *static_buffer;
        unsigned long static_buffer_size;
        bool using_bounce_buffer;
        uint32_t capabilities;
        struct mutex fifo_mutex;
        struct rw_semaphore rwsem;
        struct vmw_marker_queue marker_queue;
+       bool dx;
 };
 
 struct vmw_relocation {
@@ -264,70 +277,15 @@ struct vmw_piter {
 };
 
 /*
- * enum vmw_ctx_binding_type - abstract resource to context binding types
+ * enum vmw_display_unit_type - Describes the display unit
  */
-enum vmw_ctx_binding_type {
-       vmw_ctx_binding_shader,
-       vmw_ctx_binding_rt,
-       vmw_ctx_binding_tex,
-       vmw_ctx_binding_max
+enum vmw_display_unit_type {
+       vmw_du_invalid = 0,
+       vmw_du_legacy,
+       vmw_du_screen_object,
+       vmw_du_screen_target
 };
 
-/**
- * struct vmw_ctx_bindinfo - structure representing a single context binding
- *
- * @ctx: Pointer to the context structure. NULL means the binding is not
- * active.
- * @res: Non ref-counted pointer to the bound resource.
- * @bt: The binding type.
- * @i1: Union of information needed to unbind.
- */
-struct vmw_ctx_bindinfo {
-       struct vmw_resource *ctx;
-       struct vmw_resource *res;
-       enum vmw_ctx_binding_type bt;
-       bool scrubbed;
-       union {
-               SVGA3dShaderType shader_type;
-               SVGA3dRenderTargetType rt_type;
-               uint32 texture_stage;
-       } i1;
-};
-
-/**
- * struct vmw_ctx_binding - structure representing a single context binding
- *                        - suitable for tracking in a context
- *
- * @ctx_list: List head for context.
- * @res_list: List head for bound resource.
- * @bi: Binding info
- */
-struct vmw_ctx_binding {
-       struct list_head ctx_list;
-       struct list_head res_list;
-       struct vmw_ctx_bindinfo bi;
-};
-
-
-/**
- * struct vmw_ctx_binding_state - context binding state
- *
- * @list: linked list of individual bindings.
- * @render_targets: Render target bindings.
- * @texture_units: Texture units/samplers bindings.
- * @shaders: Shader bindings.
- *
- * Note that this structure also provides storage space for the individual
- * struct vmw_ctx_binding objects, so that no dynamic allocation is needed
- * for individual bindings.
- *
- */
-struct vmw_ctx_binding_state {
-       struct list_head list;
-       struct vmw_ctx_binding render_targets[SVGA3D_RT_MAX];
-       struct vmw_ctx_binding texture_units[SVGA3D_NUM_TEXTURE_UNITS];
-       struct vmw_ctx_binding shaders[SVGA3D_SHADERTYPE_MAX];
-};
 
 struct vmw_sw_context{
        struct drm_open_hash res_ht;
@@ -342,15 +300,21 @@ struct vmw_sw_context{
        uint32_t *cmd_bounce;
        uint32_t cmd_bounce_size;
        struct list_head resource_list;
-       struct ttm_buffer_object *cur_query_bo;
+       struct list_head ctx_resource_list; /* For contexts and cotables */
+       struct vmw_dma_buffer *cur_query_bo;
        struct list_head res_relocations;
        uint32_t *buf_start;
        struct vmw_res_cache_entry res_cache[vmw_res_max];
        struct vmw_resource *last_query_ctx;
        bool needs_post_query_barrier;
        struct vmw_resource *error_resource;
-       struct vmw_ctx_binding_state staged_bindings;
+       struct vmw_ctx_binding_state *staged_bindings;
+       bool staged_bindings_inuse;
        struct list_head staged_cmd_res;
+       struct vmw_resource_val_node *dx_ctx_node;
+       struct vmw_dma_buffer *dx_query_mob;
+       struct vmw_resource *dx_query_ctx;
+       struct vmw_cmdbuf_res_manager *man;
 };
 
 struct vmw_legacy_display;
@@ -358,8 +322,6 @@ struct vmw_overlay;
 
 struct vmw_master {
        struct ttm_lock lock;
-       struct mutex fb_surf_mutex;
-       struct list_head fb_surf;
 };
 
 struct vmw_vga_topology_state {
@@ -370,6 +332,26 @@ struct vmw_vga_topology_state {
        uint32_t pos_y;
 };
 
+
+/*
+ * struct vmw_otable - Guest Memory OBject table metadata
+ *
+ * @size:           Size of the table (page-aligned).
+ * @page_table:     Pointer to a struct vmw_mob holding the page table.
+ */
+struct vmw_otable {
+       unsigned long size;
+       struct vmw_mob *page_table;
+       bool enabled;
+};
+
+struct vmw_otable_batch {
+       unsigned num_otables;
+       struct vmw_otable *otables;
+       struct vmw_resource *context;
+       struct ttm_buffer_object *otable_bo;
+};
+
 struct vmw_private {
        struct ttm_bo_device bdev;
        struct ttm_bo_global_ref bo_global_ref;
@@ -387,9 +369,13 @@ struct vmw_private {
        uint32_t mmio_size;
        uint32_t fb_max_width;
        uint32_t fb_max_height;
+       uint32_t texture_max_width;
+       uint32_t texture_max_height;
+       uint32_t stdu_max_width;
+       uint32_t stdu_max_height;
        uint32_t initial_width;
        uint32_t initial_height;
-       __le32 __iomem *mmio_virt;
+       u32 __iomem *mmio_virt;
        int mmio_mtrr;
        uint32_t capabilities;
        uint32_t max_gmr_ids;
@@ -401,6 +387,7 @@ struct vmw_private {
        bool has_mob;
        spinlock_t hw_lock;
        spinlock_t cap_lock;
+       bool has_dx;
 
        /*
         * VGA registers.
@@ -420,6 +407,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 +441,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 +474,7 @@ struct vmw_private {
 
        bool stealth;
        bool enable_fb;
+       spinlock_t svga_lock;
 
        /**
         * Master management.
@@ -493,9 +484,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()
@@ -507,8 +499,8 @@ struct vmw_private {
         * are protected by the cmdbuf mutex.
         */
 
-       struct ttm_buffer_object *dummy_query_bo;
-       struct ttm_buffer_object *pinned_bo;
+       struct vmw_dma_buffer *dummy_query_bo;
+       struct vmw_dma_buffer *pinned_bo;
        uint32_t query_cid;
        uint32_t query_cid_valid;
        bool dummy_query_bo_pinned;
@@ -531,8 +523,9 @@ struct vmw_private {
        /*
         * Guest Backed stuff
         */
-       struct ttm_buffer_object *otable_bo;
-       struct vmw_otable *otables;
+       struct vmw_otable_batch otable_batch;
+
+       struct vmw_cmdbuf_man *cman;
 };
 
 static inline struct vmw_surface *vmw_res_to_srf(struct vmw_resource *res)
@@ -587,8 +580,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
@@ -610,7 +604,8 @@ extern struct vmw_resource *vmw_resource_reference(struct vmw_resource *res);
 extern struct vmw_resource *
 vmw_resource_reference_unless_doomed(struct vmw_resource *res);
 extern int vmw_resource_validate(struct vmw_resource *res);
-extern int vmw_resource_reserve(struct vmw_resource *res, bool no_backup);
+extern int vmw_resource_reserve(struct vmw_resource *res, bool interruptible,
+                               bool no_backup);
 extern bool vmw_resource_needs_backup(const struct vmw_resource *res);
 extern int vmw_user_lookup_handle(struct vmw_private *dev_priv,
                                  struct ttm_object_file *tfile,
@@ -660,10 +655,14 @@ extern int vmw_user_stream_lookup(struct vmw_private *dev_priv,
                                  uint32_t *inout_id,
                                  struct vmw_resource **out);
 extern void vmw_resource_unreserve(struct vmw_resource *res,
+                                  bool switch_backup,
                                   struct vmw_dma_buffer *new_backup,
                                   unsigned long new_backup_offset);
 extern void vmw_resource_move_notify(struct ttm_buffer_object *bo,
                                     struct ttm_mem_reg *mem);
+extern void vmw_query_move_notify(struct ttm_buffer_object *bo,
+                                 struct ttm_mem_reg *mem);
+extern int vmw_query_readback_all(struct vmw_dma_buffer *dx_query_mob);
 extern void vmw_fence_single_bo(struct ttm_buffer_object *bo,
                                struct vmw_fence_obj *fence);
 extern void vmw_resource_evict_all(struct vmw_private *dev_priv);
@@ -671,25 +670,25 @@ extern void vmw_resource_evict_all(struct vmw_private *dev_priv);
 /**
  * DMA buffer helper routines - vmwgfx_dmabuf.c
  */
-extern int vmw_dmabuf_to_placement(struct vmw_private *vmw_priv,
-                                  struct vmw_dma_buffer *bo,
-                                  struct ttm_placement *placement,
-                                  bool interruptible);
-extern int vmw_dmabuf_to_vram(struct vmw_private *dev_priv,
-                             struct vmw_dma_buffer *buf,
-                             bool pin, bool interruptible);
-extern int vmw_dmabuf_to_vram_or_gmr(struct vmw_private *dev_priv,
-                                    struct vmw_dma_buffer *buf,
-                                    bool pin, bool interruptible);
-extern int vmw_dmabuf_to_start_of_vram(struct vmw_private *vmw_priv,
+extern int vmw_dmabuf_pin_in_placement(struct vmw_private *vmw_priv,
                                       struct vmw_dma_buffer *bo,
-                                      bool pin, bool interruptible);
+                                      struct ttm_placement *placement,
+                                      bool interruptible);
+extern int vmw_dmabuf_pin_in_vram(struct vmw_private *dev_priv,
+                                 struct vmw_dma_buffer *buf,
+                                 bool interruptible);
+extern int vmw_dmabuf_pin_in_vram_or_gmr(struct vmw_private *dev_priv,
+                                        struct vmw_dma_buffer *buf,
+                                        bool interruptible);
+extern int vmw_dmabuf_pin_in_start_of_vram(struct vmw_private *vmw_priv,
+                                          struct vmw_dma_buffer *bo,
+                                          bool interruptible);
 extern int vmw_dmabuf_unpin(struct vmw_private *vmw_priv,
                            struct vmw_dma_buffer *bo,
                            bool interruptible);
 extern void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *buf,
                                 SVGAGuestPtr *ptr);
-extern void vmw_bo_pin(struct ttm_buffer_object *bo, bool pin);
+extern void vmw_bo_pin_reserved(struct vmw_dma_buffer *bo, bool pin);
 
 /**
  * Misc Ioctl functionality - vmwgfx_ioctl.c
@@ -717,7 +716,10 @@ extern int vmw_fifo_init(struct vmw_private *dev_priv,
 extern void vmw_fifo_release(struct vmw_private *dev_priv,
                             struct vmw_fifo_state *fifo);
 extern void *vmw_fifo_reserve(struct vmw_private *dev_priv, uint32_t bytes);
+extern void *
+vmw_fifo_reserve_dx(struct vmw_private *dev_priv, uint32_t bytes, int ctx_id);
 extern void vmw_fifo_commit(struct vmw_private *dev_priv, uint32_t bytes);
+extern void vmw_fifo_commit_flush(struct vmw_private *dev_priv, uint32_t bytes);
 extern int vmw_fifo_send_fence(struct vmw_private *dev_priv,
                               uint32_t *seqno);
 extern void vmw_fifo_ping_host_locked(struct vmw_private *, uint32_t reason);
@@ -726,6 +728,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 +754,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);
@@ -800,14 +805,15 @@ static inline struct page *vmw_piter_page(struct vmw_piter *viter)
  * Command submission - vmwgfx_execbuf.c
  */
 
-extern int vmw_execbuf_ioctl(struct drm_device *dev, void *data,
-                            struct drm_file *file_priv);
+extern int vmw_execbuf_ioctl(struct drm_device *dev, unsigned long data,
+                            struct drm_file *file_priv, size_t size);
 extern int vmw_execbuf_process(struct drm_file *file_priv,
                               struct vmw_private *dev_priv,
                               void __user *user_commands,
                               void *kernel_commands,
                               uint32_t command_size,
                               uint64_t throttle_us,
+                              uint32_t dx_context_handle,
                               struct drm_vmw_fence_rep __user
                               *user_fence_rep,
                               struct vmw_fence_obj **out_fence);
@@ -826,6 +832,11 @@ extern void vmw_execbuf_copy_fence_user(struct vmw_private *dev_priv,
                                        *user_fence_rep,
                                        struct vmw_fence_obj *fence,
                                        uint32_t fence_handle);
+extern int vmw_validate_single_buffer(struct vmw_private *dev_priv,
+                                     struct ttm_buffer_object *bo,
+                                     bool interruptible,
+                                     bool validate_as_mob);
+
 
 /**
  * IRQs and wating - vmwgfx_irq.c
@@ -833,8 +844,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 +863,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 +876,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);
 
@@ -908,12 +923,6 @@ int vmw_kms_present(struct vmw_private *dev_priv,
                    uint32_t sid, int32_t destX, int32_t destY,
                    struct drm_vmw_rect *clips,
                    uint32_t num_clips);
-int vmw_kms_readback(struct vmw_private *dev_priv,
-                    struct drm_file *file_priv,
-                    struct vmw_framebuffer *vfb,
-                    struct drm_vmw_fence_rep __user *user_fence_rep,
-                    struct drm_vmw_rect *clips,
-                    uint32_t num_clips);
 int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
                                struct drm_file *file_priv);
 
@@ -927,6 +936,10 @@ 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, bool interruptible);
+extern void vmw_resource_unpin(struct vmw_resource *res);
+extern enum vmw_res_type vmw_res_type(const struct vmw_resource *res);
+
 /**
  * Overlay control - vmwgfx_overlay.c
  */
@@ -982,27 +995,33 @@ extern void vmw_otables_takedown(struct vmw_private *dev_priv);
 
 extern const struct vmw_user_resource_conv *user_context_converter;
 
-extern struct vmw_resource *vmw_context_alloc(struct vmw_private *dev_priv);
-
 extern int vmw_context_check(struct vmw_private *dev_priv,
                             struct ttm_object_file *tfile,
                             int id,
                             struct vmw_resource **p_res);
 extern int vmw_context_define_ioctl(struct drm_device *dev, void *data,
                                    struct drm_file *file_priv);
+extern int vmw_extended_context_define_ioctl(struct drm_device *dev, void *data,
+                                            struct drm_file *file_priv);
 extern int vmw_context_destroy_ioctl(struct drm_device *dev, void *data,
                                     struct drm_file *file_priv);
-extern int vmw_context_binding_add(struct vmw_ctx_binding_state *cbs,
-                                  const struct vmw_ctx_bindinfo *ci);
-extern void
-vmw_context_binding_state_transfer(struct vmw_resource *res,
-                                  struct vmw_ctx_binding_state *cbs);
-extern void vmw_context_binding_res_list_kill(struct list_head *head);
-extern void vmw_context_binding_res_list_scrub(struct list_head *head);
-extern int vmw_context_rebind_all(struct vmw_resource *ctx);
 extern struct list_head *vmw_context_binding_list(struct vmw_resource *ctx);
 extern struct vmw_cmdbuf_res_manager *
 vmw_context_res_man(struct vmw_resource *ctx);
+extern struct vmw_resource *vmw_context_cotable(struct vmw_resource *ctx,
+                                               SVGACOTableType cotable_type);
+extern struct list_head *vmw_context_binding_list(struct vmw_resource *ctx);
+struct vmw_ctx_binding_state;
+extern struct vmw_ctx_binding_state *
+vmw_context_binding_state(struct vmw_resource *ctx);
+extern void vmw_dx_context_scrub_cotables(struct vmw_resource *ctx,
+                                         bool readback);
+extern int vmw_context_bind_dx_query(struct vmw_resource *ctx_res,
+                                    struct vmw_dma_buffer *mob);
+extern struct vmw_dma_buffer *
+vmw_context_get_dx_query_mob(struct vmw_resource *ctx_res);
+
+
 /*
  * Surface management - vmwgfx_surface.c
  */
@@ -1025,6 +1044,16 @@ 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,
+                              uint32_t array_size,
+                              struct drm_vmw_size size,
+                              struct vmw_surface **srf_out);
 
 /*
  * Shader management - vmwgfx_shader.c
@@ -1042,12 +1071,21 @@ extern int vmw_compat_shader_add(struct vmw_private *dev_priv,
                                 SVGA3dShaderType shader_type,
                                 size_t size,
                                 struct list_head *list);
-extern int vmw_compat_shader_remove(struct vmw_cmdbuf_res_manager *man,
-                                   u32 user_key, SVGA3dShaderType shader_type,
-                                   struct list_head *list);
+extern int vmw_shader_remove(struct vmw_cmdbuf_res_manager *man,
+                            u32 user_key, SVGA3dShaderType shader_type,
+                            struct list_head *list);
+extern int vmw_dx_shader_add(struct vmw_cmdbuf_res_manager *man,
+                            struct vmw_resource *ctx,
+                            u32 user_key,
+                            SVGA3dShaderType shader_type,
+                            struct list_head *list);
+extern void vmw_dx_shader_cotable_list_scrub(struct vmw_private *dev_priv,
+                                            struct list_head *list,
+                                            bool readback);
+
 extern struct vmw_resource *
-vmw_compat_shader_lookup(struct vmw_cmdbuf_res_manager *man,
-                        u32 user_key, SVGA3dShaderType shader_type);
+vmw_shader_lookup(struct vmw_cmdbuf_res_manager *man,
+                 u32 user_key, SVGA3dShaderType shader_type);
 
 /*
  * Command buffer managed resources - vmwgfx_cmdbuf_res.c
@@ -1071,7 +1109,48 @@ extern int vmw_cmdbuf_res_add(struct vmw_cmdbuf_res_manager *man,
 extern int vmw_cmdbuf_res_remove(struct vmw_cmdbuf_res_manager *man,
                                 enum vmw_cmdbuf_res_type res_type,
                                 u32 user_key,
-                                struct list_head *list);
+                                struct list_head *list,
+                                struct vmw_resource **res);
+
+/*
+ * COTable management - vmwgfx_cotable.c
+ */
+extern const SVGACOTableType vmw_cotable_scrub_order[];
+extern struct vmw_resource *vmw_cotable_alloc(struct vmw_private *dev_priv,
+                                             struct vmw_resource *ctx,
+                                             u32 type);
+extern int vmw_cotable_notify(struct vmw_resource *res, int id);
+extern int vmw_cotable_scrub(struct vmw_resource *res, bool readback);
+extern void vmw_cotable_add_resource(struct vmw_resource *ctx,
+                                    struct list_head *head);
+
+/*
+ * 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);
 
 
 /**
@@ -1116,4 +1195,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