*
  * This library provides helpers for GEM objects backed by shmem buffers
  * allocated using anonymous pageable memory.
+ *
+ * Functions that operate on the GEM object receive struct &drm_gem_shmem_object.
+ * For GEM callback helpers in struct &drm_gem_object functions, see likewise
+ * named functions with an _object_ infix (e.g., drm_gem_shmem_object_vmap() wraps
+ * drm_gem_shmem_vmap()). These helpers perform the necessary type conversion.
  */
 
 static const struct drm_gem_object_funcs drm_gem_shmem_funcs = {
 EXPORT_SYMBOL_GPL(drm_gem_shmem_create);
 
 /**
- * drm_gem_shmem_free_object - Free resources associated with a shmem GEM object
- * @obj: GEM object to free
+ * drm_gem_shmem_free - Free resources associated with a shmem GEM object
+ * @shmem: shmem GEM object to free
  *
  * This function cleans up the GEM object state and frees the memory used to
  * store the object itself.
  */
-void drm_gem_shmem_free_object(struct drm_gem_object *obj)
+void drm_gem_shmem_free(struct drm_gem_shmem_object *shmem)
 {
-       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+       struct drm_gem_object *obj = &shmem->base;
 
        WARN_ON(shmem->vmap_use_count);
 
        mutex_destroy(&shmem->vmap_lock);
        kfree(shmem);
 }
-EXPORT_SYMBOL_GPL(drm_gem_shmem_free_object);
+EXPORT_SYMBOL_GPL(drm_gem_shmem_free);
 
 static int drm_gem_shmem_get_pages_locked(struct drm_gem_shmem_object *shmem)
 {
 
 /**
  * drm_gem_shmem_pin - Pin backing pages for a shmem GEM object
- * @obj: GEM object
+ * @shmem: shmem GEM object
  *
  * This function makes sure the backing pages are pinned in memory while the
  * buffer is exported.
  * Returns:
  * 0 on success or a negative error code on failure.
  */
-int drm_gem_shmem_pin(struct drm_gem_object *obj)
+int drm_gem_shmem_pin(struct drm_gem_shmem_object *shmem)
 {
-       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
-
        WARN_ON(shmem->base.import_attach);
 
        return drm_gem_shmem_get_pages(shmem);
 
 /**
  * drm_gem_shmem_unpin - Unpin backing pages for a shmem GEM object
- * @obj: GEM object
+ * @shmem: shmem GEM object
  *
  * This function removes the requirement that the backing pages are pinned in
  * memory.
  */
-void drm_gem_shmem_unpin(struct drm_gem_object *obj)
+void drm_gem_shmem_unpin(struct drm_gem_shmem_object *shmem)
 {
-       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
-
        WARN_ON(shmem->base.import_attach);
 
        drm_gem_shmem_put_pages(shmem);
  * Returns:
  * 0 on success or a negative error code on failure.
  */
-int drm_gem_shmem_vmap(struct drm_gem_object *obj, struct dma_buf_map *map)
+int drm_gem_shmem_vmap(struct drm_gem_shmem_object *shmem, struct dma_buf_map *map)
 {
-       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
        int ret;
 
        ret = mutex_lock_interruptible(&shmem->vmap_lock);
  * This function hides the differences between dma-buf imported and natively
  * allocated objects.
  */
-void drm_gem_shmem_vunmap(struct drm_gem_object *obj, struct dma_buf_map *map)
+void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, struct dma_buf_map *map)
 {
-       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
-
        mutex_lock(&shmem->vmap_lock);
        drm_gem_shmem_vunmap_locked(shmem, map);
        mutex_unlock(&shmem->vmap_lock);
 /* Update madvise status, returns true if not purged, else
  * false or -errno.
  */
-int drm_gem_shmem_madvise(struct drm_gem_object *obj, int madv)
+int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv)
 {
-       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
-
        mutex_lock(&shmem->pages_lock);
 
        if (shmem->madv >= 0)
 }
 EXPORT_SYMBOL(drm_gem_shmem_madvise);
 
-void drm_gem_shmem_purge_locked(struct drm_gem_object *obj)
+void drm_gem_shmem_purge_locked(struct drm_gem_shmem_object *shmem)
 {
+       struct drm_gem_object *obj = &shmem->base;
        struct drm_device *dev = obj->dev;
-       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
 
        WARN_ON(!drm_gem_shmem_is_purgeable(shmem));
 
-       dma_unmap_sgtable(obj->dev->dev, shmem->sgt, DMA_BIDIRECTIONAL, 0);
+       dma_unmap_sgtable(dev->dev, shmem->sgt, DMA_BIDIRECTIONAL, 0);
        sg_free_table(shmem->sgt);
        kfree(shmem->sgt);
        shmem->sgt = NULL;
         */
        shmem_truncate_range(file_inode(obj->filp), 0, (loff_t)-1);
 
-       invalidate_mapping_pages(file_inode(obj->filp)->i_mapping,
-                       0, (loff_t)-1);
+       invalidate_mapping_pages(file_inode(obj->filp)->i_mapping, 0, (loff_t)-1);
 }
 EXPORT_SYMBOL(drm_gem_shmem_purge_locked);
 
-bool drm_gem_shmem_purge(struct drm_gem_object *obj)
+bool drm_gem_shmem_purge(struct drm_gem_shmem_object *shmem)
 {
-       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
-
        if (!mutex_trylock(&shmem->pages_lock))
                return false;
-       drm_gem_shmem_purge_locked(obj);
+       drm_gem_shmem_purge_locked(shmem);
        mutex_unlock(&shmem->pages_lock);
 
        return true;
 
 /**
  * drm_gem_shmem_mmap - Memory-map a shmem GEM object
- * @obj: gem object
+ * @shmem: shmem GEM object
  * @vma: VMA for the area to be mapped
  *
  * This function implements an augmented version of the GEM DRM file mmap
  * Returns:
  * 0 on success or a negative error code on failure.
  */
-int drm_gem_shmem_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
+int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_struct *vma)
 {
-       struct drm_gem_shmem_object *shmem;
+       struct drm_gem_object *obj = &shmem->base;
        int ret;
 
        if (obj->import_attach) {
                return dma_buf_mmap(obj->dma_buf, vma, 0);
        }
 
-       shmem = to_drm_gem_shmem_obj(obj);
-
        ret = drm_gem_shmem_get_pages(shmem);
        if (ret) {
                drm_gem_vm_close(vma);
 
 /**
  * drm_gem_shmem_print_info() - Print &drm_gem_shmem_object info for debugfs
+ * @shmem: shmem GEM object
  * @p: DRM printer
  * @indent: Tab indentation level
- * @obj: GEM object
  */
-void drm_gem_shmem_print_info(struct drm_printer *p, unsigned int indent,
-                             const struct drm_gem_object *obj)
+void drm_gem_shmem_print_info(const struct drm_gem_shmem_object *shmem,
+                             struct drm_printer *p, unsigned int indent)
 {
-       const struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
-
        drm_printf_indent(p, indent, "pages_use_count=%u\n", shmem->pages_use_count);
        drm_printf_indent(p, indent, "vmap_use_count=%u\n", shmem->vmap_use_count);
        drm_printf_indent(p, indent, "vaddr=%p\n", shmem->vaddr);
 /**
  * drm_gem_shmem_get_sg_table - Provide a scatter/gather table of pinned
  *                              pages for a shmem GEM object
- * @obj: GEM object
+ * @shmem: shmem GEM object
  *
  * This function exports a scatter/gather table suitable for PRIME usage by
  * calling the standard DMA mapping API.
  * Returns:
  * A pointer to the scatter/gather table of pinned pages or NULL on failure.
  */
-struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_object *obj)
+struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_shmem_object *shmem)
 {
-       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+       struct drm_gem_object *obj = &shmem->base;
 
        WARN_ON(shmem->base.import_attach);
 
 /**
  * drm_gem_shmem_get_pages_sgt - Pin pages, dma map them, and return a
  *                              scatter/gather table for a shmem GEM object.
- * @obj: GEM object
+ * @shmem: shmem GEM object
  *
  * This function returns a scatter/gather table suitable for driver usage. If
  * the sg table doesn't exist, the pages are pinned, dma-mapped, and a sg
  * Returns:
  * A pointer to the scatter/gather table of pinned pages or errno on failure.
  */
-struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_object *obj)
+struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_shmem_object *shmem)
 {
+       struct drm_gem_object *obj = &shmem->base;
        int ret;
-       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
        struct sg_table *sgt;
 
        if (shmem->sgt)
        if (ret)
                return ERR_PTR(ret);
 
-       sgt = drm_gem_shmem_get_sg_table(&shmem->base);
+       sgt = drm_gem_shmem_get_sg_table(shmem);
        if (IS_ERR(sgt)) {
                ret = PTR_ERR(sgt);
                goto err_put_pages;
 
                if (err)
                        goto out;
        } else {
-               struct sg_table *sgt = drm_gem_shmem_get_pages_sgt(obj);
+               struct sg_table *sgt = drm_gem_shmem_get_pages_sgt(shmem);
 
                if (IS_ERR(sgt)) {
                        err = PTR_ERR(sgt);
        if (!list_empty(&bo->va))
                dev_err(obj->dev->dev, "lima gem free bo still has va\n");
 
-       drm_gem_shmem_free_object(obj);
+       drm_gem_shmem_free(&bo->base);
 }
 
 static int lima_gem_object_open(struct drm_gem_object *obj, struct drm_file *file)
        if (bo->heap_size)
                return -EINVAL;
 
-       return drm_gem_shmem_pin(obj);
+       return drm_gem_shmem_pin(&bo->base);
 }
 
 static int lima_gem_vmap(struct drm_gem_object *obj, struct dma_buf_map *map)
        if (bo->heap_size)
                return -EINVAL;
 
-       return drm_gem_shmem_vmap(obj, map);
+       return drm_gem_shmem_vmap(&bo->base, map);
 }
 
 static int lima_gem_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
        if (bo->heap_size)
                return -EINVAL;
 
-       return drm_gem_shmem_mmap(obj, vma);
+       return drm_gem_shmem_mmap(&bo->base, vma);
 }
 
 static const struct drm_gem_object_funcs lima_gem_funcs = {
 
                } else {
                        buffer_chunk->size = lima_bo_size(bo);
 
-                       ret = drm_gem_shmem_vmap(&bo->base.base, &map);
+                       ret = drm_gem_shmem_vmap(&bo->base, &map);
                        if (ret) {
                                kvfree(et);
                                goto out;
 
                        memcpy(buffer_chunk + 1, map.vaddr, buffer_chunk->size);
 
-                       drm_gem_shmem_vunmap(&bo->base.base, &map);
+                       drm_gem_shmem_vunmap(&bo->base, &map);
                }
 
                buffer_chunk = (void *)(buffer_chunk + 1) + buffer_chunk->size;
 
                }
        }
 
-       args->retained = drm_gem_shmem_madvise(gem_obj, args->madv);
+       args->retained = drm_gem_shmem_madvise(&bo->base, args->madv);
 
        if (args->retained) {
                if (args->madv == PANFROST_MADV_DONTNEED)
 
                kvfree(bo->sgts);
        }
 
-       drm_gem_shmem_free_object(obj);
+       drm_gem_shmem_free(&bo->base);
 }
 
 struct panfrost_gem_mapping *
 
 static int panfrost_gem_pin(struct drm_gem_object *obj)
 {
-       if (to_panfrost_bo(obj)->is_heap)
+       struct panfrost_gem_object *bo = to_panfrost_bo(obj);
+
+       if (bo->is_heap)
                return -EINVAL;
 
-       return drm_gem_shmem_pin(obj);
+       return drm_gem_shmem_pin(&bo->base);
 }
 
 static const struct drm_gem_object_funcs panfrost_gem_funcs = {
 
                goto unlock_mappings;
 
        panfrost_gem_teardown_mappings_locked(bo);
-       drm_gem_shmem_purge_locked(obj);
+       drm_gem_shmem_purge_locked(&bo->base);
        ret = true;
 
        mutex_unlock(&shmem->pages_lock);
 
 int panfrost_mmu_map(struct panfrost_gem_mapping *mapping)
 {
        struct panfrost_gem_object *bo = mapping->obj;
-       struct drm_gem_object *obj = &bo->base.base;
+       struct drm_gem_shmem_object *shmem = &bo->base;
+       struct drm_gem_object *obj = &shmem->base;
        struct panfrost_device *pfdev = to_panfrost_device(obj->dev);
        struct sg_table *sgt;
        int prot = IOMMU_READ | IOMMU_WRITE;
        if (bo->noexec)
                prot |= IOMMU_NOEXEC;
 
-       sgt = drm_gem_shmem_get_pages_sgt(obj);
+       sgt = drm_gem_shmem_get_pages_sgt(shmem);
        if (WARN_ON(IS_ERR(sgt)))
                return PTR_ERR(sgt);
 
 
                goto err_close_bo;
        }
 
-       ret = drm_gem_shmem_vmap(&bo->base, &map);
+       ret = drm_gem_shmem_vmap(bo, &map);
        if (ret)
                goto err_put_mapping;
        perfcnt->buf = map.vaddr;
        return 0;
 
 err_vunmap:
-       drm_gem_shmem_vunmap(&bo->base, &map);
+       drm_gem_shmem_vunmap(bo, &map);
 err_put_mapping:
        panfrost_gem_mapping_put(perfcnt->mapping);
 err_close_bo:
                  GPU_PERFCNT_CFG_MODE(GPU_PERFCNT_CFG_MODE_OFF));
 
        perfcnt->user = NULL;
-       drm_gem_shmem_vunmap(&perfcnt->mapping->obj->base.base, &map);
+       drm_gem_shmem_vunmap(&perfcnt->mapping->obj->base, &map);
        perfcnt->buf = NULL;
        panfrost_gem_close(&perfcnt->mapping->obj->base.base, file_priv);
        panfrost_mmu_as_put(pfdev, perfcnt->mapping->mmu);
 
        /* GPU execution may have dirtied any pages in the BO. */
        bo->base.pages_mark_dirty_on_put = true;
 
-       drm_gem_shmem_free_object(obj);
+       drm_gem_shmem_free(&bo->base);
 }
 
 static const struct drm_gem_object_funcs v3d_gem_funcs = {
        /* So far we pin the BO in the MMU for its lifetime, so use
         * shmem's helper for getting a lifetime sgt.
         */
-       sgt = drm_gem_shmem_get_pages_sgt(&bo->base.base);
+       sgt = drm_gem_shmem_get_pages_sgt(&bo->base);
        if (IS_ERR(sgt))
                return PTR_ERR(sgt);
 
        return bo;
 
 free_obj:
-       drm_gem_shmem_free_object(&shmem_obj->base);
+       drm_gem_shmem_free(shmem_obj);
        return ERR_PTR(ret);
 }
 
 
        ret = v3d_bo_create_finish(obj);
        if (ret) {
-               drm_gem_shmem_free_object(obj);
+               drm_gem_shmem_free(&to_v3d_bo(obj)->base);
                return ERR_PTR(ret);
        }
 
 
                        sg_free_table(shmem->pages);
                        kfree(shmem->pages);
                        shmem->pages = NULL;
