From 258970afc52dc7af8db5c076e3a3094b1024b206 Mon Sep 17 00:00:00 2001 From: Mark Yao Date: Tue, 25 Jul 2017 11:55:45 +0800 Subject: [PATCH] drm/rockchip: gem: add get phys ioctl Change-Id: Ic9b8c6acfaeb47ec720dbad3d8f5141ef7b13e5d Signed-off-by: Mark Yao --- drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 2 ++ drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 24 +++++++++++++++++++++ drivers/gpu/drm/rockchip/rockchip_drm_gem.h | 3 +++ include/uapi/drm/rockchip_drm.h | 9 ++++++++ 4 files changed, 38 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 6f350b1b3647..67c12afef2bc 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -1350,6 +1350,8 @@ static const struct drm_ioctl_desc rockchip_ioctls[] = { DRM_IOCTL_DEF_DRV(ROCKCHIP_GEM_CPU_RELEASE, rockchip_gem_cpu_release_ioctl, DRM_UNLOCKED | DRM_AUTH | DRM_RENDER_ALLOW), + DRM_IOCTL_DEF_DRV(ROCKCHIP_GEM_GET_PHYS, rockchip_gem_get_phys_ioctl, + DRM_UNLOCKED | DRM_AUTH | DRM_RENDER_ALLOW), }; static const struct file_operations rockchip_drm_driver_fops = { diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index d7dd65cba2c4..0913f74b65c9 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c @@ -672,6 +672,30 @@ int rockchip_gem_map_offset_ioctl(struct drm_device *drm, void *data, &args->offset); } +int rockchip_gem_get_phys_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_rockchip_gem_phys *args = data; + struct rockchip_gem_object *rk_obj; + struct drm_gem_object *obj; + + obj = drm_gem_object_lookup(dev, file_priv, args->handle); + if (!obj) { + DRM_ERROR("failed to lookup gem object.\n"); + return -EINVAL; + } + rk_obj = to_rockchip_obj(obj); + + if (!(rk_obj->flags & ROCKCHIP_BO_CONTIG)) { + DRM_ERROR("Can't get phys address from non-continus buf.\n"); + return -EINVAL; + } + + args->phy_addr = page_to_phys(rk_obj->pages[0]); + + return 0; +} + int rockchip_gem_create_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) { diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h index fb143add842e..aadf0d3e66ac 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h @@ -98,6 +98,9 @@ int rockchip_gem_create_ioctl(struct drm_device *dev, void *data, int rockchip_gem_map_offset_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); +int rockchip_gem_get_phys_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); + /* * acquire gem object for CPU access. */ diff --git a/include/uapi/drm/rockchip_drm.h b/include/uapi/drm/rockchip_drm.h index 574e62472caf..58e557548b3a 100644 --- a/include/uapi/drm/rockchip_drm.h +++ b/include/uapi/drm/rockchip_drm.h @@ -43,6 +43,11 @@ struct drm_rockchip_gem_create { uint32_t handle; }; +struct drm_rockchip_gem_phys { + uint32_t handle; + uint32_t phy_addr; +}; + /** * A structure for getting buffer offset. * @@ -132,6 +137,7 @@ enum rockchip_cabc_mode { #define DRM_ROCKCHIP_GEM_MAP_OFFSET 0x01 #define DRM_ROCKCHIP_GEM_CPU_ACQUIRE 0x02 #define DRM_ROCKCHIP_GEM_CPU_RELEASE 0x03 +#define DRM_ROCKCHIP_GEM_GET_PHYS 0x04 #define DRM_ROCKCHIP_RGA_GET_VER 0x20 #define DRM_ROCKCHIP_RGA_SET_CMDLIST 0x21 @@ -149,6 +155,9 @@ enum rockchip_cabc_mode { #define DRM_IOCTL_ROCKCHIP_GEM_CPU_RELEASE DRM_IOWR(DRM_COMMAND_BASE + \ DRM_ROCKCHIP_GEM_CPU_RELEASE, struct drm_rockchip_gem_cpu_release) +#define DRM_IOCTL_ROCKCHIP_GEM_GET_PHYS DRM_IOWR(DRM_COMMAND_BASE + \ + DRM_ROCKCHIP_GEM_GET_PHYS, struct drm_rockchip_gem_phys) + #define DRM_IOCTL_ROCKCHIP_RGA_GET_VER DRM_IOWR(DRM_COMMAND_BASE + \ DRM_ROCKCHIP_RGA_GET_VER, struct drm_rockchip_rga_get_ver) -- 2.34.1