drm/i915/gem: Move stolen node into GEM object union
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 19 Jan 2021 21:43:33 +0000 (21:43 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 20 Jan 2021 20:46:36 +0000 (20:46 +0000)
The obj->stolen is currently used to identify an object allocated from
stolen memory. This dates back to when there were just 1.5 types of
objects, an object backed by shmemfs and an object backed by shmemfs
with a contiguous physical address. Now that we have several different
types of objects, we no longer want to treat stolen objects as a special
case.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210119214336.1463-3-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/display/intel_fbdev.c
drivers/gpu/drm/i915/gem/i915_gem_object.h
drivers/gpu/drm/i915/gem/i915_gem_object_types.h
drivers/gpu/drm/i915/gem/i915_gem_phys.c
drivers/gpu/drm/i915/gem/i915_gem_shmem.c
drivers/gpu/drm/i915/gem/i915_gem_stolen.c
drivers/gpu/drm/i915/gem/i915_gem_stolen.h
drivers/gpu/drm/i915/gt/intel_ring.c
drivers/gpu/drm/i915/gt/shmem_utils.c
drivers/gpu/drm/i915/i915_debugfs.c

index 842c04e..84f853f 100644 (file)
@@ -256,7 +256,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
         * If the object is stolen however, it will be full of whatever
         * garbage was left in there.
         */
-       if (vma->obj->stolen && !prealloc)
+       if (!i915_gem_object_is_shmem(vma->obj) && !prealloc)
                memset_io(info->screen_base, 0, info->screen_size);
 
        /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
@@ -595,7 +595,7 @@ void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous
         * full of whatever garbage was left in there.
         */
        if (state == FBINFO_STATE_RUNNING &&
-           intel_fb_obj(&ifbdev->fb->base)->stolen)
+           !i915_gem_object_is_shmem(intel_fb_obj(&ifbdev->fb->base)))
                memset_io(info->screen_base, 0, info->screen_size);
 
        drm_fb_helper_set_suspend(&ifbdev->helper, state);
index b6a16ab..689b61c 100644 (file)
@@ -531,4 +531,6 @@ i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
                __i915_gem_object_invalidate_frontbuffer(obj, origin);
 }
 
+bool i915_gem_object_is_shmem(const struct drm_i915_gem_object *obj);
+
 #endif
index ab55b7b..217151c 100644 (file)
@@ -150,8 +150,6 @@ struct drm_i915_gem_object {
         */
        struct list_head obj_link;
 
-       /** Stolen memory for this object, instead of being backed by shmem. */
-       struct drm_mm_node *stolen;
        union {
                struct rcu_head rcu;
                struct llist_node freed;
@@ -303,6 +301,8 @@ struct drm_i915_gem_object {
                        struct work_struct *work;
                } userptr;
 
+               struct drm_mm_node *stolen;
+
                unsigned long scratch;
                u64 encode;
 
index 3a4dfe2..3bb65a1 100644 (file)
@@ -213,7 +213,7 @@ int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj, int align)
        if (obj->ops == &i915_gem_phys_ops)
                return 0;
 
-       if (obj->ops != &i915_gem_shmem_ops)
+       if (!i915_gem_object_is_shmem(obj))
                return -EINVAL;
 
        err = i915_gem_object_unbind(obj, I915_GEM_OBJECT_UNBIND_ACTIVE);
index 722e021..cf83c20 100644 (file)
@@ -612,3 +612,8 @@ struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915)
                                          PAGE_SIZE, 0,
                                          &shmem_region_ops);
 }
+
+bool i915_gem_object_is_shmem(const struct drm_i915_gem_object *obj)
+{
+       return obj->ops == &i915_gem_shmem_ops;
+}
index b221492..5519353 100644 (file)
@@ -781,3 +781,8 @@ err_free:
        kfree(stolen);
        return obj;
 }
+
+bool i915_gem_object_is_stolen(const struct drm_i915_gem_object *obj)
+{
+       return obj->ops == &i915_gem_object_stolen_ops;
+}
index 61e0280..b034897 100644 (file)
@@ -30,6 +30,8 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv
                                               resource_size_t stolen_offset,
                                               resource_size_t size);
 
+bool i915_gem_object_is_stolen(const struct drm_i915_gem_object *obj);
+
 #define I915_GEM_STOLEN_BIAS SZ_128K
 
 #endif /* __I915_GEM_STOLEN_H__ */
index 0638555..78d1360 100644 (file)
@@ -42,7 +42,7 @@ int intel_ring_pin(struct intel_ring *ring, struct i915_gem_ww_ctx *ww)
        /* Ring wraparound at offset 0 sometimes hangs. No idea why. */
        flags = PIN_OFFSET_BIAS | i915_ggtt_pin_bias(vma);
 
-       if (vma->obj->stolen)
+       if (i915_gem_object_is_stolen(vma->obj))
                flags |= PIN_MAPPABLE;
        else
                flags |= PIN_HIGH;
index 5982b62..a4d8fc9 100644 (file)
@@ -33,7 +33,7 @@ struct file *shmem_create_from_object(struct drm_i915_gem_object *obj)
        struct file *file;
        void *ptr;
 
-       if (obj->ops == &i915_gem_shmem_ops) {
+       if (i915_gem_object_is_shmem(obj)) {
                file = obj->base.filp;
                atomic_long_inc(&file->f_count);
                return file;
index 437da31..88336ff 100644 (file)
@@ -210,7 +210,7 @@ i915_debugfs_describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
        spin_unlock(&obj->vma.lock);
 
        seq_printf(m, " (pinned x %d)", pin_count);
-       if (obj->stolen)
+       if (i915_gem_object_is_stolen(obj))
                seq_printf(m, " (stolen: %08llx)", obj->stolen->start);
        if (i915_gem_object_is_framebuffer(obj))
                seq_printf(m, " (fb)");