drm/exynos: support drm_wait_vblank feature for VIDI
authorInki Dae <inki.dae@samsung.com>
Wed, 19 Sep 2012 02:02:43 +0000 (11:02 +0900)
committerInki Dae <inki.dae@samsung.com>
Thu, 4 Oct 2012 01:06:01 +0000 (10:06 +0900)
this patch adds drm_wait_vblank support to Virtual Display module
so user can use DRM_IOCT_WAIT_VBLANK ioctl with this patch.
for this, you should set _DRM_VBLANK_EXYNOS_VIDI flags to
vblwait->request.type

Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_vidi.c
include/drm/exynos_drm.h

index c95f7dedb8a08b3186f765503c63953434210efe..54b44159caf16bf7653e85a549abacf1a8b2581b 100644 (file)
@@ -56,6 +56,7 @@ struct vidi_context {
        unsigned int                    connected;
        bool                            vblank_on;
        bool                            suspended;
+       bool                            direct_vblank;
        struct work_struct              work;
        struct mutex                    lock;
 };
@@ -224,6 +225,15 @@ static int vidi_enable_vblank(struct device *dev)
        if (!test_and_set_bit(0, &ctx->irq_flags))
                ctx->vblank_on = true;
 
+       ctx->direct_vblank = true;
+
+       /*
+        * in case of page flip request, vidi_finish_pageflip function
+        * will not be called because direct_vblank is true and then
+        * that function will be called by overlay_ops->commit callback
+        */
+       schedule_work(&ctx->work);
+
        return 0;
 }
 
@@ -425,7 +435,17 @@ static void vidi_fake_vblank_handler(struct work_struct *work)
        /* refresh rate is about 50Hz. */
        usleep_range(16000, 20000);
 
-       drm_handle_vblank(subdrv->drm_dev, manager->pipe);
+       mutex_lock(&ctx->lock);
+
+       if (ctx->direct_vblank) {
+               drm_handle_vblank(subdrv->drm_dev, manager->pipe);
+               ctx->direct_vblank = false;
+               mutex_unlock(&ctx->lock);
+               return;
+       }
+
+       mutex_unlock(&ctx->lock);
+
        vidi_finish_pageflip(subdrv->drm_dev, manager->pipe);
 }
 
index c20b001815303a670347a3e1c6b2227ea0f53383..0d1c503042d55ee31df9bf413a74f9fb01113f68 100644 (file)
@@ -107,6 +107,16 @@ struct drm_exynos_vidi_connection {
        uint64_t edid;
 };
 
+/* Indicate Exynos specific vblank flags */
+enum e_drm_exynos_vblank {
+       /*
+        * this flags is used for Virtual Display module
+        * to use DRM_IOCTL_WAIT_VBLANK feature. for this,
+        * user should set this flag to vblwait->request.type
+        */
+       _DRM_VBLANK_EXYNOS_VIDI = 2,
+};
+
 /* memory type definitions. */
 enum e_drm_exynos_gem_mem_type {
        /* Physically Continuous memory and used as default. */