Commit 291257cf authored by Inki Dae's avatar Inki Dae

drm/exynos: support drm_wait_vblank feature for VIDI

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: default avatarInki Dae <inki.dae@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
parent 32aeab17
...@@ -56,6 +56,7 @@ struct vidi_context { ...@@ -56,6 +56,7 @@ struct vidi_context {
unsigned int connected; unsigned int connected;
bool vblank_on; bool vblank_on;
bool suspended; bool suspended;
bool direct_vblank;
struct work_struct work; struct work_struct work;
struct mutex lock; struct mutex lock;
}; };
...@@ -224,6 +225,15 @@ static int vidi_enable_vblank(struct device *dev) ...@@ -224,6 +225,15 @@ static int vidi_enable_vblank(struct device *dev)
if (!test_and_set_bit(0, &ctx->irq_flags)) if (!test_and_set_bit(0, &ctx->irq_flags))
ctx->vblank_on = true; 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; return 0;
} }
...@@ -425,7 +435,17 @@ static void vidi_fake_vblank_handler(struct work_struct *work) ...@@ -425,7 +435,17 @@ static void vidi_fake_vblank_handler(struct work_struct *work)
/* refresh rate is about 50Hz. */ /* refresh rate is about 50Hz. */
usleep_range(16000, 20000); 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); vidi_finish_pageflip(subdrv->drm_dev, manager->pipe);
} }
......
...@@ -107,6 +107,16 @@ struct drm_exynos_vidi_connection { ...@@ -107,6 +107,16 @@ struct drm_exynos_vidi_connection {
uint64_t edid; 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. */ /* memory type definitions. */
enum e_drm_exynos_gem_mem_type { enum e_drm_exynos_gem_mem_type {
/* Physically Continuous memory and used as default. */ /* Physically Continuous memory and used as default. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment