]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
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 842c04e6321472490a0e5b7f9a6af500764b039b..84f853f113b953abdf9c410fe9915ffaa8b6832c 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 b6a16ab859564019e20cae9b021a348e1946048c..689b61c28754e8b585edfccc342c26e0a3ae0bbf 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 ab55b7bb9ca623b651b83b721d28c0696a02ec1d..217151c18d49ff081255fdcc175bf779173f00c5 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 3a4dfe2ef1da5b9d847105f49bfacd50524a3252..3bb65a1b1d936edd49ea096503739408016a23c1 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 722e02164c3ef95cb249e5fa1c3be40fd5aebc16..cf83c208688cbfd4bd288b002b04de1c2fc497f9 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 b221492531efa3d32c9039d7a2b0e47931642ce4..551935348ad8e37f6f1004febe9726abb93c3474 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 61e028063f9fb0638fc3d3355177dacc51d8c160..b03489706796934aecbb9492c8f6a5787648cdc5 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 06385550450c5ad9f21dc1133eb7392b07f9874b..78d1360caa0fdc4902c7d42bf1c379b6706906fa 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 5982b62f913d1d953c09128647c5fa9e60aab810..a4d8fc9e2374cae3c8d17e61b65a6cbe2847b223 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 437da318897cc9106a2c150a5bb14c7da65bd3f4..88336ff4bf097a87a1636a92f8da003c5e116f24 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)");