From: Mark Yao Date: Thu, 13 Jul 2017 06:56:33 +0000 (+0800) Subject: drm/prime: add dmabuf begin/end cpu access X-Git-Tag: release-20171130_firefly~4^2~192 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c6036ecd268097f766428a6c0290e48b98a65dcc;p=firefly-linux-kernel-4.4.55.git drm/prime: add dmabuf begin/end cpu access Change-Id: I0b4be7f8d78142024a2067db041e4f1c2670086c Signed-off-by: Mark Yao --- diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c index 3331c5647d18..6f207d5946dc 100644 --- a/drivers/gpu/drm/drm_prime.c +++ b/drivers/gpu/drm/drm_prime.c @@ -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, }; /** diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 418d5fcd598e..06f801624585 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -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);