diff mbox

[5/9] drm/gem: add drm_gem_create_mmap_offset_size()

Message ID 1375897287-8787-6-git-send-email-robdclark@gmail.com (mailing list archive)
State Accepted
Headers show

Commit Message

Rob Clark Aug. 7, 2013, 5:41 p.m. UTC
Variant of drm_gem_create_mmap_offset() which doesn't make the
assumption that virtual size and physical size (obj->size) are the same.
This is needed in omapdrm to deal with tiled buffers.  And lets us get
rid of a duplicated and slightly modified version of
drm_gem_create_mmap_offset() in omapdrm.

Signed-off-by: Rob Clark <robdclark@gmail.com>
---
 drivers/gpu/drm/drm_gem.c | 28 ++++++++++++++++++++++++----
 include/drm/drmP.h        |  1 +
 2 files changed, 25 insertions(+), 4 deletions(-)

Comments

David Herrmann Aug. 8, 2013, 3:29 p.m. UTC | #1
Hi

On Wed, Aug 7, 2013 at 7:41 PM, Rob Clark <robdclark@gmail.com> wrote:
> Variant of drm_gem_create_mmap_offset() which doesn't make the
> assumption that virtual size and physical size (obj->size) are the same.
> This is needed in omapdrm to deal with tiled buffers.  And lets us get
> rid of a duplicated and slightly modified version of
> drm_gem_create_mmap_offset() in omapdrm.
>
> Signed-off-by: Rob Clark <robdclark@gmail.com>

Reviewed-by: David Herrmann <dh.herrmann@gmail.com>

Regards
David

> ---
>  drivers/gpu/drm/drm_gem.c | 28 ++++++++++++++++++++++++----
>  include/drm/drmP.h        |  1 +
>  2 files changed, 25 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
> index 1f76572..84d59f7 100644
> --- a/drivers/gpu/drm/drm_gem.c
> +++ b/drivers/gpu/drm/drm_gem.c
> @@ -303,24 +303,44 @@ drm_gem_free_mmap_offset(struct drm_gem_object *obj)
>  EXPORT_SYMBOL(drm_gem_free_mmap_offset);
>
>  /**
> - * drm_gem_create_mmap_offset - create a fake mmap offset for an object
> + * drm_gem_create_mmap_offset_size - create a fake mmap offset for an object
>   * @obj: obj in question
> + * @size: the virtual size
>   *
>   * GEM memory mapping works by handing back to userspace a fake mmap offset
>   * it can use in a subsequent mmap(2) call.  The DRM core code then looks
>   * up the object based on the offset and sets up the various memory mapping
>   * structures.
>   *
> - * This routine allocates and attaches a fake offset for @obj.
> + * This routine allocates and attaches a fake offset for @obj, in cases where
> + * the virtual size differs from the physical size (ie. obj->size).  Otherwise
> + * just use drm_gem_create_mmap_offset().
>   */
>  int
> -drm_gem_create_mmap_offset(struct drm_gem_object *obj)
> +drm_gem_create_mmap_offset_size(struct drm_gem_object *obj, size_t size)
>  {
>         struct drm_device *dev = obj->dev;
>         struct drm_gem_mm *mm = dev->mm_private;
>
>         return drm_vma_offset_add(&mm->vma_manager, &obj->vma_node,
> -                                 obj->size / PAGE_SIZE);
> +                                 size / PAGE_SIZE);
> +}
> +EXPORT_SYMBOL(drm_gem_create_mmap_offset_size);
> +
> +/**
> + * drm_gem_create_mmap_offset - create a fake mmap offset for an object
> + * @obj: obj in question
> + *
> + * GEM memory mapping works by handing back to userspace a fake mmap offset
> + * it can use in a subsequent mmap(2) call.  The DRM core code then looks
> + * up the object based on the offset and sets up the various memory mapping
> + * structures.
> + *
> + * This routine allocates and attaches a fake offset for @obj.
> + */
> +int drm_gem_create_mmap_offset(struct drm_gem_object *obj)
> +{
> +       return drm_gem_create_mmap_offset_size(obj, obj->size);
>  }
>  EXPORT_SYMBOL(drm_gem_create_mmap_offset);
>
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 1cc765a..d00eb89 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -1668,6 +1668,7 @@ drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj)
>
>  void drm_gem_free_mmap_offset(struct drm_gem_object *obj);
>  int drm_gem_create_mmap_offset(struct drm_gem_object *obj);
> +int drm_gem_create_mmap_offset_size(struct drm_gem_object *obj, size_t size);
>
>  struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev,
>                                              struct drm_file *filp,
> --
> 1.8.3.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
diff mbox

Patch

diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index 1f76572..84d59f7 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -303,24 +303,44 @@  drm_gem_free_mmap_offset(struct drm_gem_object *obj)
 EXPORT_SYMBOL(drm_gem_free_mmap_offset);
 
 /**
- * drm_gem_create_mmap_offset - create a fake mmap offset for an object
+ * drm_gem_create_mmap_offset_size - create a fake mmap offset for an object
  * @obj: obj in question
+ * @size: the virtual size
  *
  * GEM memory mapping works by handing back to userspace a fake mmap offset
  * it can use in a subsequent mmap(2) call.  The DRM core code then looks
  * up the object based on the offset and sets up the various memory mapping
  * structures.
  *
- * This routine allocates and attaches a fake offset for @obj.
+ * This routine allocates and attaches a fake offset for @obj, in cases where
+ * the virtual size differs from the physical size (ie. obj->size).  Otherwise
+ * just use drm_gem_create_mmap_offset().
  */
 int
-drm_gem_create_mmap_offset(struct drm_gem_object *obj)
+drm_gem_create_mmap_offset_size(struct drm_gem_object *obj, size_t size)
 {
 	struct drm_device *dev = obj->dev;
 	struct drm_gem_mm *mm = dev->mm_private;
 
 	return drm_vma_offset_add(&mm->vma_manager, &obj->vma_node,
-				  obj->size / PAGE_SIZE);
+				  size / PAGE_SIZE);
+}
+EXPORT_SYMBOL(drm_gem_create_mmap_offset_size);
+
+/**
+ * drm_gem_create_mmap_offset - create a fake mmap offset for an object
+ * @obj: obj in question
+ *
+ * GEM memory mapping works by handing back to userspace a fake mmap offset
+ * it can use in a subsequent mmap(2) call.  The DRM core code then looks
+ * up the object based on the offset and sets up the various memory mapping
+ * structures.
+ *
+ * This routine allocates and attaches a fake offset for @obj.
+ */
+int drm_gem_create_mmap_offset(struct drm_gem_object *obj)
+{
+	return drm_gem_create_mmap_offset_size(obj, obj->size);
 }
 EXPORT_SYMBOL(drm_gem_create_mmap_offset);
 
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 1cc765a..d00eb89 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1668,6 +1668,7 @@  drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj)
 
 void drm_gem_free_mmap_offset(struct drm_gem_object *obj);
 int drm_gem_create_mmap_offset(struct drm_gem_object *obj);
+int drm_gem_create_mmap_offset_size(struct drm_gem_object *obj, size_t size);
 
 struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev,
 					     struct drm_file *filp,