drm/prime: add dmabuf begin/end cpu access
authorMark Yao <mark.yao@rock-chips.com>
Thu, 13 Jul 2017 06:56:33 +0000 (14:56 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Thu, 13 Jul 2017 10:40:13 +0000 (18:40 +0800)
Change-Id: I0b4be7f8d78142024a2067db041e4f1c2670086c
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
drivers/gpu/drm/drm_prime.c
include/drm/drmP.h

index 3331c5647d186f1851b31dd87cc3ed3d6eec0dfd..6f207d5946dcc47fbcab47a39ce64b543fca0e40 100644 (file)
@@ -293,6 +293,32 @@ static int drm_gem_dmabuf_mmap(struct dma_buf *dma_buf,
        return dev->driver->gem_prime_mmap(obj, vma);
 }
 
+static int drm_gem_dmabuf_begin_cpu_access(struct dma_buf *dma_buf,
+                                          size_t start, size_t len,
+                                          enum dma_data_direction dir)
+{
+       struct drm_gem_object *obj = dma_buf->priv;
+       struct drm_device *dev = obj->dev;
+
+       if (!dev->driver->gem_prime_begin_cpu_access)
+               return -ENOSYS;
+
+       return dev->driver->gem_prime_begin_cpu_access(obj, start, len, dir);
+}
+
+static void drm_gem_dmabuf_end_cpu_access(struct dma_buf *dma_buf,
+                                         size_t start, size_t len,
+                                         enum dma_data_direction dir)
+{
+       struct drm_gem_object *obj = dma_buf->priv;
+       struct drm_device *dev = obj->dev;
+
+       if (!dev->driver->gem_prime_end_cpu_access)
+               return;
+
+       dev->driver->gem_prime_end_cpu_access(obj, start, len, dir);
+}
+
 static const struct dma_buf_ops drm_gem_prime_dmabuf_ops =  {
        .attach = drm_gem_map_attach,
        .detach = drm_gem_map_detach,
@@ -306,6 +332,8 @@ static const struct dma_buf_ops drm_gem_prime_dmabuf_ops =  {
        .mmap = drm_gem_dmabuf_mmap,
        .vmap = drm_gem_dmabuf_vmap,
        .vunmap = drm_gem_dmabuf_vunmap,
+       .begin_cpu_access = drm_gem_dmabuf_begin_cpu_access,
+       .end_cpu_access = drm_gem_dmabuf_end_cpu_access,
 };
 
 /**
index 418d5fcd598e04763bd0a95125dba9f65311ff91..06f80162458579b2ad1cd9786d92b98c63facc80 100644 (file)
@@ -675,6 +675,12 @@ struct drm_driver {
        void (*gem_prime_vunmap)(struct drm_gem_object *obj, void *vaddr);
        int (*gem_prime_mmap)(struct drm_gem_object *obj,
                                struct vm_area_struct *vma);
+       int (*gem_prime_begin_cpu_access)(struct drm_gem_object *obj,
+                                         size_t, size_t,
+                                         enum dma_data_direction);
+       void (*gem_prime_end_cpu_access)(struct drm_gem_object *obj,
+                                        size_t, size_t,
+                                        enum dma_data_direction);
 
        /* vga arb irq handler */
        void (*vgaarb_irq)(struct drm_device *dev, bool state);