diff options
| author | Zhenyu Wang <zhenyuw@linux.intel.com> | 2009-11-05 21:13:02 -0500 |
|---|---|---|
| committer | Eric Anholt <eric@anholt.net> | 2009-11-12 14:21:14 -0500 |
| commit | 5586c8bc93ac5fe75f5fd14e8c7add5344d1c548 (patch) | |
| tree | bec847e7cc496e9449750d7e2ed207286fb09e7d | |
| parent | 2d109a845dd3074885db726892c629ab73dd0ed8 (diff) | |
drm/i915: Add more registers save/restore for Ironlake suspend
Add more display registers save/restore to fix unstable issues
during S4 testing on Ironlake. And DPLL_B_MD should not be restored
on Ironlake.
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_suspend.c | 36 |
2 files changed, 47 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 57204e298975..a725f6591192 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -296,6 +296,7 @@ typedef struct drm_i915_private { | |||
| 296 | u32 saveVBLANK_A; | 296 | u32 saveVBLANK_A; |
| 297 | u32 saveVSYNC_A; | 297 | u32 saveVSYNC_A; |
| 298 | u32 saveBCLRPAT_A; | 298 | u32 saveBCLRPAT_A; |
| 299 | u32 saveTRANSACONF; | ||
| 299 | u32 saveTRANS_HTOTAL_A; | 300 | u32 saveTRANS_HTOTAL_A; |
| 300 | u32 saveTRANS_HBLANK_A; | 301 | u32 saveTRANS_HBLANK_A; |
| 301 | u32 saveTRANS_HSYNC_A; | 302 | u32 saveTRANS_HSYNC_A; |
| @@ -326,6 +327,7 @@ typedef struct drm_i915_private { | |||
| 326 | u32 saveVBLANK_B; | 327 | u32 saveVBLANK_B; |
| 327 | u32 saveVSYNC_B; | 328 | u32 saveVSYNC_B; |
| 328 | u32 saveBCLRPAT_B; | 329 | u32 saveBCLRPAT_B; |
| 330 | u32 saveTRANSBCONF; | ||
| 329 | u32 saveTRANS_HTOTAL_B; | 331 | u32 saveTRANS_HTOTAL_B; |
| 330 | u32 saveTRANS_HBLANK_B; | 332 | u32 saveTRANS_HBLANK_B; |
| 331 | u32 saveTRANS_HSYNC_B; | 333 | u32 saveTRANS_HSYNC_B; |
| @@ -414,6 +416,16 @@ typedef struct drm_i915_private { | |||
| 414 | u32 savePFB_WIN_SZ; | 416 | u32 savePFB_WIN_SZ; |
| 415 | u32 savePFA_WIN_POS; | 417 | u32 savePFA_WIN_POS; |
| 416 | u32 savePFB_WIN_POS; | 418 | u32 savePFB_WIN_POS; |
| 419 | u32 savePCH_DREF_CONTROL; | ||
| 420 | u32 saveDISP_ARB_CTL; | ||
| 421 | u32 savePIPEA_DATA_M1; | ||
| 422 | u32 savePIPEA_DATA_N1; | ||
| 423 | u32 savePIPEA_LINK_M1; | ||
| 424 | u32 savePIPEA_LINK_N1; | ||
| 425 | u32 savePIPEB_DATA_M1; | ||
| 426 | u32 savePIPEB_DATA_N1; | ||
| 427 | u32 savePIPEB_LINK_M1; | ||
| 428 | u32 savePIPEB_LINK_N1; | ||
| 417 | 429 | ||
| 418 | struct { | 430 | struct { |
| 419 | struct drm_mm gtt_space; | 431 | struct drm_mm gtt_space; |
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 992d5617e798..6eec8171a44e 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
| @@ -239,6 +239,11 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
| 239 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | 239 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
| 240 | return; | 240 | return; |
| 241 | 241 | ||
| 242 | if (IS_IGDNG(dev)) { | ||
| 243 | dev_priv->savePCH_DREF_CONTROL = I915_READ(PCH_DREF_CONTROL); | ||
| 244 | dev_priv->saveDISP_ARB_CTL = I915_READ(DISP_ARB_CTL); | ||
| 245 | } | ||
| 246 | |||
| 242 | /* Pipe & plane A info */ | 247 | /* Pipe & plane A info */ |
| 243 | dev_priv->savePIPEACONF = I915_READ(PIPEACONF); | 248 | dev_priv->savePIPEACONF = I915_READ(PIPEACONF); |
| 244 | dev_priv->savePIPEASRC = I915_READ(PIPEASRC); | 249 | dev_priv->savePIPEASRC = I915_READ(PIPEASRC); |
| @@ -263,6 +268,11 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
| 263 | dev_priv->saveBCLRPAT_A = I915_READ(BCLRPAT_A); | 268 | dev_priv->saveBCLRPAT_A = I915_READ(BCLRPAT_A); |
| 264 | 269 | ||
| 265 | if (IS_IGDNG(dev)) { | 270 | if (IS_IGDNG(dev)) { |
| 271 | dev_priv->savePIPEA_DATA_M1 = I915_READ(PIPEA_DATA_M1); | ||
| 272 | dev_priv->savePIPEA_DATA_N1 = I915_READ(PIPEA_DATA_N1); | ||
| 273 | dev_priv->savePIPEA_LINK_M1 = I915_READ(PIPEA_LINK_M1); | ||
| 274 | dev_priv->savePIPEA_LINK_N1 = I915_READ(PIPEA_LINK_N1); | ||
| 275 | |||
| 266 | dev_priv->saveFDI_TXA_CTL = I915_READ(FDI_TXA_CTL); | 276 | dev_priv->saveFDI_TXA_CTL = I915_READ(FDI_TXA_CTL); |
| 267 | dev_priv->saveFDI_RXA_CTL = I915_READ(FDI_RXA_CTL); | 277 | dev_priv->saveFDI_RXA_CTL = I915_READ(FDI_RXA_CTL); |
| 268 | 278 | ||
| @@ -270,6 +280,7 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
| 270 | dev_priv->savePFA_WIN_SZ = I915_READ(PFA_WIN_SZ); | 280 | dev_priv->savePFA_WIN_SZ = I915_READ(PFA_WIN_SZ); |
| 271 | dev_priv->savePFA_WIN_POS = I915_READ(PFA_WIN_POS); | 281 | dev_priv->savePFA_WIN_POS = I915_READ(PFA_WIN_POS); |
| 272 | 282 | ||
| 283 | dev_priv->saveTRANSACONF = I915_READ(TRANSACONF); | ||
| 273 | dev_priv->saveTRANS_HTOTAL_A = I915_READ(TRANS_HTOTAL_A); | 284 | dev_priv->saveTRANS_HTOTAL_A = I915_READ(TRANS_HTOTAL_A); |
| 274 | dev_priv->saveTRANS_HBLANK_A = I915_READ(TRANS_HBLANK_A); | 285 | dev_priv->saveTRANS_HBLANK_A = I915_READ(TRANS_HBLANK_A); |
| 275 | dev_priv->saveTRANS_HSYNC_A = I915_READ(TRANS_HSYNC_A); | 286 | dev_priv->saveTRANS_HSYNC_A = I915_READ(TRANS_HSYNC_A); |
| @@ -314,6 +325,11 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
| 314 | dev_priv->saveBCLRPAT_B = I915_READ(BCLRPAT_B); | 325 | dev_priv->saveBCLRPAT_B = I915_READ(BCLRPAT_B); |
| 315 | 326 | ||
| 316 | if (IS_IGDNG(dev)) { | 327 | if (IS_IGDNG(dev)) { |
| 328 | dev_priv->savePIPEB_DATA_M1 = I915_READ(PIPEB_DATA_M1); | ||
| 329 | dev_priv->savePIPEB_DATA_N1 = I915_READ(PIPEB_DATA_N1); | ||
| 330 | dev_priv->savePIPEB_LINK_M1 = I915_READ(PIPEB_LINK_M1); | ||
| 331 | dev_priv->savePIPEB_LINK_N1 = I915_READ(PIPEB_LINK_N1); | ||
| 332 | |||
| 317 | dev_priv->saveFDI_TXB_CTL = I915_READ(FDI_TXB_CTL); | 333 | dev_priv->saveFDI_TXB_CTL = I915_READ(FDI_TXB_CTL); |
| 318 | dev_priv->saveFDI_RXB_CTL = I915_READ(FDI_RXB_CTL); | 334 | dev_priv->saveFDI_RXB_CTL = I915_READ(FDI_RXB_CTL); |
| 319 | 335 | ||
| @@ -321,6 +337,7 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
| 321 | dev_priv->savePFB_WIN_SZ = I915_READ(PFB_WIN_SZ); | 337 | dev_priv->savePFB_WIN_SZ = I915_READ(PFB_WIN_SZ); |
| 322 | dev_priv->savePFB_WIN_POS = I915_READ(PFB_WIN_POS); | 338 | dev_priv->savePFB_WIN_POS = I915_READ(PFB_WIN_POS); |
| 323 | 339 | ||
| 340 | dev_priv->saveTRANSBCONF = I915_READ(TRANSBCONF); | ||
| 324 | dev_priv->saveTRANS_HTOTAL_B = I915_READ(TRANS_HTOTAL_B); | 341 | dev_priv->saveTRANS_HTOTAL_B = I915_READ(TRANS_HTOTAL_B); |
| 325 | dev_priv->saveTRANS_HBLANK_B = I915_READ(TRANS_HBLANK_B); | 342 | dev_priv->saveTRANS_HBLANK_B = I915_READ(TRANS_HBLANK_B); |
| 326 | dev_priv->saveTRANS_HSYNC_B = I915_READ(TRANS_HSYNC_B); | 343 | dev_priv->saveTRANS_HSYNC_B = I915_READ(TRANS_HSYNC_B); |
| @@ -368,6 +385,11 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
| 368 | fpb1_reg = FPB1; | 385 | fpb1_reg = FPB1; |
| 369 | } | 386 | } |
| 370 | 387 | ||
| 388 | if (IS_IGDNG(dev)) { | ||
| 389 | I915_WRITE(PCH_DREF_CONTROL, dev_priv->savePCH_DREF_CONTROL); | ||
| 390 | I915_WRITE(DISP_ARB_CTL, dev_priv->saveDISP_ARB_CTL); | ||
| 391 | } | ||
| 392 | |||
| 371 | /* Pipe & plane A info */ | 393 | /* Pipe & plane A info */ |
| 372 | /* Prime the clock */ | 394 | /* Prime the clock */ |
| 373 | if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) { | 395 | if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) { |
| @@ -395,6 +417,11 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
| 395 | I915_WRITE(BCLRPAT_A, dev_priv->saveBCLRPAT_A); | 417 | I915_WRITE(BCLRPAT_A, dev_priv->saveBCLRPAT_A); |
| 396 | 418 | ||
| 397 | if (IS_IGDNG(dev)) { | 419 | if (IS_IGDNG(dev)) { |
| 420 | I915_WRITE(PIPEA_DATA_M1, dev_priv->savePIPEA_DATA_M1); | ||
| 421 | I915_WRITE(PIPEA_DATA_N1, dev_priv->savePIPEA_DATA_N1); | ||
| 422 | I915_WRITE(PIPEA_LINK_M1, dev_priv->savePIPEA_LINK_M1); | ||
| 423 | I915_WRITE(PIPEA_LINK_N1, dev_priv->savePIPEA_LINK_N1); | ||
| 424 | |||
| 398 | I915_WRITE(FDI_RXA_CTL, dev_priv->saveFDI_RXA_CTL); | 425 | I915_WRITE(FDI_RXA_CTL, dev_priv->saveFDI_RXA_CTL); |
| 399 | I915_WRITE(FDI_TXA_CTL, dev_priv->saveFDI_TXA_CTL); | 426 | I915_WRITE(FDI_TXA_CTL, dev_priv->saveFDI_TXA_CTL); |
| 400 | 427 | ||
| @@ -402,6 +429,7 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
| 402 | I915_WRITE(PFA_WIN_SZ, dev_priv->savePFA_WIN_SZ); | 429 | I915_WRITE(PFA_WIN_SZ, dev_priv->savePFA_WIN_SZ); |
| 403 | I915_WRITE(PFA_WIN_POS, dev_priv->savePFA_WIN_POS); | 430 | I915_WRITE(PFA_WIN_POS, dev_priv->savePFA_WIN_POS); |
| 404 | 431 | ||
| 432 | I915_WRITE(TRANSACONF, dev_priv->saveTRANSACONF); | ||
| 405 | I915_WRITE(TRANS_HTOTAL_A, dev_priv->saveTRANS_HTOTAL_A); | 433 | I915_WRITE(TRANS_HTOTAL_A, dev_priv->saveTRANS_HTOTAL_A); |
| 406 | I915_WRITE(TRANS_HBLANK_A, dev_priv->saveTRANS_HBLANK_A); | 434 | I915_WRITE(TRANS_HBLANK_A, dev_priv->saveTRANS_HBLANK_A); |
| 407 | I915_WRITE(TRANS_HSYNC_A, dev_priv->saveTRANS_HSYNC_A); | 435 | I915_WRITE(TRANS_HSYNC_A, dev_priv->saveTRANS_HSYNC_A); |
| @@ -439,7 +467,7 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
| 439 | /* Actually enable it */ | 467 | /* Actually enable it */ |
| 440 | I915_WRITE(dpll_b_reg, dev_priv->saveDPLL_B); | 468 | I915_WRITE(dpll_b_reg, dev_priv->saveDPLL_B); |
| 441 | DRM_UDELAY(150); | 469 | DRM_UDELAY(150); |
| 442 | if (IS_I965G(dev)) | 470 | if (IS_I965G(dev) && !IS_IGDNG(dev)) |
| 443 | I915_WRITE(DPLL_B_MD, dev_priv->saveDPLL_B_MD); | 471 | I915_WRITE(DPLL_B_MD, dev_priv->saveDPLL_B_MD); |
| 444 | DRM_UDELAY(150); | 472 | DRM_UDELAY(150); |
| 445 | 473 | ||
| @@ -454,6 +482,11 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
| 454 | I915_WRITE(BCLRPAT_B, dev_priv->saveBCLRPAT_B); | 482 | I915_WRITE(BCLRPAT_B, dev_priv->saveBCLRPAT_B); |
| 455 | 483 | ||
| 456 | if (IS_IGDNG(dev)) { | 484 | if (IS_IGDNG(dev)) { |
| 485 | I915_WRITE(PIPEB_DATA_M1, dev_priv->savePIPEB_DATA_M1); | ||
| 486 | I915_WRITE(PIPEB_DATA_N1, dev_priv->savePIPEB_DATA_N1); | ||
| 487 | I915_WRITE(PIPEB_LINK_M1, dev_priv->savePIPEB_LINK_M1); | ||
| 488 | I915_WRITE(PIPEB_LINK_N1, dev_priv->savePIPEB_LINK_N1); | ||
| 489 | |||
| 457 | I915_WRITE(FDI_RXB_CTL, dev_priv->saveFDI_RXB_CTL); | 490 | I915_WRITE(FDI_RXB_CTL, dev_priv->saveFDI_RXB_CTL); |
| 458 | I915_WRITE(FDI_TXB_CTL, dev_priv->saveFDI_TXB_CTL); | 491 | I915_WRITE(FDI_TXB_CTL, dev_priv->saveFDI_TXB_CTL); |
| 459 | 492 | ||
| @@ -461,6 +494,7 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
| 461 | I915_WRITE(PFB_WIN_SZ, dev_priv->savePFB_WIN_SZ); | 494 | I915_WRITE(PFB_WIN_SZ, dev_priv->savePFB_WIN_SZ); |
| 462 | I915_WRITE(PFB_WIN_POS, dev_priv->savePFB_WIN_POS); | 495 | I915_WRITE(PFB_WIN_POS, dev_priv->savePFB_WIN_POS); |
| 463 | 496 | ||
| 497 | I915_WRITE(TRANSBCONF, dev_priv->saveTRANSBCONF); | ||
| 464 | I915_WRITE(TRANS_HTOTAL_B, dev_priv->saveTRANS_HTOTAL_B); | 498 | I915_WRITE(TRANS_HTOTAL_B, dev_priv->saveTRANS_HTOTAL_B); |
| 465 | I915_WRITE(TRANS_HBLANK_B, dev_priv->saveTRANS_HBLANK_B); | 499 | I915_WRITE(TRANS_HBLANK_B, dev_priv->saveTRANS_HBLANK_B); |
| 466 | I915_WRITE(TRANS_HSYNC_B, dev_priv->saveTRANS_HSYNC_B); | 500 | I915_WRITE(TRANS_HSYNC_B, dev_priv->saveTRANS_HSYNC_B); |
