GFX-Display: Avoid block in drm_wait_vblank().
authorJason Hu <jason.hu@intel.com>
Thu, 1 Mar 2012 06:39:38 +0000 (14:39 +0800)
committerbuildbot <buildbot@intel.com>
Wed, 7 Mar 2012 11:20:10 +0000 (03:20 -0800)
BZ: 25652

When PipeB is power gated, we won't enable pipeb vblank interrupt
and wait vblank.

Change-Id: I02fbb83debc74e75fa7cac444acac3cb3d643809
Signed-off-by: Jason Hu <jason.hu@intel.com>
Signed-off-by: Jackie Li <yaodong.li@intel.com>
Reviewed-on: http://android.intel.com:8080/37190
Reviewed-by: Zhu, Tianyang <tianyang.zhu@intel.com>
Reviewed-by: Ding, Haitao <haitao.ding@intel.com>
Tested-by: Ding, Haitao <haitao.ding@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/staging/mrst/drv/psb_drv.c

index fd93297..d8b2714 100644 (file)
@@ -2816,6 +2816,7 @@ static void overlay_wait_vblank(struct drm_device *dev,
        uint32_t ovadd_pipe;
        int pipe = 0;
        int retry;
+       uint32_t reg_val = 0;
 
        ovadd_pipe = ((ovadd >> 6) & 0x3);
 
@@ -2827,6 +2828,13 @@ static void overlay_wait_vblank(struct drm_device *dev,
        }
 
        /*
+        * this is ugly. but still need because we need protect the
+        * the vblank waiting from being interrupted by randomly mode
+        * setting & dpms from user space.
+        */
+       mutex_lock(&dev->mode_config.mutex);
+
+       /*
         * FIXME: don't enable vblank in this way.
         * Current vblank usages didn't follow the DRM framework.
         * drm_vblank_get()/drm_vblank_put() should be used to enable/disabe
@@ -2837,12 +2845,14 @@ static void overlay_wait_vblank(struct drm_device *dev,
         * util destroy swapchain. this will make drm_vblank_get() in
         * drm_wait_vblank useless since the refcount is not 0.
         */
-       mid_enable_pipe_event(dev_priv, pipe);
-       psb_enable_pipestat(dev_priv, pipe, PIPE_VBLANK_INTERRUPT_ENABLE);
-       dev_priv->b_is_in_idle = false;
-       dev_priv->dsr_idle_count = 0;
 
-       drm_wait_vblank(dev, (void *)&vblwait, file_priv);
+       if (!psb_enable_vblank(dev, pipe)) {
+               dev_priv->b_is_in_idle = false;
+               dev_priv->dsr_idle_count = 0;
+               drm_wait_vblank(dev, (void *)&vblwait, file_priv);
+       }
+
+       mutex_unlock(&dev->mode_config.mutex);
 }
 
 static int validate_overlay_register_buffer(struct drm_file *file_priv,