VIGS: Support plane z-pos setting from user-space 54/16654/1
authorStanislav Vorobiov <s.vorobiov@samsung.com>
Tue, 18 Feb 2014 13:05:46 +0000 (17:05 +0400)
committerStanislav Vorobiov <s.vorobiov@samsung.com>
Thu, 20 Feb 2014 08:43:47 +0000 (12:43 +0400)
Change-Id: I72a60beac3dc23f23517f310d5bee59c6833b748

drivers/gpu/drm/vigs/vigs_driver.c
drivers/gpu/drm/vigs/vigs_plane.c
drivers/gpu/drm/vigs/vigs_plane.h
include/drm/vigs_drm.h

index 0c06d4386eb67bc6f7690eb19a0d663de8ad813e..342911e3dae2f5bd325d075098d39df222b64da0 100644 (file)
@@ -8,6 +8,7 @@
 #include "vigs_irq.h"
 #include "vigs_fence.h"
 #include "vigs_file.h"
+#include "vigs_plane.h"
 #include "vigs_mman.h"
 #include "drmP.h"
 #include "drm.h"
@@ -64,7 +65,9 @@ static struct drm_ioctl_desc vigs_drm_ioctls[] =
     DRM_IOCTL_DEF_DRV(VIGS_FENCE_SIGNALED, vigs_fence_signaled_ioctl,
                                            DRM_UNLOCKED | DRM_AUTH),
     DRM_IOCTL_DEF_DRV(VIGS_FENCE_UNREF, vigs_fence_unref_ioctl,
-                                        DRM_UNLOCKED | DRM_AUTH)
+                                        DRM_UNLOCKED | DRM_AUTH),
+    DRM_IOCTL_DEF_DRV(VIGS_PLANE_SET_ZPOS, vigs_plane_set_zpos_ioctl,
+                                           DRM_UNLOCKED | DRM_AUTH)
 };
 
 static const struct file_operations vigs_drm_driver_fops =
index d2c789d1d18c563fbc3bce7996f1842baea436a9..7d6aad7a3ce10c3d5fe51491f5fb56d1f8e07d81 100644 (file)
@@ -3,6 +3,7 @@
 #include "vigs_framebuffer.h"
 #include "vigs_surface.h"
 #include "vigs_comm.h"
+#include <drm/vigs_drm.h>
 
 static const uint32_t formats[] =
 {
@@ -165,3 +166,36 @@ int vigs_plane_init(struct vigs_device *vigs_dev, u32 index)
 
     return 0;
 }
+
+int vigs_plane_set_zpos_ioctl(struct drm_device *drm_dev,
+                              void *data,
+                              struct drm_file *file_priv)
+{
+    struct drm_vigs_plane_set_zpos *args = data;
+    struct drm_mode_object *obj;
+    struct drm_plane *plane;
+    struct vigs_plane *vigs_plane;
+    int ret;
+
+    mutex_lock(&drm_dev->mode_config.mutex);
+
+    obj = drm_mode_object_find(drm_dev,
+                               args->plane_id,
+                               DRM_MODE_OBJECT_PLANE);
+    if (!obj) {
+        ret = -EINVAL;
+        goto out;
+    }
+
+    plane = obj_to_plane(obj);
+    vigs_plane = plane_to_vigs_plane(plane);
+
+    vigs_plane->z_pos = args->zpos;
+
+    ret = 0;
+
+out:
+    mutex_unlock(&drm_dev->mode_config.mutex);
+
+    return ret;
+}
index 6b25089deb55119f2bf407d153921f88e051f798..bb9e90ed144668fae961b6fd53b489c052b42334 100644 (file)
@@ -33,4 +33,17 @@ static inline struct vigs_plane *plane_to_vigs_plane(struct drm_plane *plane)
 
 int vigs_plane_init(struct vigs_device *vigs_dev, u32 index);
 
+/*
+ * IOCTLs
+ * @{
+ */
+
+int vigs_plane_set_zpos_ioctl(struct drm_device *drm_dev,
+                              void *data,
+                              struct drm_file *file_priv);
+
+/*
+ * @}
+ */
+
 #endif
index 6c4d2d1f762aab9296bd7426e1c5916323030645..9211a17c11e26d00699124bedfd3db74cdaabd2e 100644 (file)
@@ -8,7 +8,7 @@
 /*
  * Bump this whenever driver interface changes.
  */
-#define DRM_VIGS_DRIVER_VERSION 11
+#define DRM_VIGS_DRIVER_VERSION 12
 
 /*
  * Surface access flags.
@@ -109,6 +109,12 @@ struct drm_vigs_fence_unref
     uint32_t handle;
 };
 
+struct drm_vigs_plane_set_zpos
+{
+    uint32_t plane_id;
+    int zpos;
+};
+
 #define DRM_VIGS_GET_PROTOCOL_VERSION 0x00
 #define DRM_VIGS_CREATE_SURFACE 0x01
 #define DRM_VIGS_CREATE_EXECBUFFER 0x02
@@ -123,6 +129,7 @@ struct drm_vigs_fence_unref
 #define DRM_VIGS_FENCE_WAIT 0x0B
 #define DRM_VIGS_FENCE_SIGNALED 0x0C
 #define DRM_VIGS_FENCE_UNREF 0x0D
+#define DRM_VIGS_PLANE_SET_ZPOS 0x0E
 
 #define DRM_IOCTL_VIGS_GET_PROTOCOL_VERSION DRM_IOR(DRM_COMMAND_BASE + \
             DRM_VIGS_GET_PROTOCOL_VERSION, struct drm_vigs_get_protocol_version)
@@ -152,5 +159,7 @@ struct drm_vigs_fence_unref
             DRM_VIGS_FENCE_SIGNALED, struct drm_vigs_fence_signaled)
 #define DRM_IOCTL_VIGS_FENCE_UNREF DRM_IOW(DRM_COMMAND_BASE + \
             DRM_VIGS_FENCE_UNREF, struct drm_vigs_fence_unref)
+#define DRM_IOCTL_VIGS_PLANE_SET_ZPOS DRM_IOW(DRM_COMMAND_BASE + \
+            DRM_VIGS_PLANE_SET_ZPOS, struct drm_vigs_plane_set_zpos)
 
 #endif