drm/exynos: make sure that hardware overlay for hdmi is disabled
authorInki Dae <inki.dae@samsung.com>
Fri, 17 Aug 2012 09:35:47 +0000 (18:35 +0900)
committerInki Dae <inki.dae@samsung.com>
Thu, 4 Oct 2012 01:06:00 +0000 (10:06 +0900)
the values set to registers will be updated into real registers
at vsync so dma operation could be malfunctioned when accessed
to memory after gem buffer was released. this patch makes sure
that hw overlay is disabled before the gem buffer is released.

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

index 3fdf0b65f47e6659b820d1fa343005b682e354b1..0584132dc60868470d94634de11cc0832916a8d8 100644 (file)
@@ -274,10 +274,21 @@ static void drm_mixer_disable(struct device *subdrv_dev, int zpos)
        ctx->enabled[win] = false;
 }
 
+static void drm_mixer_wait_for_vblank(struct device *subdrv_dev)
+{
+       struct drm_hdmi_context *ctx = to_context(subdrv_dev);
+
+       DRM_DEBUG_KMS("%s\n", __FILE__);
+
+       if (mixer_ops && mixer_ops->wait_for_vblank)
+               mixer_ops->wait_for_vblank(ctx->mixer_ctx->ctx);
+}
+
 static struct exynos_drm_overlay_ops drm_hdmi_overlay_ops = {
        .mode_set = drm_mixer_mode_set,
        .commit = drm_mixer_commit,
        .disable = drm_mixer_disable,
+       .wait_for_vblank = drm_mixer_wait_for_vblank,
 };
 
 static struct exynos_drm_manager hdmi_manager = {
index a91c42088e42f528d91d7216ac9e912e8a4c35ab..d9f9e9fcc2b667d943d1ac861e3190a27e349d51 100644 (file)
@@ -67,6 +67,7 @@ struct exynos_mixer_ops {
        void (*dpms)(void *ctx, int mode);
 
        /* overlay */
+       void (*wait_for_vblank)(void *ctx);
        void (*win_mode_set)(void *ctx, struct exynos_drm_overlay *overlay);
        void (*win_commit)(void *ctx, int zpos);
        void (*win_disable)(void *ctx, int zpos);
index 25b97d5e5fcb44679a331b8e8e5b1a9da7d7d3ca..8a43ee17039ec39da32f6f1f590651950484dab3 100644 (file)
@@ -726,6 +726,18 @@ static void mixer_dpms(void *ctx, int mode)
        }
 }
 
+static void mixer_wait_for_vblank(void *ctx)
+{
+       struct mixer_context *mixer_ctx = ctx;
+       struct mixer_resources *res = &mixer_ctx->mixer_res;
+       int ret;
+
+       ret = wait_for((mixer_reg_read(res, MXR_INT_STATUS) &
+                               MXR_INT_STATUS_VSYNC), 50);
+       if (ret < 0)
+               DRM_DEBUG_KMS("vblank wait timed out.\n");
+}
+
 static void mixer_win_mode_set(void *ctx,
                              struct exynos_drm_overlay *overlay)
 {
@@ -818,6 +830,7 @@ static struct exynos_mixer_ops mixer_ops = {
        .dpms                   = mixer_dpms,
 
        /* overlay */
+       .wait_for_vblank        = mixer_wait_for_vblank,
        .win_mode_set           = mixer_win_mode_set,
        .win_commit             = mixer_win_commit,
        .win_disable            = mixer_win_disable,