[1/6] drm/i915: disable VGA plane reliably
diff mbox

Message ID 1248368433-3734-2-git-send-email-zhenyuw@linux.intel.com
State Accepted
Headers show

Commit Message

Zhenyu Wang July 23, 2009, 5 p.m. UTC
This does VGA disable like DDX driver. SR01 bit 5 should be set
before VGA plane disable through control register, otherwise we
might get random crash and lockups.

Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_display.c |   28 +++++++++++++++++++++++++---
 1 files changed, 25 insertions(+), 3 deletions(-)

Comments

Zhenyu Wang July 23, 2009, 1:35 p.m. UTC | #1
On 2009.07.24 01:00:28 +0800, Zhenyu Wang wrote:
> This does VGA disable like DDX driver. SR01 bit 5 should be set
> before VGA plane disable through control register, otherwise we
> might get random crash and lockups.
> 
> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
> ---
>  drivers/gpu/drm/i915/intel_display.c |   28 +++++++++++++++++++++++++---
>  1 files changed, 25 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index a58bfad..b06364e 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -998,6 +998,29 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
>  	return 0;
>  }
>  
> +/* Disable the VGA plane that we never use */
> +static void i915_disable_vga (struct drm_device *dev)
> +{
> +	struct drm_i915_private *dev_priv = dev->dev_private;
> +	u8 sr1;
> +	u32 vga_reg;
> +
> +	if (IS_IGDNG(dev))
> +		vga_reg = CPU_VGACNTRL;
> +	else
> +		vga_reg = VGACNTRL;
> +
> +	if (I915_READ(vga_reg) & VGA_DISP_DISABLE)
> +		return;
> +
> +	I915_WRITE8(VGA_SR_INDEX, 1);
> +	sr1 = I915_READ8(VGA_SR_DATA);
> +	I915_WRITE8(VGA_SR_DATA, sr1 | (1 << 5));
> +	udelay(100);
> +
> +	I915_WRITE(vga_reg, VGA_DISP_DISABLE);
> +}
> +
>  static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
>  {
>  	struct drm_device *dev = crtc->dev;
> @@ -1200,8 +1223,7 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
>  	case DRM_MODE_DPMS_OFF:
>  		DRM_DEBUG("crtc %d dpms off\n", pipe);
>  
> -		/* Disable the VGA plane that we never use */
> -		I915_WRITE(CPU_VGACNTRL, VGA_DISP_DISABLE);
> +		i915_disable_vga(dev);
>  
>  		/* Disable display plane */
>  		temp = I915_READ(dspcntr_reg);
> @@ -1342,7 +1364,7 @@ static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode)
>  		//intel_crtc_dpms_video(crtc, FALSE); TODO
>  
>  		/* Disable the VGA plane that we never use */
> -		I915_WRITE(VGACNTRL, VGA_DISP_DISABLE);
> +		i915_disable_vga(dev);
>  
>  		/* Disable display plane */
>  		temp = I915_READ(dspcntr_reg);
> -- 
> 1.6.3.3

ah, sorry, this one is also in my tree, seems dup with Ma ling's but
does care VGA mode disable on IGDNG.

Patch
diff mbox

diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index a58bfad..b06364e 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -998,6 +998,29 @@  intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
 	return 0;
 }
 
+/* Disable the VGA plane that we never use */
+static void i915_disable_vga (struct drm_device *dev)
+{
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	u8 sr1;
+	u32 vga_reg;
+
+	if (IS_IGDNG(dev))
+		vga_reg = CPU_VGACNTRL;
+	else
+		vga_reg = VGACNTRL;
+
+	if (I915_READ(vga_reg) & VGA_DISP_DISABLE)
+		return;
+
+	I915_WRITE8(VGA_SR_INDEX, 1);
+	sr1 = I915_READ8(VGA_SR_DATA);
+	I915_WRITE8(VGA_SR_DATA, sr1 | (1 << 5));
+	udelay(100);
+
+	I915_WRITE(vga_reg, VGA_DISP_DISABLE);
+}
+
 static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
 {
 	struct drm_device *dev = crtc->dev;
@@ -1200,8 +1223,7 @@  static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
 	case DRM_MODE_DPMS_OFF:
 		DRM_DEBUG("crtc %d dpms off\n", pipe);
 
-		/* Disable the VGA plane that we never use */
-		I915_WRITE(CPU_VGACNTRL, VGA_DISP_DISABLE);
+		i915_disable_vga(dev);
 
 		/* Disable display plane */
 		temp = I915_READ(dspcntr_reg);
@@ -1342,7 +1364,7 @@  static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode)
 		//intel_crtc_dpms_video(crtc, FALSE); TODO
 
 		/* Disable the VGA plane that we never use */
-		I915_WRITE(VGACNTRL, VGA_DISP_DISABLE);
+		i915_disable_vga(dev);
 
 		/* Disable display plane */
 		temp = I915_READ(dspcntr_reg);