diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index c1d62e4f4ca7..e383cf922eaa 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -990,6 +990,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, .fops = &rockchip_drm_driver_fops, .name = DRIVER_NAME, .desc = DRIVER_DESC, diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index c995a4738fc2..78be73b08269 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c @@ -427,7 +427,7 @@ static void rockchip_gem_release_object(struct rockchip_gem_object *rk_obj) kfree(rk_obj); } -struct rockchip_gem_object * +static struct rockchip_gem_object * rockchip_gem_alloc_object(struct drm_device *drm, unsigned int size) { struct rockchip_gem_object *rk_obj; @@ -697,3 +697,31 @@ 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, + 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; +} + +int rockchip_gem_prime_end_cpu_access(struct drm_gem_object *obj, + 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_device(drm->dev, rk_obj->sgt->sgl, + rk_obj->sgt->nents, dir); + return 0; +} diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h index d41fa65219d2..ee35f723c17c 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h @@ -58,4 +58,10 @@ void rockchip_gem_free_object(struct drm_gem_object *obj); int rockchip_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev, struct drm_mode_create_dumb *args); + +int rockchip_gem_prime_begin_cpu_access(struct drm_gem_object *obj, + enum dma_data_direction dir); + +int rockchip_gem_prime_end_cpu_access(struct drm_gem_object *obj, + enum dma_data_direction dir); #endif /* _ROCKCHIP_DRM_GEM_H */