diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_suspend.c | 221 |
1 files changed, 121 insertions, 100 deletions
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 8d8e083d14ab..9e1d16e5c3ea 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
| @@ -222,23 +222,12 @@ static void i915_restore_vga(struct drm_device *dev) | |||
| 222 | I915_WRITE8(VGA_DACMASK, dev_priv->saveDACMASK); | 222 | I915_WRITE8(VGA_DACMASK, dev_priv->saveDACMASK); |
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | int i915_save_state(struct drm_device *dev) | 225 | static void i915_save_modeset_reg(struct drm_device *dev) |
| 226 | { | 226 | { |
| 227 | struct drm_i915_private *dev_priv = dev->dev_private; | 227 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 228 | int i; | ||
| 229 | |||
| 230 | pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB); | ||
| 231 | |||
| 232 | /* Render Standby */ | ||
| 233 | if (IS_I965G(dev) && IS_MOBILE(dev)) | ||
| 234 | dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY); | ||
| 235 | |||
| 236 | /* Hardware status page */ | ||
| 237 | dev_priv->saveHWS = I915_READ(HWS_PGA); | ||
| 238 | |||
| 239 | /* Display arbitration control */ | ||
| 240 | dev_priv->saveDSPARB = I915_READ(DSPARB); | ||
| 241 | 228 | ||
| 229 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | ||
| 230 | return; | ||
| 242 | /* Pipe & plane A info */ | 231 | /* Pipe & plane A info */ |
| 243 | dev_priv->savePIPEACONF = I915_READ(PIPEACONF); | 232 | dev_priv->savePIPEACONF = I915_READ(PIPEACONF); |
| 244 | dev_priv->savePIPEASRC = I915_READ(PIPEASRC); | 233 | dev_priv->savePIPEASRC = I915_READ(PIPEASRC); |
| @@ -294,7 +283,122 @@ int i915_save_state(struct drm_device *dev) | |||
| 294 | } | 283 | } |
| 295 | i915_save_palette(dev, PIPE_B); | 284 | i915_save_palette(dev, PIPE_B); |
| 296 | dev_priv->savePIPEBSTAT = I915_READ(PIPEBSTAT); | 285 | dev_priv->savePIPEBSTAT = I915_READ(PIPEBSTAT); |
| 286 | return; | ||
| 287 | } | ||
| 288 | static void i915_restore_modeset_reg(struct drm_device *dev) | ||
| 289 | { | ||
| 290 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 291 | |||
| 292 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | ||
| 293 | return; | ||
| 294 | |||
| 295 | /* Pipe & plane A info */ | ||
| 296 | /* Prime the clock */ | ||
| 297 | if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) { | ||
| 298 | I915_WRITE(DPLL_A, dev_priv->saveDPLL_A & | ||
| 299 | ~DPLL_VCO_ENABLE); | ||
| 300 | DRM_UDELAY(150); | ||
| 301 | } | ||
| 302 | I915_WRITE(FPA0, dev_priv->saveFPA0); | ||
| 303 | I915_WRITE(FPA1, dev_priv->saveFPA1); | ||
| 304 | /* Actually enable it */ | ||
| 305 | I915_WRITE(DPLL_A, dev_priv->saveDPLL_A); | ||
| 306 | DRM_UDELAY(150); | ||
| 307 | if (IS_I965G(dev)) | ||
| 308 | I915_WRITE(DPLL_A_MD, dev_priv->saveDPLL_A_MD); | ||
| 309 | DRM_UDELAY(150); | ||
| 310 | |||
| 311 | /* Restore mode */ | ||
| 312 | I915_WRITE(HTOTAL_A, dev_priv->saveHTOTAL_A); | ||
| 313 | I915_WRITE(HBLANK_A, dev_priv->saveHBLANK_A); | ||
| 314 | I915_WRITE(HSYNC_A, dev_priv->saveHSYNC_A); | ||
| 315 | I915_WRITE(VTOTAL_A, dev_priv->saveVTOTAL_A); | ||
| 316 | I915_WRITE(VBLANK_A, dev_priv->saveVBLANK_A); | ||
| 317 | I915_WRITE(VSYNC_A, dev_priv->saveVSYNC_A); | ||
| 318 | I915_WRITE(BCLRPAT_A, dev_priv->saveBCLRPAT_A); | ||
| 319 | |||
| 320 | /* Restore plane info */ | ||
| 321 | I915_WRITE(DSPASIZE, dev_priv->saveDSPASIZE); | ||
| 322 | I915_WRITE(DSPAPOS, dev_priv->saveDSPAPOS); | ||
| 323 | I915_WRITE(PIPEASRC, dev_priv->savePIPEASRC); | ||
| 324 | I915_WRITE(DSPAADDR, dev_priv->saveDSPAADDR); | ||
| 325 | I915_WRITE(DSPASTRIDE, dev_priv->saveDSPASTRIDE); | ||
| 326 | if (IS_I965G(dev)) { | ||
| 327 | I915_WRITE(DSPASURF, dev_priv->saveDSPASURF); | ||
| 328 | I915_WRITE(DSPATILEOFF, dev_priv->saveDSPATILEOFF); | ||
| 329 | } | ||
| 330 | |||
| 331 | I915_WRITE(PIPEACONF, dev_priv->savePIPEACONF); | ||
| 332 | |||
| 333 | i915_restore_palette(dev, PIPE_A); | ||
| 334 | /* Enable the plane */ | ||
| 335 | I915_WRITE(DSPACNTR, dev_priv->saveDSPACNTR); | ||
| 336 | I915_WRITE(DSPAADDR, I915_READ(DSPAADDR)); | ||
| 337 | |||
| 338 | /* Pipe & plane B info */ | ||
| 339 | if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) { | ||
| 340 | I915_WRITE(DPLL_B, dev_priv->saveDPLL_B & | ||
| 341 | ~DPLL_VCO_ENABLE); | ||
| 342 | DRM_UDELAY(150); | ||
| 343 | } | ||
| 344 | I915_WRITE(FPB0, dev_priv->saveFPB0); | ||
| 345 | I915_WRITE(FPB1, dev_priv->saveFPB1); | ||
| 346 | /* Actually enable it */ | ||
| 347 | I915_WRITE(DPLL_B, dev_priv->saveDPLL_B); | ||
| 348 | DRM_UDELAY(150); | ||
| 349 | if (IS_I965G(dev)) | ||
| 350 | I915_WRITE(DPLL_B_MD, dev_priv->saveDPLL_B_MD); | ||
| 351 | DRM_UDELAY(150); | ||
| 352 | |||
| 353 | /* Restore mode */ | ||
| 354 | I915_WRITE(HTOTAL_B, dev_priv->saveHTOTAL_B); | ||
| 355 | I915_WRITE(HBLANK_B, dev_priv->saveHBLANK_B); | ||
| 356 | I915_WRITE(HSYNC_B, dev_priv->saveHSYNC_B); | ||
| 357 | I915_WRITE(VTOTAL_B, dev_priv->saveVTOTAL_B); | ||
| 358 | I915_WRITE(VBLANK_B, dev_priv->saveVBLANK_B); | ||
| 359 | I915_WRITE(VSYNC_B, dev_priv->saveVSYNC_B); | ||
| 360 | I915_WRITE(BCLRPAT_B, dev_priv->saveBCLRPAT_B); | ||
| 361 | |||
| 362 | /* Restore plane info */ | ||
| 363 | I915_WRITE(DSPBSIZE, dev_priv->saveDSPBSIZE); | ||
| 364 | I915_WRITE(DSPBPOS, dev_priv->saveDSPBPOS); | ||
| 365 | I915_WRITE(PIPEBSRC, dev_priv->savePIPEBSRC); | ||
| 366 | I915_WRITE(DSPBADDR, dev_priv->saveDSPBADDR); | ||
| 367 | I915_WRITE(DSPBSTRIDE, dev_priv->saveDSPBSTRIDE); | ||
| 368 | if (IS_I965G(dev)) { | ||
| 369 | I915_WRITE(DSPBSURF, dev_priv->saveDSPBSURF); | ||
| 370 | I915_WRITE(DSPBTILEOFF, dev_priv->saveDSPBTILEOFF); | ||
| 371 | } | ||
| 372 | |||
| 373 | I915_WRITE(PIPEBCONF, dev_priv->savePIPEBCONF); | ||
| 374 | |||
| 375 | i915_restore_palette(dev, PIPE_B); | ||
| 376 | /* Enable the plane */ | ||
| 377 | I915_WRITE(DSPBCNTR, dev_priv->saveDSPBCNTR); | ||
| 378 | I915_WRITE(DSPBADDR, I915_READ(DSPBADDR)); | ||
| 297 | 379 | ||
| 380 | return; | ||
| 381 | } | ||
| 382 | int i915_save_state(struct drm_device *dev) | ||
| 383 | { | ||
| 384 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 385 | int i; | ||
| 386 | |||
| 387 | pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB); | ||
| 388 | |||
| 389 | /* Render Standby */ | ||
| 390 | if (IS_I965G(dev) && IS_MOBILE(dev)) | ||
| 391 | dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY); | ||
| 392 | |||
| 393 | /* Hardware status page */ | ||
| 394 | dev_priv->saveHWS = I915_READ(HWS_PGA); | ||
| 395 | |||
| 396 | /* Display arbitration control */ | ||
| 397 | dev_priv->saveDSPARB = I915_READ(DSPARB); | ||
| 398 | |||
| 399 | /* This is only meaningful in non-KMS mode */ | ||
| 400 | /* Don't save them in KMS mode */ | ||
| 401 | i915_save_modeset_reg(dev); | ||
| 298 | /* Cursor state */ | 402 | /* Cursor state */ |
| 299 | dev_priv->saveCURACNTR = I915_READ(CURACNTR); | 403 | dev_priv->saveCURACNTR = I915_READ(CURACNTR); |
| 300 | dev_priv->saveCURAPOS = I915_READ(CURAPOS); | 404 | dev_priv->saveCURAPOS = I915_READ(CURAPOS); |
| @@ -430,92 +534,9 @@ int i915_restore_state(struct drm_device *dev) | |||
| 430 | I915_WRITE(PIPEA_DP_LINK_N, dev_priv->savePIPEA_DP_LINK_N); | 534 | I915_WRITE(PIPEA_DP_LINK_N, dev_priv->savePIPEA_DP_LINK_N); |
| 431 | I915_WRITE(PIPEB_DP_LINK_N, dev_priv->savePIPEB_DP_LINK_N); | 535 | I915_WRITE(PIPEB_DP_LINK_N, dev_priv->savePIPEB_DP_LINK_N); |
| 432 | } | 536 | } |
| 433 | 537 | /* This is only meaningful in non-KMS mode */ | |
| 434 | /* Pipe & plane A info */ | 538 | /* Don't restore them in KMS mode */ |
| 435 | /* Prime the clock */ | 539 | i915_restore_modeset_reg(dev); |
| 436 | if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) { | ||
| 437 | I915_WRITE(DPLL_A, dev_priv->saveDPLL_A & | ||
| 438 | ~DPLL_VCO_ENABLE); | ||
| 439 | DRM_UDELAY(150); | ||
| 440 | } | ||
| 441 | I915_WRITE(FPA0, dev_priv->saveFPA0); | ||
| 442 | I915_WRITE(FPA1, dev_priv->saveFPA1); | ||
| 443 | /* Actually enable it */ | ||
| 444 | I915_WRITE(DPLL_A, dev_priv->saveDPLL_A); | ||
| 445 | DRM_UDELAY(150); | ||
| 446 | if (IS_I965G(dev)) | ||
| 447 | I915_WRITE(DPLL_A_MD, dev_priv->saveDPLL_A_MD); | ||
| 448 | DRM_UDELAY(150); | ||
| 449 | |||
| 450 | /* Restore mode */ | ||
| 451 | I915_WRITE(HTOTAL_A, dev_priv->saveHTOTAL_A); | ||
| 452 | I915_WRITE(HBLANK_A, dev_priv->saveHBLANK_A); | ||
| 453 | I915_WRITE(HSYNC_A, dev_priv->saveHSYNC_A); | ||
| 454 | I915_WRITE(VTOTAL_A, dev_priv->saveVTOTAL_A); | ||
| 455 | I915_WRITE(VBLANK_A, dev_priv->saveVBLANK_A); | ||
| 456 | I915_WRITE(VSYNC_A, dev_priv->saveVSYNC_A); | ||
| 457 | I915_WRITE(BCLRPAT_A, dev_priv->saveBCLRPAT_A); | ||
| 458 | |||
| 459 | /* Restore plane info */ | ||
| 460 | I915_WRITE(DSPASIZE, dev_priv->saveDSPASIZE); | ||
| 461 | I915_WRITE(DSPAPOS, dev_priv->saveDSPAPOS); | ||
| 462 | I915_WRITE(PIPEASRC, dev_priv->savePIPEASRC); | ||
| 463 | I915_WRITE(DSPAADDR, dev_priv->saveDSPAADDR); | ||
| 464 | I915_WRITE(DSPASTRIDE, dev_priv->saveDSPASTRIDE); | ||
| 465 | if (IS_I965G(dev)) { | ||
| 466 | I915_WRITE(DSPASURF, dev_priv->saveDSPASURF); | ||
| 467 | I915_WRITE(DSPATILEOFF, dev_priv->saveDSPATILEOFF); | ||
| 468 | } | ||
| 469 | |||
| 470 | I915_WRITE(PIPEACONF, dev_priv->savePIPEACONF); | ||
| 471 | |||
| 472 | i915_restore_palette(dev, PIPE_A); | ||
| 473 | /* Enable the plane */ | ||
| 474 | I915_WRITE(DSPACNTR, dev_priv->saveDSPACNTR); | ||
| 475 | I915_WRITE(DSPAADDR, I915_READ(DSPAADDR)); | ||
| 476 | |||
| 477 | /* Pipe & plane B info */ | ||
| 478 | if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) { | ||
| 479 | I915_WRITE(DPLL_B, dev_priv->saveDPLL_B & | ||
| 480 | ~DPLL_VCO_ENABLE); | ||
| 481 | DRM_UDELAY(150); | ||
| 482 | } | ||
| 483 | I915_WRITE(FPB0, dev_priv->saveFPB0); | ||
| 484 | I915_WRITE(FPB1, dev_priv->saveFPB1); | ||
| 485 | /* Actually enable it */ | ||
| 486 | I915_WRITE(DPLL_B, dev_priv->saveDPLL_B); | ||
| 487 | DRM_UDELAY(150); | ||
| 488 | if (IS_I965G(dev)) | ||
| 489 | I915_WRITE(DPLL_B_MD, dev_priv->saveDPLL_B_MD); | ||
| 490 | DRM_UDELAY(150); | ||
| 491 | |||
| 492 | /* Restore mode */ | ||
| 493 | I915_WRITE(HTOTAL_B, dev_priv->saveHTOTAL_B); | ||
| 494 | I915_WRITE(HBLANK_B, dev_priv->saveHBLANK_B); | ||
| 495 | I915_WRITE(HSYNC_B, dev_priv->saveHSYNC_B); | ||
| 496 | I915_WRITE(VTOTAL_B, dev_priv->saveVTOTAL_B); | ||
| 497 | I915_WRITE(VBLANK_B, dev_priv->saveVBLANK_B); | ||
| 498 | I915_WRITE(VSYNC_B, dev_priv->saveVSYNC_B); | ||
| 499 | I915_WRITE(BCLRPAT_B, dev_priv->saveBCLRPAT_B); | ||
| 500 | |||
| 501 | /* Restore plane info */ | ||
| 502 | I915_WRITE(DSPBSIZE, dev_priv->saveDSPBSIZE); | ||
| 503 | I915_WRITE(DSPBPOS, dev_priv->saveDSPBPOS); | ||
| 504 | I915_WRITE(PIPEBSRC, dev_priv->savePIPEBSRC); | ||
| 505 | I915_WRITE(DSPBADDR, dev_priv->saveDSPBADDR); | ||
| 506 | I915_WRITE(DSPBSTRIDE, dev_priv->saveDSPBSTRIDE); | ||
| 507 | if (IS_I965G(dev)) { | ||
| 508 | I915_WRITE(DSPBSURF, dev_priv->saveDSPBSURF); | ||
| 509 | I915_WRITE(DSPBTILEOFF, dev_priv->saveDSPBTILEOFF); | ||
| 510 | } | ||
| 511 | |||
| 512 | I915_WRITE(PIPEBCONF, dev_priv->savePIPEBCONF); | ||
| 513 | |||
| 514 | i915_restore_palette(dev, PIPE_B); | ||
| 515 | /* Enable the plane */ | ||
| 516 | I915_WRITE(DSPBCNTR, dev_priv->saveDSPBCNTR); | ||
| 517 | I915_WRITE(DSPBADDR, I915_READ(DSPBADDR)); | ||
| 518 | |||
| 519 | /* Cursor state */ | 540 | /* Cursor state */ |
| 520 | I915_WRITE(CURAPOS, dev_priv->saveCURAPOS); | 541 | I915_WRITE(CURAPOS, dev_priv->saveCURAPOS); |
| 521 | I915_WRITE(CURACNTR, dev_priv->saveCURACNTR); | 542 | I915_WRITE(CURACNTR, dev_priv->saveCURACNTR); |
