OSDN Git Service

drm/vmwgfx: Kill a bunch of sparse warnings
[uclinux-h8/linux.git] / drivers / gpu / drm / vmwgfx / vmwgfx_drv.h
index d26a6da..c9ea9b1 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
 #include <drm/ttm/ttm_module.h>
 #include "vmwgfx_fence.h"
 
-#define VMWGFX_DRIVER_DATE "20140704"
+#define VMWGFX_DRIVER_DATE "20150626"
 #define VMWGFX_DRIVER_MAJOR 2
-#define VMWGFX_DRIVER_MINOR 6
-#define VMWGFX_DRIVER_PATCHLEVEL 1
+#define VMWGFX_DRIVER_MINOR 7
+#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.
@@ -85,6 +85,7 @@ struct vmw_fpriv {
 struct vmw_dma_buffer {
        struct ttm_buffer_object base;
        struct list_head res_list;
+       s32 pin_count;
 };
 
 /**
@@ -113,6 +114,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 */
@@ -176,8 +178,8 @@ 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;
@@ -329,6 +331,18 @@ 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,
+       vmw_du_screen_target
+};
+
+
 struct vmw_sw_context{
        struct drm_open_hash res_ht;
        bool res_ht_initialized;
@@ -342,7 +356,7 @@ 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 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];
@@ -358,8 +372,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 {
@@ -387,9 +399,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;
@@ -420,6 +436,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 +470,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 +503,7 @@ struct vmw_private {
 
        bool stealth;
        bool enable_fb;
+       spinlock_t svga_lock;
 
        /**
         * Master management.
@@ -493,9 +513,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 +528,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;
@@ -533,6 +554,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 +610,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 +634,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,
@@ -671,25 +696,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
@@ -726,6 +751,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 +777,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);
@@ -826,6 +854,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 +866,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 +885,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 +898,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 +945,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 +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, bool interruptible);
+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