Making i915 use drm_gem_create_mmap_offset() instead of its custom implementations for associating GEM object with a fake offset. Signed-off-by: Dipam Turkar <dipamt1729@xxxxxxxxx> --- drivers/gpu/drm/i915/gem/i915_gem_mman.c | 192 ----------------------- drivers/gpu/drm/i915/gem/i915_gem_mman.h | 4 - drivers/gpu/drm/i915/i915_driver.c | 3 +- 3 files changed, 2 insertions(+), 197 deletions(-) diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c index aa4d842d4c5a..6b73fe509270 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c @@ -600,198 +600,6 @@ void i915_gem_object_release_mmap_offset(struct drm_i915_gem_object *obj) spin_unlock(&obj->mmo.lock); } -static struct i915_mmap_offset * -lookup_mmo(struct drm_i915_gem_object *obj, - enum i915_mmap_type mmap_type) -{ - struct rb_node *rb; - - spin_lock(&obj->mmo.lock); - rb = obj->mmo.offsets.rb_node; - while (rb) { - struct i915_mmap_offset *mmo = - rb_entry(rb, typeof(*mmo), offset); - - if (mmo->mmap_type == mmap_type) { - spin_unlock(&obj->mmo.lock); - return mmo; - } - - if (mmo->mmap_type < mmap_type) - rb = rb->rb_right; - else - rb = rb->rb_left; - } - spin_unlock(&obj->mmo.lock); - - return NULL; -} - -static struct i915_mmap_offset * -insert_mmo(struct drm_i915_gem_object *obj, struct i915_mmap_offset *mmo) -{ - struct rb_node *rb, **p; - - spin_lock(&obj->mmo.lock); - rb = NULL; - p = &obj->mmo.offsets.rb_node; - while (*p) { - struct i915_mmap_offset *pos; - - rb = *p; - pos = rb_entry(rb, typeof(*pos), offset); - - if (pos->mmap_type == mmo->mmap_type) { - spin_unlock(&obj->mmo.lock); - drm_vma_offset_remove(obj->base.dev->vma_offset_manager, - &mmo->vma_node); - kfree(mmo); - return pos; - } - - if (pos->mmap_type < mmo->mmap_type) - p = &rb->rb_right; - else - p = &rb->rb_left; - } - rb_link_node(&mmo->offset, rb, p); - rb_insert_color(&mmo->offset, &obj->mmo.offsets); - spin_unlock(&obj->mmo.lock); - - return mmo; -} - -static struct i915_mmap_offset * -mmap_offset_attach(struct drm_i915_gem_object *obj, - enum i915_mmap_type mmap_type, - struct drm_file *file) -{ - struct drm_i915_private *i915 = to_i915(obj->base.dev); - struct i915_mmap_offset *mmo; - int err; - - GEM_BUG_ON(obj->ops->mmap_offset || obj->ops->mmap_ops); - - mmo = lookup_mmo(obj, mmap_type); - if (mmo) - goto out; - - mmo = kmalloc(sizeof(*mmo), GFP_KERNEL); - if (!mmo) - return ERR_PTR(-ENOMEM); - - mmo->obj = obj; - mmo->mmap_type = mmap_type; - drm_vma_node_reset(&mmo->vma_node); - - err = drm_vma_offset_add(obj->base.dev->vma_offset_manager, - &mmo->vma_node, obj->base.size / PAGE_SIZE); - if (likely(!err)) - goto insert; - - /* Attempt to reap some mmap space from dead objects */ - err = intel_gt_retire_requests_timeout(to_gt(i915), MAX_SCHEDULE_TIMEOUT, - NULL); - if (err) - goto err; - - i915_gem_drain_freed_objects(i915); - err = drm_vma_offset_add(obj->base.dev->vma_offset_manager, - &mmo->vma_node, obj->base.size / PAGE_SIZE); - if (err) - goto err; - -insert: - mmo = insert_mmo(obj, mmo); - GEM_BUG_ON(lookup_mmo(obj, mmap_type) != mmo); -out: - if (file) - drm_vma_node_allow_once(&mmo->vma_node, file); - return mmo; - -err: - kfree(mmo); - return ERR_PTR(err); -} - -static int -__assign_mmap_offset(struct drm_i915_gem_object *obj, - enum i915_mmap_type mmap_type, - u64 *offset, struct drm_file *file) -{ - struct i915_mmap_offset *mmo; - - if (i915_gem_object_never_mmap(obj)) - return -ENODEV; - - if (obj->ops->mmap_offset) { - if (mmap_type != I915_MMAP_TYPE_FIXED) - return -ENODEV; - - *offset = obj->ops->mmap_offset(obj); - return 0; - } - - if (mmap_type == I915_MMAP_TYPE_FIXED) - return -ENODEV; - - if (mmap_type != I915_MMAP_TYPE_GTT && - !i915_gem_object_has_struct_page(obj) && - !i915_gem_object_has_iomem(obj)) - return -ENODEV; - - mmo = mmap_offset_attach(obj, mmap_type, file); - if (IS_ERR(mmo)) - return PTR_ERR(mmo); - - *offset = drm_vma_node_offset_addr(&mmo->vma_node); - return 0; -} - -static int -__assign_mmap_offset_handle(struct drm_file *file, - u32 handle, - enum i915_mmap_type mmap_type, - u64 *offset) -{ - struct drm_i915_gem_object *obj; - int err; - - obj = i915_gem_object_lookup(file, handle); - if (!obj) - return -ENOENT; - - err = i915_gem_object_lock_interruptible(obj, NULL); - if (err) - goto out_put; - err = __assign_mmap_offset(obj, mmap_type, offset, file); - i915_gem_object_unlock(obj); -out_put: - i915_gem_object_put(obj); - return err; -} - -int -i915_gem_dumb_mmap_offset(struct drm_file *file, - struct drm_device *dev, - u32 handle, - u64 *offset) -{ - struct drm_i915_private *i915 = to_i915(dev); - enum i915_mmap_type mmap_type; - - if (HAS_LMEM(to_i915(dev))) - mmap_type = I915_MMAP_TYPE_FIXED; - else if (pat_enabled()) - mmap_type = I915_MMAP_TYPE_WC; - else if (!i915_ggtt_has_aperture(to_gt(i915)->ggtt)) - return -ENODEV; - else - mmap_type = I915_MMAP_TYPE_GTT; - - return __assign_mmap_offset_handle(file, handle, mmap_type, offset); -} - /** * i915_gem_mmap_offset_ioctl - prepare an object for GTT mmap'ing * @dev: DRM device diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.h b/drivers/gpu/drm/i915/gem/i915_gem_mman.h index 196417fd0f5c..253435795caf 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_mman.h +++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.h @@ -20,10 +20,6 @@ struct mutex; int i915_gem_mmap_gtt_version(void); int i915_gem_mmap(struct file *filp, struct vm_area_struct *vma); -int i915_gem_dumb_mmap_offset(struct drm_file *file_priv, - struct drm_device *dev, - u32 handle, u64 *offset); - void __i915_gem_object_release_mmap_gtt(struct drm_i915_gem_object *obj); void i915_gem_object_release_mmap_gtt(struct drm_i915_gem_object *obj); diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index d50347e5773a..a18a33896ba4 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -42,6 +42,7 @@ #include <drm/drm_aperture.h> #include <drm/drm_atomic_helper.h> #include <drm/drm_ioctl.h> +#include <drm/drm_gem.h> #include <drm/drm_managed.h> #include <drm/drm_probe_helper.h> @@ -1826,7 +1827,7 @@ static const struct drm_driver i915_drm_driver = { .gem_prime_import = i915_gem_prime_import, .dumb_create = i915_gem_dumb_create, - .dumb_map_offset = i915_gem_dumb_mmap_offset, + .dumb_map_offset = drm_gem_dumb_mmap_offset, .ioctls = i915_ioctls, .num_ioctls = ARRAY_SIZE(i915_ioctls), -- 2.34.1