Merge tag 'drm-intel-next-2017-03-06' of git://anongit.freedesktop.org/git/drm-intel...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / i915 / i915_gem_object.h
index bf90b07163d1266a6bb0c87f036e84fa78181991..33b0dc4782a9de1c3a6352384dddeea0f4dfaf0b 100644 (file)
@@ -33,6 +33,8 @@
 
 #include <drm/i915_drm.h>
 
+#include "i915_selftest.h"
+
 struct drm_i915_gem_object_ops {
        unsigned int flags;
 #define I915_GEM_OBJECT_HAS_STRUCT_PAGE 0x1
@@ -84,6 +86,7 @@ struct drm_i915_gem_object {
        struct list_head obj_exec_link;
 
        struct list_head batch_pool_link;
+       I915_SELFTEST_DECLARE(struct list_head st_link);
 
        unsigned long flags;
 
@@ -162,19 +165,23 @@ struct drm_i915_gem_object {
        struct reservation_object *resv;
 
        /** References from framebuffers, locks out tiling changes. */
-       unsigned long framebuffer_references;
+       unsigned int framebuffer_references;
 
        /** Record of address bit 17 of each page at last unbind. */
        unsigned long *bit_17;
 
-       struct i915_gem_userptr {
-               uintptr_t ptr;
-               unsigned read_only :1;
+       union {
+               struct i915_gem_userptr {
+                       uintptr_t ptr;
+                       unsigned read_only :1;
+
+                       struct i915_mm_struct *mm;
+                       struct i915_mmu_object *mmu_object;
+                       struct work_struct *work;
+               } userptr;
 
-               struct i915_mm_struct *mm;
-               struct i915_mmu_object *mmu_object;
-               struct work_struct *work;
-       } userptr;
+               unsigned long scratch;
+       };
 
        /** for phys allocated objects */
        struct drm_dma_handle *phys_handle;
@@ -253,6 +260,16 @@ extern void drm_gem_object_unreference(struct drm_gem_object *);
 __deprecated
 extern void drm_gem_object_unreference_unlocked(struct drm_gem_object *);
 
+static inline void i915_gem_object_lock(struct drm_i915_gem_object *obj)
+{
+       reservation_object_lock(obj->resv, NULL);
+}
+
+static inline void i915_gem_object_unlock(struct drm_i915_gem_object *obj)
+{
+       reservation_object_unlock(obj->resv);
+}
+
 static inline bool
 i915_gem_object_is_dead(const struct drm_i915_gem_object *obj)
 {
@@ -299,6 +316,12 @@ i915_gem_object_clear_active_reference(struct drm_i915_gem_object *obj)
 
 void __i915_gem_object_release_unless_active(struct drm_i915_gem_object *obj);
 
+static inline bool
+i915_gem_object_is_framebuffer(const struct drm_i915_gem_object *obj)
+{
+       return READ_ONCE(obj->framebuffer_references);
+}
+
 static inline unsigned int
 i915_gem_object_get_tiling(struct drm_i915_gem_object *obj)
 {
@@ -357,5 +380,7 @@ i915_gem_object_last_write_engine(struct drm_i915_gem_object *obj)
        return engine;
 }
 
+void i915_gem_object_flush_if_display(struct drm_i915_gem_object *obj);
+
 #endif