drm/rockchip: gem: add get phys ioctl
authorMark Yao <mark.yao@rock-chips.com>
Tue, 25 Jul 2017 03:55:45 +0000 (11:55 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 9 Aug 2017 08:35:04 +0000 (16:35 +0800)
Change-Id: Ic9b8c6acfaeb47ec720dbad3d8f5141ef7b13e5d
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
drivers/gpu/drm/rockchip/rockchip_drm_drv.c
drivers/gpu/drm/rockchip/rockchip_drm_gem.c
drivers/gpu/drm/rockchip/rockchip_drm_gem.h
include/uapi/drm/rockchip_drm.h

index 6f350b1b3647711b5f87f5f54b476717cb3fc84c..67c12afef2bc09a41a82bb8e30f4ad2093b9e5e1 100644 (file)
@@ -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 = {
index d7dd65cba2c4cbca5b3af3cea9b74b1134305b38..0913f74b65c90aefeb1ccdcbbf0f90bfb922b690 100644 (file)
@@ -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)
 {
index fb143add842ef86d10b6d04dc9f5d17a869a57c3..aadf0d3e66acdd5816827911544639ded2379407 100644 (file)
@@ -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.
  */
index 574e62472caf7a962ff6bc568e8cdbe06c06af22..58e557548b3a6c4e631d754bdea96ec83f79f998 100644 (file)
@@ -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)