-                       drm_gem_shmem_unpin(&bo->base.base);
+                       drm_gem_shmem_unpin(&bo->base);
                }
 
-               drm_gem_shmem_free_object(&bo->base.base);
+               drm_gem_shmem_free(&bo->base);
        } else if (virtio_gpu_is_vram(bo)) {
                struct virtio_gpu_object_vram *vram = to_virtio_gpu_vram(bo);
 
        struct scatterlist *sg;
        int si, ret;
 
-       ret = drm_gem_shmem_pin(&bo->base.base);
+       ret = drm_gem_shmem_pin(&bo->base);
        if (ret < 0)
                return -EINVAL;
 
         * dma-ops. This is discouraged for other drivers, but should be fine
         * since virtio_gpu doesn't support dma-buf import from other devices.
         */
-       shmem->pages = drm_gem_shmem_get_sg_table(&bo->base.base);
+       shmem->pages = drm_gem_shmem_get_sg_table(&bo->base);
        if (!shmem->pages) {
-               drm_gem_shmem_unpin(&bo->base.base);
+               drm_gem_shmem_unpin(&bo->base);
                return -EINVAL;
        }
 
 err_put_id:
        virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle);
 err_free_gem:
-       drm_gem_shmem_free_object(&shmem_obj->base);
+       drm_gem_shmem_free(shmem_obj);
        return ret;
 }
 
        container_of(obj, struct drm_gem_shmem_object, base)
 
 struct drm_gem_shmem_object *drm_gem_shmem_create(struct drm_device *dev, size_t size);
