drm/etnaviv: implement dma-buf mmap
authorLucas Stach <l.stach@pengutronix.de>
Fri, 18 Nov 2016 14:15:16 +0000 (15:15 +0100)
committerLucas Stach <l.stach@pengutronix.de>
Fri, 2 Dec 2016 18:30:21 +0000 (19:30 +0100)
This adds the required boilerplate to allow direct mmap of exported
etnaviv BOs.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Tested-by: Philipp Zabel <p.zabel@pengutronix.de>
drivers/gpu/drm/etnaviv/etnaviv_drv.c
drivers/gpu/drm/etnaviv/etnaviv_drv.h
drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c

index aa687669e22b4b05cbbc98f4af5e72ef62979e81..38720adfc62fa438447ca6722f4e116ff1cdbc15 100644 (file)
@@ -505,6 +505,7 @@ static struct drm_driver etnaviv_drm_driver = {
        .gem_prime_import_sg_table = etnaviv_gem_prime_import_sg_table,
        .gem_prime_vmap     = etnaviv_gem_prime_vmap,
        .gem_prime_vunmap   = etnaviv_gem_prime_vunmap,
+       .gem_prime_mmap     = etnaviv_gem_prime_mmap,
 #ifdef CONFIG_DEBUG_FS
        .debugfs_init       = etnaviv_debugfs_init,
        .debugfs_cleanup    = etnaviv_debugfs_cleanup,
index 65e057639653026363b03c3f740c91f6bb4735d0..c255eda40526f8082d721541d4e6f2e74079fcb4 100644 (file)
@@ -78,6 +78,8 @@ int etnaviv_gem_mmap_offset(struct drm_gem_object *obj, u64 *offset);
 struct sg_table *etnaviv_gem_prime_get_sg_table(struct drm_gem_object *obj);
 void *etnaviv_gem_prime_vmap(struct drm_gem_object *obj);
 void etnaviv_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
+int etnaviv_gem_prime_mmap(struct drm_gem_object *obj,
+                          struct vm_area_struct *vma);
 struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev,
        struct dma_buf_attachment *attach, struct sg_table *sg);
 int etnaviv_gem_prime_pin(struct drm_gem_object *obj);
index b93618c1aa69e6c77609d1bc0ce18f308cab7b3f..7e8fdb1859dd9adcc8759438585cbec92f830df3 100644 (file)
@@ -39,6 +39,19 @@ void etnaviv_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
        /* TODO msm_gem_vunmap() */
 }
 
+int etnaviv_gem_prime_mmap(struct drm_gem_object *obj,
+                          struct vm_area_struct *vma)
+{
+       struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
+       int ret;
+
+       ret = drm_gem_mmap_obj(obj, obj->size, vma);
+       if (ret < 0)
+               return ret;
+
+       return etnaviv_obj->ops->mmap(etnaviv_obj, vma);
+}
+
 int etnaviv_gem_prime_pin(struct drm_gem_object *obj)
 {
        if (!obj->import_attach) {