diff options
| author | Dave Airlie <airlied@redhat.com> | 2009-11-17 19:09:55 -0500 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2009-11-17 19:09:55 -0500 |
| commit | 46557bef3f3834ac33031c7be27d39d90d507442 (patch) | |
| tree | 5cfc4a9e1263fe0a15e516ca9695ee2f9b8899e4 /drivers/gpu/drm/i915/i915_suspend.c | |
| parent | 4efc50d697ed8d9a91f0005d922907a7b6c9290d (diff) | |
| parent | d91d8a3f88059d93e34ac70d059153ec69a9ffc7 (diff) | |
Merge branch 'drm-core-next' of ../linux-2.6 into drm-next
Diffstat (limited to 'drivers/gpu/drm/i915/i915_suspend.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_suspend.c | 457 |
1 files changed, 332 insertions, 125 deletions
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 20d4d19f5568..992d5617e798 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
| @@ -32,11 +32,15 @@ | |||
| 32 | static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe) | 32 | static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe) |
| 33 | { | 33 | { |
| 34 | struct drm_i915_private *dev_priv = dev->dev_private; | 34 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 35 | u32 dpll_reg; | ||
| 35 | 36 | ||
| 36 | if (pipe == PIPE_A) | 37 | if (IS_IGDNG(dev)) { |
| 37 | return (I915_READ(DPLL_A) & DPLL_VCO_ENABLE); | 38 | dpll_reg = (pipe == PIPE_A) ? PCH_DPLL_A: PCH_DPLL_B; |
| 38 | else | 39 | } else { |
| 39 | return (I915_READ(DPLL_B) & DPLL_VCO_ENABLE); | 40 | dpll_reg = (pipe == PIPE_A) ? DPLL_A: DPLL_B; |
| 41 | } | ||
| 42 | |||
| 43 | return (I915_READ(dpll_reg) & DPLL_VCO_ENABLE); | ||
| 40 | } | 44 | } |
| 41 | 45 | ||
| 42 | static void i915_save_palette(struct drm_device *dev, enum pipe pipe) | 46 | static void i915_save_palette(struct drm_device *dev, enum pipe pipe) |
| @@ -49,6 +53,9 @@ static void i915_save_palette(struct drm_device *dev, enum pipe pipe) | |||
| 49 | if (!i915_pipe_enabled(dev, pipe)) | 53 | if (!i915_pipe_enabled(dev, pipe)) |
| 50 | return; | 54 | return; |
| 51 | 55 | ||
| 56 | if (IS_IGDNG(dev)) | ||
| 57 | reg = (pipe == PIPE_A) ? LGC_PALETTE_A : LGC_PALETTE_B; | ||
| 58 | |||
| 52 | if (pipe == PIPE_A) | 59 | if (pipe == PIPE_A) |
| 53 | array = dev_priv->save_palette_a; | 60 | array = dev_priv->save_palette_a; |
| 54 | else | 61 | else |
| @@ -68,6 +75,9 @@ static void i915_restore_palette(struct drm_device *dev, enum pipe pipe) | |||
| 68 | if (!i915_pipe_enabled(dev, pipe)) | 75 | if (!i915_pipe_enabled(dev, pipe)) |
| 69 | return; | 76 | return; |
| 70 | 77 | ||
| 78 | if (IS_IGDNG(dev)) | ||
| 79 | reg = (pipe == PIPE_A) ? LGC_PALETTE_A : LGC_PALETTE_B; | ||
| 80 | |||
| 71 | if (pipe == PIPE_A) | 81 | if (pipe == PIPE_A) |
| 72 | array = dev_priv->save_palette_a; | 82 | array = dev_priv->save_palette_a; |
| 73 | else | 83 | else |
| @@ -228,13 +238,20 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
| 228 | 238 | ||
| 229 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | 239 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
| 230 | return; | 240 | return; |
| 241 | |||
| 231 | /* Pipe & plane A info */ | 242 | /* Pipe & plane A info */ |
| 232 | dev_priv->savePIPEACONF = I915_READ(PIPEACONF); | 243 | dev_priv->savePIPEACONF = I915_READ(PIPEACONF); |
| 233 | dev_priv->savePIPEASRC = I915_READ(PIPEASRC); | 244 | dev_priv->savePIPEASRC = I915_READ(PIPEASRC); |
| 234 | dev_priv->saveFPA0 = I915_READ(FPA0); | 245 | if (IS_IGDNG(dev)) { |
| 235 | dev_priv->saveFPA1 = I915_READ(FPA1); | 246 | dev_priv->saveFPA0 = I915_READ(PCH_FPA0); |
| 236 | dev_priv->saveDPLL_A = I915_READ(DPLL_A); | 247 | dev_priv->saveFPA1 = I915_READ(PCH_FPA1); |
| 237 | if (IS_I965G(dev)) | 248 | dev_priv->saveDPLL_A = I915_READ(PCH_DPLL_A); |
| 249 | } else { | ||
| 250 | dev_priv->saveFPA0 = I915_READ(FPA0); | ||
| 251 | dev_priv->saveFPA1 = I915_READ(FPA1); | ||
| 252 | dev_priv->saveDPLL_A = I915_READ(DPLL_A); | ||
| 253 | } | ||
| 254 | if (IS_I965G(dev) && !IS_IGDNG(dev)) | ||
| 238 | dev_priv->saveDPLL_A_MD = I915_READ(DPLL_A_MD); | 255 | dev_priv->saveDPLL_A_MD = I915_READ(DPLL_A_MD); |
| 239 | dev_priv->saveHTOTAL_A = I915_READ(HTOTAL_A); | 256 | dev_priv->saveHTOTAL_A = I915_READ(HTOTAL_A); |
| 240 | dev_priv->saveHBLANK_A = I915_READ(HBLANK_A); | 257 | dev_priv->saveHBLANK_A = I915_READ(HBLANK_A); |
| @@ -242,7 +259,24 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
| 242 | dev_priv->saveVTOTAL_A = I915_READ(VTOTAL_A); | 259 | dev_priv->saveVTOTAL_A = I915_READ(VTOTAL_A); |
| 243 | dev_priv->saveVBLANK_A = I915_READ(VBLANK_A); | 260 | dev_priv->saveVBLANK_A = I915_READ(VBLANK_A); |
| 244 | dev_priv->saveVSYNC_A = I915_READ(VSYNC_A); | 261 | dev_priv->saveVSYNC_A = I915_READ(VSYNC_A); |
| 245 | dev_priv->saveBCLRPAT_A = I915_READ(BCLRPAT_A); | 262 | if (!IS_IGDNG(dev)) |
| 263 | dev_priv->saveBCLRPAT_A = I915_READ(BCLRPAT_A); | ||
| 264 | |||
| 265 | if (IS_IGDNG(dev)) { | ||
| 266 | dev_priv->saveFDI_TXA_CTL = I915_READ(FDI_TXA_CTL); | ||
| 267 | dev_priv->saveFDI_RXA_CTL = I915_READ(FDI_RXA_CTL); | ||
| 268 | |||
| 269 | dev_priv->savePFA_CTL_1 = I915_READ(PFA_CTL_1); | ||
| 270 | dev_priv->savePFA_WIN_SZ = I915_READ(PFA_WIN_SZ); | ||
| 271 | dev_priv->savePFA_WIN_POS = I915_READ(PFA_WIN_POS); | ||
| 272 | |||
| 273 | dev_priv->saveTRANS_HTOTAL_A = I915_READ(TRANS_HTOTAL_A); | ||
| 274 | dev_priv->saveTRANS_HBLANK_A = I915_READ(TRANS_HBLANK_A); | ||
| 275 | dev_priv->saveTRANS_HSYNC_A = I915_READ(TRANS_HSYNC_A); | ||
| 276 | dev_priv->saveTRANS_VTOTAL_A = I915_READ(TRANS_VTOTAL_A); | ||
| 277 | dev_priv->saveTRANS_VBLANK_A = I915_READ(TRANS_VBLANK_A); | ||
| 278 | dev_priv->saveTRANS_VSYNC_A = I915_READ(TRANS_VSYNC_A); | ||
| 279 | } | ||
| 246 | 280 | ||
| 247 | dev_priv->saveDSPACNTR = I915_READ(DSPACNTR); | 281 | dev_priv->saveDSPACNTR = I915_READ(DSPACNTR); |
| 248 | dev_priv->saveDSPASTRIDE = I915_READ(DSPASTRIDE); | 282 | dev_priv->saveDSPASTRIDE = I915_READ(DSPASTRIDE); |
| @@ -259,10 +293,16 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
| 259 | /* Pipe & plane B info */ | 293 | /* Pipe & plane B info */ |
| 260 | dev_priv->savePIPEBCONF = I915_READ(PIPEBCONF); | 294 | dev_priv->savePIPEBCONF = I915_READ(PIPEBCONF); |
| 261 | dev_priv->savePIPEBSRC = I915_READ(PIPEBSRC); | 295 | dev_priv->savePIPEBSRC = I915_READ(PIPEBSRC); |
| 262 | dev_priv->saveFPB0 = I915_READ(FPB0); | 296 | if (IS_IGDNG(dev)) { |
| 263 | dev_priv->saveFPB1 = I915_READ(FPB1); | 297 | dev_priv->saveFPB0 = I915_READ(PCH_FPB0); |
| 264 | dev_priv->saveDPLL_B = I915_READ(DPLL_B); | 298 | dev_priv->saveFPB1 = I915_READ(PCH_FPB1); |
| 265 | if (IS_I965G(dev)) | 299 | dev_priv->saveDPLL_B = I915_READ(PCH_DPLL_B); |
| 300 | } else { | ||
| 301 | dev_priv->saveFPB0 = I915_READ(FPB0); | ||
| 302 | dev_priv->saveFPB1 = I915_READ(FPB1); | ||
| 303 | dev_priv->saveDPLL_B = I915_READ(DPLL_B); | ||
| 304 | } | ||
| 305 | if (IS_I965G(dev) && !IS_IGDNG(dev)) | ||
| 266 | dev_priv->saveDPLL_B_MD = I915_READ(DPLL_B_MD); | 306 | dev_priv->saveDPLL_B_MD = I915_READ(DPLL_B_MD); |
| 267 | dev_priv->saveHTOTAL_B = I915_READ(HTOTAL_B); | 307 | dev_priv->saveHTOTAL_B = I915_READ(HTOTAL_B); |
| 268 | dev_priv->saveHBLANK_B = I915_READ(HBLANK_B); | 308 | dev_priv->saveHBLANK_B = I915_READ(HBLANK_B); |
| @@ -270,7 +310,24 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
| 270 | dev_priv->saveVTOTAL_B = I915_READ(VTOTAL_B); | 310 | dev_priv->saveVTOTAL_B = I915_READ(VTOTAL_B); |
| 271 | dev_priv->saveVBLANK_B = I915_READ(VBLANK_B); | 311 | dev_priv->saveVBLANK_B = I915_READ(VBLANK_B); |
| 272 | dev_priv->saveVSYNC_B = I915_READ(VSYNC_B); | 312 | dev_priv->saveVSYNC_B = I915_READ(VSYNC_B); |
| 273 | dev_priv->saveBCLRPAT_A = I915_READ(BCLRPAT_A); | 313 | if (!IS_IGDNG(dev)) |
| 314 | dev_priv->saveBCLRPAT_B = I915_READ(BCLRPAT_B); | ||
| 315 | |||
| 316 | if (IS_IGDNG(dev)) { | ||
| 317 | dev_priv->saveFDI_TXB_CTL = I915_READ(FDI_TXB_CTL); | ||
| 318 | dev_priv->saveFDI_RXB_CTL = I915_READ(FDI_RXB_CTL); | ||
| 319 | |||
| 320 | dev_priv->savePFB_CTL_1 = I915_READ(PFB_CTL_1); | ||
| 321 | dev_priv->savePFB_WIN_SZ = I915_READ(PFB_WIN_SZ); | ||
| 322 | dev_priv->savePFB_WIN_POS = I915_READ(PFB_WIN_POS); | ||
| 323 | |||
| 324 | dev_priv->saveTRANS_HTOTAL_B = I915_READ(TRANS_HTOTAL_B); | ||
| 325 | dev_priv->saveTRANS_HBLANK_B = I915_READ(TRANS_HBLANK_B); | ||
| 326 | dev_priv->saveTRANS_HSYNC_B = I915_READ(TRANS_HSYNC_B); | ||
| 327 | dev_priv->saveTRANS_VTOTAL_B = I915_READ(TRANS_VTOTAL_B); | ||
| 328 | dev_priv->saveTRANS_VBLANK_B = I915_READ(TRANS_VBLANK_B); | ||
| 329 | dev_priv->saveTRANS_VSYNC_B = I915_READ(TRANS_VSYNC_B); | ||
| 330 | } | ||
| 274 | 331 | ||
| 275 | dev_priv->saveDSPBCNTR = I915_READ(DSPBCNTR); | 332 | dev_priv->saveDSPBCNTR = I915_READ(DSPBCNTR); |
| 276 | dev_priv->saveDSPBSTRIDE = I915_READ(DSPBSTRIDE); | 333 | dev_priv->saveDSPBSTRIDE = I915_READ(DSPBSTRIDE); |
| @@ -285,26 +342,45 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
| 285 | dev_priv->savePIPEBSTAT = I915_READ(PIPEBSTAT); | 342 | dev_priv->savePIPEBSTAT = I915_READ(PIPEBSTAT); |
| 286 | return; | 343 | return; |
| 287 | } | 344 | } |
| 345 | |||
| 288 | static void i915_restore_modeset_reg(struct drm_device *dev) | 346 | static void i915_restore_modeset_reg(struct drm_device *dev) |
| 289 | { | 347 | { |
| 290 | struct drm_i915_private *dev_priv = dev->dev_private; | 348 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 349 | int dpll_a_reg, fpa0_reg, fpa1_reg; | ||
| 350 | int dpll_b_reg, fpb0_reg, fpb1_reg; | ||
| 291 | 351 | ||
| 292 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | 352 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
| 293 | return; | 353 | return; |
| 294 | 354 | ||
| 355 | if (IS_IGDNG(dev)) { | ||
| 356 | dpll_a_reg = PCH_DPLL_A; | ||
| 357 | dpll_b_reg = PCH_DPLL_B; | ||
| 358 | fpa0_reg = PCH_FPA0; | ||
| 359 | fpb0_reg = PCH_FPB0; | ||
| 360 | fpa1_reg = PCH_FPA1; | ||
| 361 | fpb1_reg = PCH_FPB1; | ||
| 362 | } else { | ||
| 363 | dpll_a_reg = DPLL_A; | ||
| 364 | dpll_b_reg = DPLL_B; | ||
| 365 | fpa0_reg = FPA0; | ||
| 366 | fpb0_reg = FPB0; | ||
| 367 | fpa1_reg = FPA1; | ||
| 368 | fpb1_reg = FPB1; | ||
| 369 | } | ||
| 370 | |||
| 295 | /* Pipe & plane A info */ | 371 | /* Pipe & plane A info */ |
| 296 | /* Prime the clock */ | 372 | /* Prime the clock */ |
| 297 | if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) { | 373 | if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) { |
| 298 | I915_WRITE(DPLL_A, dev_priv->saveDPLL_A & | 374 | I915_WRITE(dpll_a_reg, dev_priv->saveDPLL_A & |
| 299 | ~DPLL_VCO_ENABLE); | 375 | ~DPLL_VCO_ENABLE); |
| 300 | DRM_UDELAY(150); | 376 | DRM_UDELAY(150); |
| 301 | } | 377 | } |
| 302 | I915_WRITE(FPA0, dev_priv->saveFPA0); | 378 | I915_WRITE(fpa0_reg, dev_priv->saveFPA0); |
| 303 | I915_WRITE(FPA1, dev_priv->saveFPA1); | 379 | I915_WRITE(fpa1_reg, dev_priv->saveFPA1); |
| 304 | /* Actually enable it */ | 380 | /* Actually enable it */ |
| 305 | I915_WRITE(DPLL_A, dev_priv->saveDPLL_A); | 381 | I915_WRITE(dpll_a_reg, dev_priv->saveDPLL_A); |
| 306 | DRM_UDELAY(150); | 382 | DRM_UDELAY(150); |
| 307 | if (IS_I965G(dev)) | 383 | if (IS_I965G(dev) && !IS_IGDNG(dev)) |
| 308 | I915_WRITE(DPLL_A_MD, dev_priv->saveDPLL_A_MD); | 384 | I915_WRITE(DPLL_A_MD, dev_priv->saveDPLL_A_MD); |
| 309 | DRM_UDELAY(150); | 385 | DRM_UDELAY(150); |
| 310 | 386 | ||
| @@ -315,7 +391,24 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
| 315 | I915_WRITE(VTOTAL_A, dev_priv->saveVTOTAL_A); | 391 | I915_WRITE(VTOTAL_A, dev_priv->saveVTOTAL_A); |
| 316 | I915_WRITE(VBLANK_A, dev_priv->saveVBLANK_A); | 392 | I915_WRITE(VBLANK_A, dev_priv->saveVBLANK_A); |
| 317 | I915_WRITE(VSYNC_A, dev_priv->saveVSYNC_A); | 393 | I915_WRITE(VSYNC_A, dev_priv->saveVSYNC_A); |
| 318 | I915_WRITE(BCLRPAT_A, dev_priv->saveBCLRPAT_A); | 394 | if (!IS_IGDNG(dev)) |
| 395 | I915_WRITE(BCLRPAT_A, dev_priv->saveBCLRPAT_A); | ||
| 396 | |||
| 397 | if (IS_IGDNG(dev)) { | ||
| 398 | I915_WRITE(FDI_RXA_CTL, dev_priv->saveFDI_RXA_CTL); | ||
| 399 | I915_WRITE(FDI_TXA_CTL, dev_priv->saveFDI_TXA_CTL); | ||
| 400 | |||
| 401 | I915_WRITE(PFA_CTL_1, dev_priv->savePFA_CTL_1); | ||
| 402 | I915_WRITE(PFA_WIN_SZ, dev_priv->savePFA_WIN_SZ); | ||
| 403 | I915_WRITE(PFA_WIN_POS, dev_priv->savePFA_WIN_POS); | ||
| 404 | |||
| 405 | I915_WRITE(TRANS_HTOTAL_A, dev_priv->saveTRANS_HTOTAL_A); | ||
| 406 | I915_WRITE(TRANS_HBLANK_A, dev_priv->saveTRANS_HBLANK_A); | ||
| 407 | I915_WRITE(TRANS_HSYNC_A, dev_priv->saveTRANS_HSYNC_A); | ||
| 408 | I915_WRITE(TRANS_VTOTAL_A, dev_priv->saveTRANS_VTOTAL_A); | ||
| 409 | I915_WRITE(TRANS_VBLANK_A, dev_priv->saveTRANS_VBLANK_A); | ||
| 410 | I915_WRITE(TRANS_VSYNC_A, dev_priv->saveTRANS_VSYNC_A); | ||
| 411 | } | ||
| 319 | 412 | ||
| 320 | /* Restore plane info */ | 413 | /* Restore plane info */ |
| 321 | I915_WRITE(DSPASIZE, dev_priv->saveDSPASIZE); | 414 | I915_WRITE(DSPASIZE, dev_priv->saveDSPASIZE); |
| @@ -337,14 +430,14 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
| 337 | 430 | ||
| 338 | /* Pipe & plane B info */ | 431 | /* Pipe & plane B info */ |
| 339 | if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) { | 432 | if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) { |
| 340 | I915_WRITE(DPLL_B, dev_priv->saveDPLL_B & | 433 | I915_WRITE(dpll_b_reg, dev_priv->saveDPLL_B & |
| 341 | ~DPLL_VCO_ENABLE); | 434 | ~DPLL_VCO_ENABLE); |
| 342 | DRM_UDELAY(150); | 435 | DRM_UDELAY(150); |
| 343 | } | 436 | } |
| 344 | I915_WRITE(FPB0, dev_priv->saveFPB0); | 437 | I915_WRITE(fpb0_reg, dev_priv->saveFPB0); |
| 345 | I915_WRITE(FPB1, dev_priv->saveFPB1); | 438 | I915_WRITE(fpb1_reg, dev_priv->saveFPB1); |
| 346 | /* Actually enable it */ | 439 | /* Actually enable it */ |
| 347 | I915_WRITE(DPLL_B, dev_priv->saveDPLL_B); | 440 | I915_WRITE(dpll_b_reg, dev_priv->saveDPLL_B); |
| 348 | DRM_UDELAY(150); | 441 | DRM_UDELAY(150); |
| 349 | if (IS_I965G(dev)) | 442 | if (IS_I965G(dev)) |
| 350 | I915_WRITE(DPLL_B_MD, dev_priv->saveDPLL_B_MD); | 443 | I915_WRITE(DPLL_B_MD, dev_priv->saveDPLL_B_MD); |
| @@ -357,7 +450,24 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
| 357 | I915_WRITE(VTOTAL_B, dev_priv->saveVTOTAL_B); | 450 | I915_WRITE(VTOTAL_B, dev_priv->saveVTOTAL_B); |
| 358 | I915_WRITE(VBLANK_B, dev_priv->saveVBLANK_B); | 451 | I915_WRITE(VBLANK_B, dev_priv->saveVBLANK_B); |
| 359 | I915_WRITE(VSYNC_B, dev_priv->saveVSYNC_B); | 452 | I915_WRITE(VSYNC_B, dev_priv->saveVSYNC_B); |
| 360 | I915_WRITE(BCLRPAT_B, dev_priv->saveBCLRPAT_B); | 453 | if (!IS_IGDNG(dev)) |
| 454 | I915_WRITE(BCLRPAT_B, dev_priv->saveBCLRPAT_B); | ||
| 455 | |||
| 456 | if (IS_IGDNG(dev)) { | ||
| 457 | I915_WRITE(FDI_RXB_CTL, dev_priv->saveFDI_RXB_CTL); | ||
| 458 | I915_WRITE(FDI_TXB_CTL, dev_priv->saveFDI_TXB_CTL); | ||
| 459 | |||
| 460 | I915_WRITE(PFB_CTL_1, dev_priv->savePFB_CTL_1); | ||
| 461 | I915_WRITE(PFB_WIN_SZ, dev_priv->savePFB_WIN_SZ); | ||
| 462 | I915_WRITE(PFB_WIN_POS, dev_priv->savePFB_WIN_POS); | ||
| 463 | |||
| 464 | I915_WRITE(TRANS_HTOTAL_B, dev_priv->saveTRANS_HTOTAL_B); | ||
| 465 | I915_WRITE(TRANS_HBLANK_B, dev_priv->saveTRANS_HBLANK_B); | ||
| 466 | I915_WRITE(TRANS_HSYNC_B, dev_priv->saveTRANS_HSYNC_B); | ||
| 467 | I915_WRITE(TRANS_VTOTAL_B, dev_priv->saveTRANS_VTOTAL_B); | ||
| 468 | I915_WRITE(TRANS_VBLANK_B, dev_priv->saveTRANS_VBLANK_B); | ||
| 469 | I915_WRITE(TRANS_VSYNC_B, dev_priv->saveTRANS_VSYNC_B); | ||
| 470 | } | ||
| 361 | 471 | ||
| 362 | /* Restore plane info */ | 472 | /* Restore plane info */ |
| 363 | I915_WRITE(DSPBSIZE, dev_priv->saveDSPBSIZE); | 473 | I915_WRITE(DSPBSIZE, dev_priv->saveDSPBSIZE); |
| @@ -379,19 +489,10 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
| 379 | 489 | ||
| 380 | return; | 490 | return; |
| 381 | } | 491 | } |
| 382 | int i915_save_state(struct drm_device *dev) | 492 | |
| 493 | void i915_save_display(struct drm_device *dev) | ||
| 383 | { | 494 | { |
| 384 | struct drm_i915_private *dev_priv = dev->dev_private; | 495 | 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 | 496 | ||
| 396 | /* Display arbitration control */ | 497 | /* Display arbitration control */ |
| 397 | dev_priv->saveDSPARB = I915_READ(DSPARB); | 498 | dev_priv->saveDSPARB = I915_READ(DSPARB); |
| @@ -399,6 +500,7 @@ int i915_save_state(struct drm_device *dev) | |||
| 399 | /* This is only meaningful in non-KMS mode */ | 500 | /* This is only meaningful in non-KMS mode */ |
| 400 | /* Don't save them in KMS mode */ | 501 | /* Don't save them in KMS mode */ |
| 401 | i915_save_modeset_reg(dev); | 502 | i915_save_modeset_reg(dev); |
| 503 | |||
| 402 | /* Cursor state */ | 504 | /* Cursor state */ |
| 403 | dev_priv->saveCURACNTR = I915_READ(CURACNTR); | 505 | dev_priv->saveCURACNTR = I915_READ(CURACNTR); |
| 404 | dev_priv->saveCURAPOS = I915_READ(CURAPOS); | 506 | dev_priv->saveCURAPOS = I915_READ(CURAPOS); |
| @@ -410,21 +512,43 @@ int i915_save_state(struct drm_device *dev) | |||
| 410 | dev_priv->saveCURSIZE = I915_READ(CURSIZE); | 512 | dev_priv->saveCURSIZE = I915_READ(CURSIZE); |
| 411 | 513 | ||
| 412 | /* CRT state */ | 514 | /* CRT state */ |
| 413 | dev_priv->saveADPA = I915_READ(ADPA); | 515 | if (IS_IGDNG(dev)) { |
| 516 | dev_priv->saveADPA = I915_READ(PCH_ADPA); | ||
| 517 | } else { | ||
| 518 | dev_priv->saveADPA = I915_READ(ADPA); | ||
| 519 | } | ||
| 414 | 520 | ||
| 415 | /* LVDS state */ | 521 | /* LVDS state */ |
| 416 | dev_priv->savePP_CONTROL = I915_READ(PP_CONTROL); | 522 | if (IS_IGDNG(dev)) { |
| 417 | dev_priv->savePFIT_PGM_RATIOS = I915_READ(PFIT_PGM_RATIOS); | 523 | dev_priv->savePP_CONTROL = I915_READ(PCH_PP_CONTROL); |
| 418 | dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL); | 524 | dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_PCH_CTL1); |
| 419 | if (IS_I965G(dev)) | 525 | dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_PCH_CTL2); |
| 420 | dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_CTL2); | 526 | dev_priv->saveBLC_CPU_PWM_CTL = I915_READ(BLC_PWM_CPU_CTL); |
| 421 | if (IS_MOBILE(dev) && !IS_I830(dev)) | 527 | dev_priv->saveBLC_CPU_PWM_CTL2 = I915_READ(BLC_PWM_CPU_CTL2); |
| 422 | dev_priv->saveLVDS = I915_READ(LVDS); | 528 | dev_priv->saveLVDS = I915_READ(PCH_LVDS); |
| 423 | if (!IS_I830(dev) && !IS_845G(dev)) | 529 | } else { |
| 530 | dev_priv->savePP_CONTROL = I915_READ(PP_CONTROL); | ||
| 531 | dev_priv->savePFIT_PGM_RATIOS = I915_READ(PFIT_PGM_RATIOS); | ||
| 532 | dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL); | ||
| 533 | dev_priv->saveBLC_HIST_CTL = I915_READ(BLC_HIST_CTL); | ||
| 534 | if (IS_I965G(dev)) | ||
| 535 | dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_CTL2); | ||
| 536 | if (IS_MOBILE(dev) && !IS_I830(dev)) | ||
| 537 | dev_priv->saveLVDS = I915_READ(LVDS); | ||
| 538 | } | ||
| 539 | |||
| 540 | if (!IS_I830(dev) && !IS_845G(dev) && !IS_IGDNG(dev)) | ||
| 424 | dev_priv->savePFIT_CONTROL = I915_READ(PFIT_CONTROL); | 541 | dev_priv->savePFIT_CONTROL = I915_READ(PFIT_CONTROL); |
| 425 | dev_priv->savePP_ON_DELAYS = I915_READ(PP_ON_DELAYS); | 542 | |
| 426 | dev_priv->savePP_OFF_DELAYS = I915_READ(PP_OFF_DELAYS); | 543 | if (IS_IGDNG(dev)) { |
| 427 | dev_priv->savePP_DIVISOR = I915_READ(PP_DIVISOR); | 544 | dev_priv->savePP_ON_DELAYS = I915_READ(PCH_PP_ON_DELAYS); |
| 545 | dev_priv->savePP_OFF_DELAYS = I915_READ(PCH_PP_OFF_DELAYS); | ||
| 546 | dev_priv->savePP_DIVISOR = I915_READ(PCH_PP_DIVISOR); | ||
| 547 | } else { | ||
| 548 | dev_priv->savePP_ON_DELAYS = I915_READ(PP_ON_DELAYS); | ||
| 549 | dev_priv->savePP_OFF_DELAYS = I915_READ(PP_OFF_DELAYS); | ||
| 550 | dev_priv->savePP_DIVISOR = I915_READ(PP_DIVISOR); | ||
| 551 | } | ||
| 428 | 552 | ||
| 429 | /* Display Port state */ | 553 | /* Display Port state */ |
| 430 | if (SUPPORTS_INTEGRATED_DP(dev)) { | 554 | if (SUPPORTS_INTEGRATED_DP(dev)) { |
| @@ -443,25 +567,162 @@ int i915_save_state(struct drm_device *dev) | |||
| 443 | /* FIXME: save TV & SDVO state */ | 567 | /* FIXME: save TV & SDVO state */ |
| 444 | 568 | ||
| 445 | /* FBC state */ | 569 | /* FBC state */ |
| 446 | dev_priv->saveFBC_CFB_BASE = I915_READ(FBC_CFB_BASE); | 570 | if (IS_GM45(dev)) { |
| 447 | dev_priv->saveFBC_LL_BASE = I915_READ(FBC_LL_BASE); | 571 | dev_priv->saveDPFC_CB_BASE = I915_READ(DPFC_CB_BASE); |
| 448 | dev_priv->saveFBC_CONTROL2 = I915_READ(FBC_CONTROL2); | 572 | } else { |
| 449 | dev_priv->saveFBC_CONTROL = I915_READ(FBC_CONTROL); | 573 | dev_priv->saveFBC_CFB_BASE = I915_READ(FBC_CFB_BASE); |
| 450 | 574 | dev_priv->saveFBC_LL_BASE = I915_READ(FBC_LL_BASE); | |
| 451 | /* Interrupt state */ | 575 | dev_priv->saveFBC_CONTROL2 = I915_READ(FBC_CONTROL2); |
| 452 | dev_priv->saveIIR = I915_READ(IIR); | 576 | dev_priv->saveFBC_CONTROL = I915_READ(FBC_CONTROL); |
| 453 | dev_priv->saveIER = I915_READ(IER); | 577 | } |
| 454 | dev_priv->saveIMR = I915_READ(IMR); | ||
| 455 | 578 | ||
| 456 | /* VGA state */ | 579 | /* VGA state */ |
| 457 | dev_priv->saveVGA0 = I915_READ(VGA0); | 580 | dev_priv->saveVGA0 = I915_READ(VGA0); |
| 458 | dev_priv->saveVGA1 = I915_READ(VGA1); | 581 | dev_priv->saveVGA1 = I915_READ(VGA1); |
| 459 | dev_priv->saveVGA_PD = I915_READ(VGA_PD); | 582 | dev_priv->saveVGA_PD = I915_READ(VGA_PD); |
| 460 | dev_priv->saveVGACNTRL = I915_READ(VGACNTRL); | 583 | if (IS_IGDNG(dev)) |
| 584 | dev_priv->saveVGACNTRL = I915_READ(CPU_VGACNTRL); | ||
| 585 | else | ||
| 586 | dev_priv->saveVGACNTRL = I915_READ(VGACNTRL); | ||
| 587 | |||
| 588 | i915_save_vga(dev); | ||
| 589 | } | ||
| 590 | |||
| 591 | void i915_restore_display(struct drm_device *dev) | ||
| 592 | { | ||
| 593 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 594 | |||
| 595 | /* Display arbitration */ | ||
| 596 | I915_WRITE(DSPARB, dev_priv->saveDSPARB); | ||
| 597 | |||
| 598 | /* Display port ratios (must be done before clock is set) */ | ||
| 599 | if (SUPPORTS_INTEGRATED_DP(dev)) { | ||
| 600 | I915_WRITE(PIPEA_GMCH_DATA_M, dev_priv->savePIPEA_GMCH_DATA_M); | ||
| 601 | I915_WRITE(PIPEB_GMCH_DATA_M, dev_priv->savePIPEB_GMCH_DATA_M); | ||
| 602 | I915_WRITE(PIPEA_GMCH_DATA_N, dev_priv->savePIPEA_GMCH_DATA_N); | ||
| 603 | I915_WRITE(PIPEB_GMCH_DATA_N, dev_priv->savePIPEB_GMCH_DATA_N); | ||
| 604 | I915_WRITE(PIPEA_DP_LINK_M, dev_priv->savePIPEA_DP_LINK_M); | ||
| 605 | I915_WRITE(PIPEB_DP_LINK_M, dev_priv->savePIPEB_DP_LINK_M); | ||
| 606 | I915_WRITE(PIPEA_DP_LINK_N, dev_priv->savePIPEA_DP_LINK_N); | ||
| 607 | I915_WRITE(PIPEB_DP_LINK_N, dev_priv->savePIPEB_DP_LINK_N); | ||
| 608 | } | ||
| 609 | |||
| 610 | /* This is only meaningful in non-KMS mode */ | ||
| 611 | /* Don't restore them in KMS mode */ | ||
| 612 | i915_restore_modeset_reg(dev); | ||
| 613 | |||
| 614 | /* Cursor state */ | ||
| 615 | I915_WRITE(CURAPOS, dev_priv->saveCURAPOS); | ||
| 616 | I915_WRITE(CURACNTR, dev_priv->saveCURACNTR); | ||
| 617 | I915_WRITE(CURABASE, dev_priv->saveCURABASE); | ||
| 618 | I915_WRITE(CURBPOS, dev_priv->saveCURBPOS); | ||
| 619 | I915_WRITE(CURBCNTR, dev_priv->saveCURBCNTR); | ||
| 620 | I915_WRITE(CURBBASE, dev_priv->saveCURBBASE); | ||
| 621 | if (!IS_I9XX(dev)) | ||
| 622 | I915_WRITE(CURSIZE, dev_priv->saveCURSIZE); | ||
| 623 | |||
| 624 | /* CRT state */ | ||
| 625 | if (IS_IGDNG(dev)) | ||
| 626 | I915_WRITE(PCH_ADPA, dev_priv->saveADPA); | ||
| 627 | else | ||
| 628 | I915_WRITE(ADPA, dev_priv->saveADPA); | ||
| 629 | |||
| 630 | /* LVDS state */ | ||
| 631 | if (IS_I965G(dev) && !IS_IGDNG(dev)) | ||
| 632 | I915_WRITE(BLC_PWM_CTL2, dev_priv->saveBLC_PWM_CTL2); | ||
| 633 | |||
| 634 | if (IS_IGDNG(dev)) { | ||
| 635 | I915_WRITE(PCH_LVDS, dev_priv->saveLVDS); | ||
| 636 | } else if (IS_MOBILE(dev) && !IS_I830(dev)) | ||
| 637 | I915_WRITE(LVDS, dev_priv->saveLVDS); | ||
| 638 | |||
| 639 | if (!IS_I830(dev) && !IS_845G(dev) && !IS_IGDNG(dev)) | ||
| 640 | I915_WRITE(PFIT_CONTROL, dev_priv->savePFIT_CONTROL); | ||
| 641 | |||
| 642 | if (IS_IGDNG(dev)) { | ||
| 643 | I915_WRITE(BLC_PWM_PCH_CTL1, dev_priv->saveBLC_PWM_CTL); | ||
| 644 | I915_WRITE(BLC_PWM_PCH_CTL2, dev_priv->saveBLC_PWM_CTL2); | ||
| 645 | I915_WRITE(BLC_PWM_CPU_CTL, dev_priv->saveBLC_CPU_PWM_CTL); | ||
| 646 | I915_WRITE(BLC_PWM_CPU_CTL2, dev_priv->saveBLC_CPU_PWM_CTL2); | ||
| 647 | I915_WRITE(PCH_PP_ON_DELAYS, dev_priv->savePP_ON_DELAYS); | ||
| 648 | I915_WRITE(PCH_PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); | ||
| 649 | I915_WRITE(PCH_PP_DIVISOR, dev_priv->savePP_DIVISOR); | ||
| 650 | I915_WRITE(PCH_PP_CONTROL, dev_priv->savePP_CONTROL); | ||
| 651 | } else { | ||
| 652 | I915_WRITE(PFIT_PGM_RATIOS, dev_priv->savePFIT_PGM_RATIOS); | ||
| 653 | I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL); | ||
| 654 | I915_WRITE(BLC_HIST_CTL, dev_priv->saveBLC_HIST_CTL); | ||
| 655 | I915_WRITE(PP_ON_DELAYS, dev_priv->savePP_ON_DELAYS); | ||
| 656 | I915_WRITE(PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); | ||
| 657 | I915_WRITE(PP_DIVISOR, dev_priv->savePP_DIVISOR); | ||
| 658 | I915_WRITE(PP_CONTROL, dev_priv->savePP_CONTROL); | ||
| 659 | } | ||
| 660 | |||
| 661 | /* Display Port state */ | ||
| 662 | if (SUPPORTS_INTEGRATED_DP(dev)) { | ||
| 663 | I915_WRITE(DP_B, dev_priv->saveDP_B); | ||
| 664 | I915_WRITE(DP_C, dev_priv->saveDP_C); | ||
| 665 | I915_WRITE(DP_D, dev_priv->saveDP_D); | ||
| 666 | } | ||
| 667 | /* FIXME: restore TV & SDVO state */ | ||
| 668 | |||
| 669 | /* FBC info */ | ||
| 670 | if (IS_GM45(dev)) { | ||
| 671 | g4x_disable_fbc(dev); | ||
| 672 | I915_WRITE(DPFC_CB_BASE, dev_priv->saveDPFC_CB_BASE); | ||
| 673 | } else { | ||
| 674 | i8xx_disable_fbc(dev); | ||
| 675 | I915_WRITE(FBC_CFB_BASE, dev_priv->saveFBC_CFB_BASE); | ||
| 676 | I915_WRITE(FBC_LL_BASE, dev_priv->saveFBC_LL_BASE); | ||
| 677 | I915_WRITE(FBC_CONTROL2, dev_priv->saveFBC_CONTROL2); | ||
| 678 | I915_WRITE(FBC_CONTROL, dev_priv->saveFBC_CONTROL); | ||
| 679 | } | ||
| 680 | |||
| 681 | /* VGA state */ | ||
| 682 | if (IS_IGDNG(dev)) | ||
| 683 | I915_WRITE(CPU_VGACNTRL, dev_priv->saveVGACNTRL); | ||
| 684 | else | ||
| 685 | I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL); | ||
| 686 | I915_WRITE(VGA0, dev_priv->saveVGA0); | ||
| 687 | I915_WRITE(VGA1, dev_priv->saveVGA1); | ||
| 688 | I915_WRITE(VGA_PD, dev_priv->saveVGA_PD); | ||
| 689 | DRM_UDELAY(150); | ||
| 690 | |||
| 691 | i915_restore_vga(dev); | ||
| 692 | } | ||
| 693 | |||
| 694 | int i915_save_state(struct drm_device *dev) | ||
| 695 | { | ||
| 696 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 697 | int i; | ||
| 698 | |||
| 699 | pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB); | ||
| 700 | |||
| 701 | /* Render Standby */ | ||
| 702 | if (IS_I965G(dev) && IS_MOBILE(dev)) | ||
| 703 | dev_priv->saveRENDERSTANDBY = I915_READ(MCHBAR_RENDER_STANDBY); | ||
| 704 | |||
| 705 | /* Hardware status page */ | ||
| 706 | dev_priv->saveHWS = I915_READ(HWS_PGA); | ||
| 707 | |||
| 708 | i915_save_display(dev); | ||
| 709 | |||
| 710 | /* Interrupt state */ | ||
| 711 | if (IS_IGDNG(dev)) { | ||
| 712 | dev_priv->saveDEIER = I915_READ(DEIER); | ||
| 713 | dev_priv->saveDEIMR = I915_READ(DEIMR); | ||
| 714 | dev_priv->saveGTIER = I915_READ(GTIER); | ||
| 715 | dev_priv->saveGTIMR = I915_READ(GTIMR); | ||
| 716 | dev_priv->saveFDI_RXA_IMR = I915_READ(FDI_RXA_IMR); | ||
| 717 | dev_priv->saveFDI_RXB_IMR = I915_READ(FDI_RXB_IMR); | ||
| 718 | } else { | ||
| 719 | dev_priv->saveIER = I915_READ(IER); | ||
| 720 | dev_priv->saveIMR = I915_READ(IMR); | ||
| 721 | } | ||
| 461 | 722 | ||
| 462 | /* Clock gating state */ | 723 | /* Clock gating state */ |
| 463 | dev_priv->saveD_STATE = I915_READ(D_STATE); | 724 | dev_priv->saveD_STATE = I915_READ(D_STATE); |
| 464 | dev_priv->saveDSPCLK_GATE_D = I915_READ(DSPCLK_GATE_D); | 725 | dev_priv->saveDSPCLK_GATE_D = I915_READ(DSPCLK_GATE_D); /* Not sure about this */ |
| 465 | 726 | ||
| 466 | /* Cache mode state */ | 727 | /* Cache mode state */ |
| 467 | dev_priv->saveCACHE_MODE_0 = I915_READ(CACHE_MODE_0); | 728 | dev_priv->saveCACHE_MODE_0 = I915_READ(CACHE_MODE_0); |
| @@ -489,7 +750,6 @@ int i915_save_state(struct drm_device *dev) | |||
| 489 | for (i = 0; i < 8; i++) | 750 | for (i = 0; i < 8; i++) |
| 490 | dev_priv->saveFENCE[i+8] = I915_READ(FENCE_REG_945_8 + (i * 4)); | 751 | dev_priv->saveFENCE[i+8] = I915_READ(FENCE_REG_945_8 + (i * 4)); |
| 491 | } | 752 | } |
| 492 | i915_save_vga(dev); | ||
| 493 | 753 | ||
| 494 | return 0; | 754 | return 0; |
| 495 | } | 755 | } |
| @@ -508,9 +768,6 @@ int i915_restore_state(struct drm_device *dev) | |||
| 508 | /* Hardware status page */ | 768 | /* Hardware status page */ |
| 509 | I915_WRITE(HWS_PGA, dev_priv->saveHWS); | 769 | I915_WRITE(HWS_PGA, dev_priv->saveHWS); |
| 510 | 770 | ||
| 511 | /* Display arbitration */ | ||
| 512 | I915_WRITE(DSPARB, dev_priv->saveDSPARB); | ||
| 513 | |||
| 514 | /* Fences */ | 771 | /* Fences */ |
| 515 | if (IS_I965G(dev)) { | 772 | if (IS_I965G(dev)) { |
| 516 | for (i = 0; i < 16; i++) | 773 | for (i = 0; i < 16; i++) |
| @@ -522,69 +779,21 @@ int i915_restore_state(struct drm_device *dev) | |||
| 522 | for (i = 0; i < 8; i++) | 779 | for (i = 0; i < 8; i++) |
| 523 | I915_WRITE(FENCE_REG_945_8 + (i * 4), dev_priv->saveFENCE[i+8]); | 780 | I915_WRITE(FENCE_REG_945_8 + (i * 4), dev_priv->saveFENCE[i+8]); |
| 524 | } | 781 | } |
| 525 | |||
| 526 | /* Display port ratios (must be done before clock is set) */ | ||
| 527 | if (SUPPORTS_INTEGRATED_DP(dev)) { | ||
| 528 | I915_WRITE(PIPEA_GMCH_DATA_M, dev_priv->savePIPEA_GMCH_DATA_M); | ||
| 529 | I915_WRITE(PIPEB_GMCH_DATA_M, dev_priv->savePIPEB_GMCH_DATA_M); | ||
| 530 | I915_WRITE(PIPEA_GMCH_DATA_N, dev_priv->savePIPEA_GMCH_DATA_N); | ||
| 531 | I915_WRITE(PIPEB_GMCH_DATA_N, dev_priv->savePIPEB_GMCH_DATA_N); | ||
| 532 | I915_WRITE(PIPEA_DP_LINK_M, dev_priv->savePIPEA_DP_LINK_M); | ||
| 533 | I915_WRITE(PIPEB_DP_LINK_M, dev_priv->savePIPEB_DP_LINK_M); | ||
| 534 | I915_WRITE(PIPEA_DP_LINK_N, dev_priv->savePIPEA_DP_LINK_N); | ||
| 535 | I915_WRITE(PIPEB_DP_LINK_N, dev_priv->savePIPEB_DP_LINK_N); | ||
| 536 | } | ||
| 537 | /* This is only meaningful in non-KMS mode */ | ||
| 538 | /* Don't restore them in KMS mode */ | ||
| 539 | i915_restore_modeset_reg(dev); | ||
| 540 | /* Cursor state */ | ||
| 541 | I915_WRITE(CURAPOS, dev_priv->saveCURAPOS); | ||
| 542 | I915_WRITE(CURACNTR, dev_priv->saveCURACNTR); | ||
| 543 | I915_WRITE(CURABASE, dev_priv->saveCURABASE); | ||
| 544 | I915_WRITE(CURBPOS, dev_priv->saveCURBPOS); | ||
| 545 | I915_WRITE(CURBCNTR, dev_priv->saveCURBCNTR); | ||
| 546 | I915_WRITE(CURBBASE, dev_priv->saveCURBBASE); | ||
| 547 | if (!IS_I9XX(dev)) | ||
| 548 | I915_WRITE(CURSIZE, dev_priv->saveCURSIZE); | ||
| 549 | |||
| 550 | /* CRT state */ | ||
| 551 | I915_WRITE(ADPA, dev_priv->saveADPA); | ||
| 552 | 782 | ||
| 553 | /* LVDS state */ | 783 | i915_restore_display(dev); |
| 554 | if (IS_I965G(dev)) | ||
| 555 | I915_WRITE(BLC_PWM_CTL2, dev_priv->saveBLC_PWM_CTL2); | ||
| 556 | if (IS_MOBILE(dev) && !IS_I830(dev)) | ||
| 557 | I915_WRITE(LVDS, dev_priv->saveLVDS); | ||
| 558 | if (!IS_I830(dev) && !IS_845G(dev)) | ||
| 559 | I915_WRITE(PFIT_CONTROL, dev_priv->savePFIT_CONTROL); | ||
| 560 | |||
| 561 | I915_WRITE(PFIT_PGM_RATIOS, dev_priv->savePFIT_PGM_RATIOS); | ||
| 562 | I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL); | ||
| 563 | I915_WRITE(PP_ON_DELAYS, dev_priv->savePP_ON_DELAYS); | ||
| 564 | I915_WRITE(PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); | ||
| 565 | I915_WRITE(PP_DIVISOR, dev_priv->savePP_DIVISOR); | ||
| 566 | I915_WRITE(PP_CONTROL, dev_priv->savePP_CONTROL); | ||
| 567 | 784 | ||
| 568 | /* Display Port state */ | 785 | /* Interrupt state */ |
| 569 | if (SUPPORTS_INTEGRATED_DP(dev)) { | 786 | if (IS_IGDNG(dev)) { |
| 570 | I915_WRITE(DP_B, dev_priv->saveDP_B); | 787 | I915_WRITE(DEIER, dev_priv->saveDEIER); |
| 571 | I915_WRITE(DP_C, dev_priv->saveDP_C); | 788 | I915_WRITE(DEIMR, dev_priv->saveDEIMR); |
| 572 | I915_WRITE(DP_D, dev_priv->saveDP_D); | 789 | I915_WRITE(GTIER, dev_priv->saveGTIER); |
| 790 | I915_WRITE(GTIMR, dev_priv->saveGTIMR); | ||
| 791 | I915_WRITE(FDI_RXA_IMR, dev_priv->saveFDI_RXA_IMR); | ||
| 792 | I915_WRITE(FDI_RXB_IMR, dev_priv->saveFDI_RXB_IMR); | ||
| 793 | } else { | ||
| 794 | I915_WRITE (IER, dev_priv->saveIER); | ||
| 795 | I915_WRITE (IMR, dev_priv->saveIMR); | ||
| 573 | } | 796 | } |
| 574 | /* FIXME: restore TV & SDVO state */ | ||
| 575 | |||
| 576 | /* FBC info */ | ||
| 577 | I915_WRITE(FBC_CFB_BASE, dev_priv->saveFBC_CFB_BASE); | ||
| 578 | I915_WRITE(FBC_LL_BASE, dev_priv->saveFBC_LL_BASE); | ||
| 579 | I915_WRITE(FBC_CONTROL2, dev_priv->saveFBC_CONTROL2); | ||
| 580 | I915_WRITE(FBC_CONTROL, dev_priv->saveFBC_CONTROL); | ||
| 581 | |||
| 582 | /* VGA state */ | ||
| 583 | I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL); | ||
| 584 | I915_WRITE(VGA0, dev_priv->saveVGA0); | ||
| 585 | I915_WRITE(VGA1, dev_priv->saveVGA1); | ||
| 586 | I915_WRITE(VGA_PD, dev_priv->saveVGA_PD); | ||
| 587 | DRM_UDELAY(150); | ||
| 588 | 797 | ||
| 589 | /* Clock gating state */ | 798 | /* Clock gating state */ |
| 590 | I915_WRITE (D_STATE, dev_priv->saveD_STATE); | 799 | I915_WRITE (D_STATE, dev_priv->saveD_STATE); |
| @@ -603,8 +812,6 @@ int i915_restore_state(struct drm_device *dev) | |||
| 603 | for (i = 0; i < 3; i++) | 812 | for (i = 0; i < 3; i++) |
| 604 | I915_WRITE(SWF30 + (i << 2), dev_priv->saveSWF2[i]); | 813 | I915_WRITE(SWF30 + (i << 2), dev_priv->saveSWF2[i]); |
| 605 | 814 | ||
| 606 | i915_restore_vga(dev); | ||
| 607 | |||
| 608 | return 0; | 815 | return 0; |
| 609 | } | 816 | } |
| 610 | 817 | ||