-void drm_gem_shmem_free_object(struct drm_gem_object *obj);
+void drm_gem_shmem_free(struct drm_gem_shmem_object *shmem);
 
 int drm_gem_shmem_get_pages(struct drm_gem_shmem_object *shmem);
 void drm_gem_shmem_put_pages(struct drm_gem_shmem_object *shmem);
-int drm_gem_shmem_pin(struct drm_gem_object *obj);
-void drm_gem_shmem_unpin(struct drm_gem_object *obj);
-int drm_gem_shmem_vmap(struct drm_gem_object *obj, struct dma_buf_map *map);
-void drm_gem_shmem_vunmap(struct drm_gem_object *obj, struct dma_buf_map *map);
+int drm_gem_shmem_pin(struct drm_gem_shmem_object *shmem);
+void drm_gem_shmem_unpin(struct drm_gem_shmem_object *shmem);
+int drm_gem_shmem_vmap(struct drm_gem_shmem_object *shmem, struct dma_buf_map *map);
+void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem, struct dma_buf_map *map);
+int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_struct *vma);
 
-int drm_gem_shmem_madvise(struct drm_gem_object *obj, int madv);
+int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv);
 
 static inline bool drm_gem_shmem_is_purgeable(struct drm_gem_shmem_object *shmem)
 {
                !shmem->base.dma_buf && !shmem->base.import_attach;
 }
 
