diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_suspend.c | 24 |
2 files changed, 25 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index df08eb4240b6..b47af07f3918 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -283,6 +283,7 @@ typedef struct drm_i915_private { | |||
| 283 | u8 saveAR[21]; | 283 | u8 saveAR[21]; |
| 284 | u8 saveDACMASK; | 284 | u8 saveDACMASK; |
| 285 | u8 saveCR[37]; | 285 | u8 saveCR[37]; |
| 286 | uint64_t saveFENCE[16]; | ||
| 286 | 287 | ||
| 287 | struct { | 288 | struct { |
| 288 | struct drm_mm gtt_space; | 289 | struct drm_mm gtt_space; |
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index d669cc2b42c0..ce8a21344a71 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
| @@ -349,6 +349,18 @@ int i915_save_state(struct drm_device *dev) | |||
| 349 | for (i = 0; i < 3; i++) | 349 | for (i = 0; i < 3; i++) |
| 350 | dev_priv->saveSWF2[i] = I915_READ(SWF30 + (i << 2)); | 350 | dev_priv->saveSWF2[i] = I915_READ(SWF30 + (i << 2)); |
| 351 | 351 | ||
| 352 | /* Fences */ | ||
| 353 | if (IS_I965G(dev)) { | ||
| 354 | for (i = 0; i < 16; i++) | ||
| 355 | dev_priv->saveFENCE[i] = I915_READ64(FENCE_REG_965_0 + (i * 8)); | ||
| 356 | } else { | ||
| 357 | for (i = 0; i < 8; i++) | ||
| 358 | dev_priv->saveFENCE[i] = I915_READ(FENCE_REG_830_0 + (i * 4)); | ||
| 359 | |||
| 360 | if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) | ||
| 361 | for (i = 0; i < 8; i++) | ||
| 362 | dev_priv->saveFENCE[i+8] = I915_READ(FENCE_REG_945_8 + (i * 4)); | ||
| 363 | } | ||
| 352 | i915_save_vga(dev); | 364 | i915_save_vga(dev); |
| 353 | 365 | ||
| 354 | return 0; | 366 | return 0; |
| @@ -371,6 +383,18 @@ int i915_restore_state(struct drm_device *dev) | |||
| 371 | /* Display arbitration */ | 383 | /* Display arbitration */ |
| 372 | I915_WRITE(DSPARB, dev_priv->saveDSPARB); | 384 | I915_WRITE(DSPARB, dev_priv->saveDSPARB); |
| 373 | 385 | ||
| 386 | /* Fences */ | ||
| 387 | if (IS_I965G(dev)) { | ||
| 388 | for (i = 0; i < 16; i++) | ||
| 389 | I915_WRITE64(FENCE_REG_965_0 + (i * 8), dev_priv->saveFENCE[i]); | ||
| 390 | } else { | ||
| 391 | for (i = 0; i < 8; i++) | ||
| 392 | I915_WRITE(FENCE_REG_830_0 + (i * 4), dev_priv->saveFENCE[i]); | ||
| 393 | if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) | ||
| 394 | for (i = 0; i < 8; i++) | ||
| 395 | I915_WRITE(FENCE_REG_945_8 + (i * 4), dev_priv->saveFENCE[i+8]); | ||
| 396 | } | ||
| 397 | |||
| 374 | /* Pipe & plane A info */ | 398 | /* Pipe & plane A info */ |
| 375 | /* Prime the clock */ | 399 | /* Prime the clock */ |
| 376 | if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) { | 400 | if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) { |
