aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Barnes <jbarnes@virtuousgeek.org>2010-08-13 18:11:26 -0400
committerJesse Barnes <jbarnes@virtuousgeek.org>2010-08-18 16:21:45 -0400
commit9cce37f4855a30cc7c364edf18522282782f7ddc (patch)
tree62727f7142a8b4942895cb9f3cadd7b13b984d6d
parent7643a7fa16edf180d593f705f4fa5930c40e8d2d (diff)
drm/i915: fix VGA plane disable for Ironlake+
We need to use I/O port instructions to access VGA registers on Ironlake+, and it doesn't hurt on other platforms, so switch the VGA plane disable function over to using them. Move it to init time as well while we're at it, no need to repeatedly disable the VGA plane with every mode set and DPMS event. Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c55
1 files changed, 27 insertions, 28 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 149c18b7c375..fbe42f0a315d 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -29,6 +29,7 @@
29#include <linux/i2c.h> 29#include <linux/i2c.h>
30#include <linux/kernel.h> 30#include <linux/kernel.h>
31#include <linux/slab.h> 31#include <linux/slab.h>
32#include <linux/vgaarb.h>
32#include "drmP.h" 33#include "drmP.h"
33#include "intel_drv.h" 34#include "intel_drv.h"
34#include "i915_drm.h" 35#include "i915_drm.h"
@@ -1621,29 +1622,6 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
1621 return 0; 1622 return 0;
1622} 1623}
1623 1624
1624/* Disable the VGA plane that we never use */
1625static void i915_disable_vga (struct drm_device *dev)
1626{
1627 struct drm_i915_private *dev_priv = dev->dev_private;
1628 u8 sr1;
1629 u32 vga_reg;
1630
1631 if (HAS_PCH_SPLIT(dev))
1632 vga_reg = CPU_VGACNTRL;
1633 else
1634 vga_reg = VGACNTRL;
1635
1636 if (I915_READ(vga_reg) & VGA_DISP_DISABLE)
1637 return;
1638
1639 I915_WRITE8(VGA_SR_INDEX, 1);
1640 sr1 = I915_READ8(VGA_SR_DATA);
1641 I915_WRITE8(VGA_SR_DATA, sr1 | (1 << 5));
1642 udelay(100);
1643
1644 I915_WRITE(vga_reg, VGA_DISP_DISABLE);
1645}
1646
1647static void ironlake_disable_pll_edp (struct drm_crtc *crtc) 1625static void ironlake_disable_pll_edp (struct drm_crtc *crtc)
1648{ 1626{
1649 struct drm_device *dev = crtc->dev; 1627 struct drm_device *dev = crtc->dev;
@@ -2156,8 +2134,6 @@ static void ironlake_crtc_dpms(struct drm_crtc *crtc, int mode)
2156 dev_priv->display.disable_fbc) 2134 dev_priv->display.disable_fbc)
2157 dev_priv->display.disable_fbc(dev); 2135 dev_priv->display.disable_fbc(dev);
2158 2136
2159 i915_disable_vga(dev);
2160
2161 /* disable cpu pipe, disable after all planes disabled */ 2137 /* disable cpu pipe, disable after all planes disabled */
2162 temp = I915_READ(pipeconf_reg); 2138 temp = I915_READ(pipeconf_reg);
2163 if ((temp & PIPEACONF_ENABLE) != 0) { 2139 if ((temp & PIPEACONF_ENABLE) != 0) {
@@ -2391,9 +2367,6 @@ static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode)
2391 dev_priv->display.disable_fbc) 2367 dev_priv->display.disable_fbc)
2392 dev_priv->display.disable_fbc(dev); 2368 dev_priv->display.disable_fbc(dev);
2393 2369
2394 /* Disable the VGA plane that we never use */
2395 i915_disable_vga(dev);
2396
2397 /* Disable display plane */ 2370 /* Disable display plane */
2398 temp = I915_READ(dspcntr_reg); 2371 temp = I915_READ(dspcntr_reg);
2399 if ((temp & DISPLAY_PLANE_ENABLE) != 0) { 2372 if ((temp & DISPLAY_PLANE_ENABLE) != 0) {
@@ -6002,6 +5975,29 @@ static void intel_init_quirks(struct drm_device *dev)
6002 } 5975 }
6003} 5976}
6004 5977
5978/* Disable the VGA plane that we never use */
5979static void i915_disable_vga(struct drm_device *dev)
5980{
5981 struct drm_i915_private *dev_priv = dev->dev_private;
5982 u8 sr1;
5983 u32 vga_reg;
5984
5985 if (HAS_PCH_SPLIT(dev))
5986 vga_reg = CPU_VGACNTRL;
5987 else
5988 vga_reg = VGACNTRL;
5989
5990 vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO);
5991 outb(1, VGA_SR_INDEX);
5992 sr1 = inb(VGA_SR_DATA);
5993 outb(sr1 | 1<<5, VGA_SR_DATA);
5994 vga_put(dev->pdev, VGA_RSRC_LEGACY_IO);
5995 udelay(300);
5996
5997 I915_WRITE(vga_reg, VGA_DISP_DISABLE);
5998 POSTING_READ(vga_reg);
5999}
6000
6005void intel_modeset_init(struct drm_device *dev) 6001void intel_modeset_init(struct drm_device *dev)
6006{ 6002{
6007 struct drm_i915_private *dev_priv = dev->dev_private; 6003 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -6050,6 +6046,9 @@ void intel_modeset_init(struct drm_device *dev)
6050 6046
6051 intel_init_clock_gating(dev); 6047 intel_init_clock_gating(dev);
6052 6048
6049 /* Just disable it once at startup */
6050 i915_disable_vga(dev);
6051
6053 if (IS_IRONLAKE_M(dev)) { 6052 if (IS_IRONLAKE_M(dev)) {
6054 ironlake_enable_drps(dev); 6053 ironlake_enable_drps(dev);
6055 intel_init_emon(dev); 6054 intel_init_emon(dev);