-void drm_gem_shmem_purge_locked(struct drm_gem_object *obj);
-bool drm_gem_shmem_purge(struct drm_gem_object *obj);
+void drm_gem_shmem_purge_locked(struct drm_gem_shmem_object *shmem);
+bool drm_gem_shmem_purge(struct drm_gem_shmem_object *shmem);
 
-int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev,
-                             struct drm_mode_create_dumb *args);
-
-int drm_gem_shmem_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
-
-void drm_gem_shmem_print_info(struct drm_printer *p, unsigned int indent,
-                             const struct drm_gem_object *obj);
+struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_shmem_object *shmem);
+struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_shmem_object *shmem);
 
-struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_object *obj);
+void drm_gem_shmem_print_info(const struct drm_gem_shmem_object *shmem,
+                             struct drm_printer *p, unsigned int indent);
 
 /*
  * GEM object functions
  */
 
 /**
- * drm_gem_shmem_object_free - GEM object function for drm_gem_shmem_free_object()
+ * drm_gem_shmem_object_free - GEM object function for drm_gem_shmem_free()
  * @obj: GEM object to free
  *
- * This function wraps drm_gem_shmem_free_object(). Drivers that employ the shmem helpers
+ * This function wraps drm_gem_shmem_free(). Drivers that employ the shmem helpers
  * should use it as their &drm_gem_object_funcs.free handler.
  */
 static inline void drm_gem_shmem_object_free(struct drm_gem_object *obj)
 {
-       drm_gem_shmem_free_object(obj);
+       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+
+       drm_gem_shmem_free(shmem);
 }
 
 /**
 static inline void drm_gem_shmem_object_print_info(struct drm_printer *p, unsigned int indent,
                                                   const struct drm_gem_object *obj)
 {
-       drm_gem_shmem_print_info(p, indent, obj);
+       const struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+
+       drm_gem_shmem_print_info(shmem, p, indent);
 }
 
 /**
  */
 static inline int drm_gem_shmem_object_pin(struct drm_gem_object *obj)
 {
-       return drm_gem_shmem_pin(obj);
+       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+
+       return drm_gem_shmem_pin(shmem);
 }
 
 /**
  */
 static inline void drm_gem_shmem_object_unpin(struct drm_gem_object *obj)
 {
-       drm_gem_shmem_unpin(obj);
+       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+
+       drm_gem_shmem_unpin(shmem);
 }
 
 /**
  */
 static inline struct sg_table *drm_gem_shmem_object_get_sg_table(struct drm_gem_object *obj)
 {
-       return drm_gem_shmem_get_sg_table(obj);
+       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+
+       return drm_gem_shmem_get_sg_table(shmem);
 }
 
 /*
  */
 static inline int drm_gem_shmem_object_vmap(struct drm_gem_object *obj, struct dma_buf_map *map)
 {
-       return drm_gem_shmem_vmap(obj, map);
+       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+
+       return drm_gem_shmem_vmap(shmem, map);
 }
 
 /*
  */
 static inline void drm_gem_shmem_object_vunmap(struct drm_gem_object *obj, struct dma_buf_map *map)
 {
-       drm_gem_shmem_vunmap(obj, map);
+       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+
+       drm_gem_shmem_vunmap(shmem, map);
 }
 
 /**
  */
 static inline int drm_gem_shmem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
 {
-       return drm_gem_shmem_mmap(obj, vma);
+       struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+
+       return drm_gem_shmem_mmap(shmem, vma);
 }
 
 /*
 drm_gem_shmem_prime_import_sg_table(struct drm_device *dev,
                                    struct dma_buf_attachment *attach,
                                    struct sg_table *sgt);
-
-struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_object *obj);
+int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev,
+                             struct drm_mode_create_dumb *args);
 
 /**
  * DRM_GEM_SHMEM_DRIVER_OPS - Default shmem GEM operations