aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2008-11-03 02:08:44 -0500
committerDave Airlie <airlied@linux.ie>2008-11-11 02:42:19 -0500
commit881ee9889c8b98671c5491e43666bf5d4f78a180 (patch)
treec6b851fbea5d4cf485263f16e998a647ea37d5ba
parent3ad4f597058301c97f362e500a32f63f5c950a45 (diff)
i915: Save/restore MCHBAR_RENDER_STANDBY on GM965/GM45
This register is set by the 2D driver to prevent lockups, and so it needs to be preserved across suspend/resume too. This makes my X200s work. Signed-off-by: Keith Packard <keithp@keithp.com> Signed-off-by: Eric Anholt <eric@anholt.net> Signed-off-by: Dave Airlie <airlied@linux.ie>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h1
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h3
-rw-r--r--drivers/gpu/drm/i915/i915_suspend.c9
3 files changed, 13 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 572dcd0e3e0d..be56b0ba88c4 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -157,6 +157,7 @@ typedef struct drm_i915_private {
157 u32 saveDSPACNTR; 157 u32 saveDSPACNTR;
158 u32 saveDSPBCNTR; 158 u32 saveDSPBCNTR;
159 u32 saveDSPARB; 159 u32 saveDSPARB;
160 u32 saveRENDERSTANDBY;
160 u32 savePIPEACONF; 161 u32 savePIPEACONF;
161 u32 savePIPEBCONF; 162 u32 savePIPEBCONF;
162 u32 savePIPEASRC; 163 u32 savePIPEASRC;
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 5c2d9f206d05..0e476eba36e6 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -527,6 +527,9 @@
527#define C0DRB3 0x10206 527#define C0DRB3 0x10206
528#define C1DRB3 0x10606 528#define C1DRB3 0x10606
529 529
530/** GM965 GM45 render standby register */
531#define MCHBAR_RENDER_STANDBY 0x111B8
532
530/* 533/*
531 * Overlay regs 534 * Overlay regs
532 */ 535 */
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
index 603fe742ccd4..5ddc6e595c0c 100644
--- a/drivers/gpu/drm/i915/i915_suspend.c
+++ b/drivers/gpu/drm/i915/i915_suspend.c
@@ -240,6 +240,10 @@ int i915_save_state(struct drm_device *dev)
240 240
241 pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB); 241 pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB);
242 242
243 /* Render Standby */
244 if (IS_I965G(dev) && IS_MOBILE(dev))
245 dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY);
246
243 /* Display arbitration control */ 247 /* Display arbitration control */
244 dev_priv->saveDSPARB = I915_READ(DSPARB); 248 dev_priv->saveDSPARB = I915_READ(DSPARB);
245 249
@@ -365,6 +369,11 @@ int i915_restore_state(struct drm_device *dev)
365 369
366 pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB); 370 pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB);
367 371
372 /* Render Standby */
373 if (IS_I965G(dev) && IS_MOBILE(dev))
374 I915_WRITE(MCHBAR_RENDER_STANDBY, dev_priv->saveRENDERSTANDBY);
375
376 /* Display arbitration */
368 I915_WRITE(DSPARB, dev_priv->saveDSPARB); 377 I915_WRITE(DSPARB, dev_priv->saveDSPARB);
369 378
370 /* Pipe & plane A info */ 379 /* Pipe & plane A info */