From 85cc5b07aaa1d14b6e661884d376cd8183a6c567 Mon Sep 17 00:00:00 2001 From: Mark Yao Date: Thu, 13 Jul 2017 14:57:02 +0800 Subject: [PATCH] drm/rockchip: gem: add begin/end cpu access Change-Id: Ie2c54addcf037cf501edcad76470e5e46c667b7e Signed-off-by: Mark Yao --- drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 2 ++ drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 29 +++++++++++++++++++++ drivers/gpu/drm/rockchip/rockchip_drm_gem.h | 8 ++++++ 3 files changed, 39 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 770a565ec6c5..5a201074519c 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -1273,6 +1273,8 @@ static struct drm_driver rockchip_drm_driver = { .gem_prime_vmap = rockchip_gem_prime_vmap, .gem_prime_vunmap = rockchip_gem_prime_vunmap, .gem_prime_mmap = rockchip_gem_mmap_buf, + .gem_prime_begin_cpu_access = rockchip_gem_prime_begin_cpu_access, + .gem_prime_end_cpu_access = rockchip_gem_prime_end_cpu_access, #ifdef CONFIG_DEBUG_FS .debugfs_init = rockchip_drm_debugfs_init, .debugfs_cleanup = rockchip_drm_debugfs_cleanup, diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index fa34c17bde4d..bdb84c4bab9d 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c @@ -983,3 +983,32 @@ void rockchip_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr) /* Nothing to do if allocated by DMA mapping API. */ } + +int rockchip_gem_prime_begin_cpu_access(struct drm_gem_object *obj, + size_t start, size_t len, + enum dma_data_direction dir) +{ + struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); + struct drm_device *drm = obj->dev; + + if (!rk_obj->sgt) + return 0; + + dma_sync_sg_for_cpu(drm->dev, rk_obj->sgt->sgl, + rk_obj->sgt->nents, dir); + return 0; +} + +void rockchip_gem_prime_end_cpu_access(struct drm_gem_object *obj, + size_t start, size_t len, + enum dma_data_direction dir) +{ + struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); + struct drm_device *drm = obj->dev; + + if (!rk_obj->sgt) + return; + + dma_sync_sg_for_device(drm->dev, rk_obj->sgt->sgl, + rk_obj->sgt->nents, dir); +} diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h index 144c519320f9..a2b151945b51 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h @@ -101,4 +101,12 @@ int rockchip_gem_cpu_acquire_ioctl(struct drm_device *dev, void* data, int rockchip_gem_cpu_release_ioctl(struct drm_device *dev, void* data, struct drm_file *file_priv); +int rockchip_gem_prime_begin_cpu_access(struct drm_gem_object *obj, + size_t start, size_t len, + enum dma_data_direction dir); + +void rockchip_gem_prime_end_cpu_access(struct drm_gem_object *obj, + size_t start, size_t len, + enum dma_data_direction dir); + #endif /* _ROCKCHIP_DRM_GEM_H */ -- 2.34.1