Rev 6937 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6937 | Rev 7144 | ||
---|---|---|---|
Line 282... | Line 282... | ||
282 | if (IS_BROADWELL(dev)) |
282 | if (IS_BROADWELL(dev)) |
283 | gen8_irq_power_well_post_enable(dev_priv, |
283 | gen8_irq_power_well_post_enable(dev_priv, |
284 | 1 << PIPE_C | 1 << PIPE_B); |
284 | 1 << PIPE_C | 1 << PIPE_B); |
285 | } |
285 | } |
Line -... | Line 286... | ||
- | 286 | ||
- | 287 | static void hsw_power_well_pre_disable(struct drm_i915_private *dev_priv) |
|
- | 288 | { |
|
- | 289 | if (IS_BROADWELL(dev_priv)) |
|
- | 290 | gen8_irq_power_well_pre_disable(dev_priv, |
|
- | 291 | 1 << PIPE_C | 1 << PIPE_B); |
|
- | 292 | } |
|
286 | 293 | ||
287 | static void skl_power_well_post_enable(struct drm_i915_private *dev_priv, |
294 | static void skl_power_well_post_enable(struct drm_i915_private *dev_priv, |
288 | struct i915_power_well *power_well) |
295 | struct i915_power_well *power_well) |
289 | { |
296 | { |
Line 307... | Line 314... | ||
307 | gen8_irq_power_well_post_enable(dev_priv, |
314 | gen8_irq_power_well_post_enable(dev_priv, |
308 | 1 << PIPE_C | 1 << PIPE_B); |
315 | 1 << PIPE_C | 1 << PIPE_B); |
309 | } |
316 | } |
310 | } |
317 | } |
Line -... | Line 318... | ||
- | 318 | ||
- | 319 | static void skl_power_well_pre_disable(struct drm_i915_private *dev_priv, |
|
- | 320 | struct i915_power_well *power_well) |
|
- | 321 | { |
|
- | 322 | if (power_well->data == SKL_DISP_PW_2) |
|
- | 323 | gen8_irq_power_well_pre_disable(dev_priv, |
|
- | 324 | 1 << PIPE_C | 1 << PIPE_B); |
|
- | 325 | } |
|
311 | 326 | ||
312 | static void hsw_set_power_well(struct drm_i915_private *dev_priv, |
327 | static void hsw_set_power_well(struct drm_i915_private *dev_priv, |
313 | struct i915_power_well *power_well, bool enable) |
328 | struct i915_power_well *power_well, bool enable) |
314 | { |
329 | { |
315 | bool is_enabled, enable_requested; |
330 | bool is_enabled, enable_requested; |
Line 332... | Line 347... | ||
332 | hsw_power_well_post_enable(dev_priv); |
347 | hsw_power_well_post_enable(dev_priv); |
333 | } |
348 | } |
Line 334... | Line 349... | ||
334 | 349 | ||
335 | } else { |
350 | } else { |
- | 351 | if (enable_requested) { |
|
336 | if (enable_requested) { |
352 | hsw_power_well_pre_disable(dev_priv); |
337 | I915_WRITE(HSW_PWR_WELL_DRIVER, 0); |
353 | I915_WRITE(HSW_PWR_WELL_DRIVER, 0); |
338 | POSTING_READ(HSW_PWR_WELL_DRIVER); |
354 | POSTING_READ(HSW_PWR_WELL_DRIVER); |
339 | DRM_DEBUG_KMS("Requesting to disable the power well\n"); |
355 | DRM_DEBUG_KMS("Requesting to disable the power well\n"); |
340 | } |
356 | } |
Line 454... | Line 470... | ||
454 | * set disable sequence was followed. |
470 | * set disable sequence was followed. |
455 | * 2] Check if display uninitialize sequence is initialized. |
471 | * 2] Check if display uninitialize sequence is initialized. |
456 | */ |
472 | */ |
457 | } |
473 | } |
Line 458... | Line 474... | ||
458 | 474 | ||
459 | static void gen9_set_dc_state_debugmask_memory_up( |
- | |
460 | struct drm_i915_private *dev_priv) |
475 | static void gen9_set_dc_state_debugmask(struct drm_i915_private *dev_priv) |
461 | { |
476 | { |
- | 477 | uint32_t val, mask; |
|
- | 478 | ||
- | 479 | mask = DC_STATE_DEBUG_MASK_MEMORY_UP; |
|
- | 480 | ||
- | 481 | if (IS_BROXTON(dev_priv)) |
|
Line 462... | Line 482... | ||
462 | uint32_t val; |
482 | mask |= DC_STATE_DEBUG_MASK_CORES; |
463 | 483 | ||
464 | /* The below bit doesn't need to be cleared ever afterwards */ |
484 | /* The below bit doesn't need to be cleared ever afterwards */ |
465 | val = I915_READ(DC_STATE_DEBUG); |
485 | val = I915_READ(DC_STATE_DEBUG); |
466 | if (!(val & DC_STATE_DEBUG_MASK_MEMORY_UP)) { |
486 | if ((val & mask) != mask) { |
467 | val |= DC_STATE_DEBUG_MASK_MEMORY_UP; |
487 | val |= mask; |
468 | I915_WRITE(DC_STATE_DEBUG, val); |
488 | I915_WRITE(DC_STATE_DEBUG, val); |
469 | POSTING_READ(DC_STATE_DEBUG); |
489 | POSTING_READ(DC_STATE_DEBUG); |
Line 523... | Line 543... | ||
523 | if (i915.enable_dc == 0) |
543 | if (i915.enable_dc == 0) |
524 | state = DC_STATE_DISABLE; |
544 | state = DC_STATE_DISABLE; |
525 | else if (i915.enable_dc == 1 && state > DC_STATE_EN_UPTO_DC5) |
545 | else if (i915.enable_dc == 1 && state > DC_STATE_EN_UPTO_DC5) |
526 | state = DC_STATE_EN_UPTO_DC5; |
546 | state = DC_STATE_EN_UPTO_DC5; |
Line 527... | Line -... | ||
527 | - | ||
528 | if (state & DC_STATE_EN_UPTO_DC5_DC6_MASK) |
- | |
529 | gen9_set_dc_state_debugmask_memory_up(dev_priv); |
- | |
530 | 547 | ||
531 | val = I915_READ(DC_STATE_EN); |
548 | val = I915_READ(DC_STATE_EN); |
532 | DRM_DEBUG_KMS("Setting DC state from %02x to %02x\n", |
549 | DRM_DEBUG_KMS("Setting DC state from %02x to %02x\n", |
Line 533... | Line 550... | ||
533 | val & mask, state); |
550 | val & mask, state); |
Line 575... | Line 592... | ||
575 | { |
592 | { |
576 | struct drm_device *dev = dev_priv->dev; |
593 | struct drm_device *dev = dev_priv->dev; |
577 | bool pg2_enabled = intel_display_power_well_is_enabled(dev_priv, |
594 | bool pg2_enabled = intel_display_power_well_is_enabled(dev_priv, |
578 | SKL_DISP_PW_2); |
595 | SKL_DISP_PW_2); |
Line -... | Line 596... | ||
- | 596 | ||
579 | 597 | WARN_ONCE(!IS_SKYLAKE(dev) && !IS_KABYLAKE(dev), |
|
580 | WARN_ONCE(!IS_SKYLAKE(dev), "Platform doesn't support DC5.\n"); |
598 | "Platform doesn't support DC5.\n"); |
581 | WARN_ONCE(!HAS_RUNTIME_PM(dev), "Runtime PM not enabled.\n"); |
599 | WARN_ONCE(!HAS_RUNTIME_PM(dev), "Runtime PM not enabled.\n"); |
Line 582... | Line 600... | ||
582 | WARN_ONCE(pg2_enabled, "PG2 not disabled to enable DC5.\n"); |
600 | WARN_ONCE(pg2_enabled, "PG2 not disabled to enable DC5.\n"); |
583 | 601 | ||
Line 611... | Line 629... | ||
611 | 629 | ||
612 | static void assert_can_enable_dc6(struct drm_i915_private *dev_priv) |
630 | static void assert_can_enable_dc6(struct drm_i915_private *dev_priv) |
613 | { |
631 | { |
Line -... | Line 632... | ||
- | 632 | struct drm_device *dev = dev_priv->dev; |
|
614 | struct drm_device *dev = dev_priv->dev; |
633 | |
615 | 634 | WARN_ONCE(!IS_SKYLAKE(dev) && !IS_KABYLAKE(dev), |
|
616 | WARN_ONCE(!IS_SKYLAKE(dev), "Platform doesn't support DC6.\n"); |
635 | "Platform doesn't support DC6.\n"); |
617 | WARN_ONCE(!HAS_RUNTIME_PM(dev), "Runtime PM not enabled.\n"); |
636 | WARN_ONCE(!HAS_RUNTIME_PM(dev), "Runtime PM not enabled.\n"); |
618 | WARN_ONCE(I915_READ(UTIL_PIN_CTL) & UTIL_PIN_ENABLE, |
637 | WARN_ONCE(I915_READ(UTIL_PIN_CTL) & UTIL_PIN_ENABLE, |
619 | "Backlight is not disabled.\n"); |
638 | "Backlight is not disabled.\n"); |
Line 638... | Line 657... | ||
638 | 657 | ||
639 | static void gen9_disable_dc5_dc6(struct drm_i915_private *dev_priv) |
658 | static void gen9_disable_dc5_dc6(struct drm_i915_private *dev_priv) |
640 | { |
659 | { |
Line -... | Line 660... | ||
- | 660 | assert_can_disable_dc5(dev_priv); |
|
641 | assert_can_disable_dc5(dev_priv); |
661 | |
642 | 662 | if ((IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) && |
|
Line 643... | Line 663... | ||
643 | if (IS_SKYLAKE(dev_priv) && i915.enable_dc != 0 && i915.enable_dc != 1) |
663 | i915.enable_dc != 0 && i915.enable_dc != 1) |
644 | assert_can_disable_dc6(dev_priv); |
664 | assert_can_disable_dc6(dev_priv); |
Line 666... | Line 686... | ||
666 | } |
686 | } |
Line 667... | Line 687... | ||
667 | 687 | ||
668 | static void skl_set_power_well(struct drm_i915_private *dev_priv, |
688 | static void skl_set_power_well(struct drm_i915_private *dev_priv, |
669 | struct i915_power_well *power_well, bool enable) |
689 | struct i915_power_well *power_well, bool enable) |
670 | { |
- | |
671 | struct drm_device *dev = dev_priv->dev; |
690 | { |
672 | uint32_t tmp, fuse_status; |
691 | uint32_t tmp, fuse_status; |
673 | uint32_t req_mask, state_mask; |
692 | uint32_t req_mask, state_mask; |
Line 674... | Line 693... | ||
674 | bool is_enabled, enable_requested, check_fuse_status = false; |
693 | bool is_enabled, enable_requested, check_fuse_status = false; |
Line 704... | Line 723... | ||
704 | req_mask = SKL_POWER_WELL_REQ(power_well->data); |
723 | req_mask = SKL_POWER_WELL_REQ(power_well->data); |
705 | enable_requested = tmp & req_mask; |
724 | enable_requested = tmp & req_mask; |
706 | state_mask = SKL_POWER_WELL_STATE(power_well->data); |
725 | state_mask = SKL_POWER_WELL_STATE(power_well->data); |
707 | is_enabled = tmp & state_mask; |
726 | is_enabled = tmp & state_mask; |
Line -... | Line 727... | ||
- | 727 | ||
- | 728 | if (!enable && enable_requested) |
|
- | 729 | skl_power_well_pre_disable(dev_priv, power_well); |
|
708 | 730 | ||
709 | if (enable) { |
731 | if (enable) { |
710 | if (!enable_requested) { |
732 | if (!enable_requested) { |
711 | WARN((tmp & state_mask) && |
733 | WARN((tmp & state_mask) && |
712 | !I915_READ(HSW_PWR_WELL_BIOS), |
734 | !I915_READ(HSW_PWR_WELL_BIOS), |
713 | "Invalid for power well status to be enabled, unless done by the BIOS, \ |
735 | "Invalid for power well status to be enabled, unless done by the BIOS, \ |
714 | when request is to disable!\n"); |
- | |
715 | if (power_well->data == SKL_DISP_PW_2) { |
- | |
716 | /* |
- | |
717 | * DDI buffer programming unnecessary during |
- | |
718 | * driver-load/resume as it's already done |
- | |
719 | * during modeset initialization then. It's |
- | |
720 | * also invalid here as encoder list is still |
- | |
721 | * uninitialized. |
- | |
722 | */ |
- | |
723 | if (!dev_priv->power_domains.initializing) |
- | |
724 | intel_prepare_ddi(dev); |
- | |
725 | } |
736 | when request is to disable!\n"); |
726 | I915_WRITE(HSW_PWR_WELL_DRIVER, tmp | req_mask); |
737 | I915_WRITE(HSW_PWR_WELL_DRIVER, tmp | req_mask); |
Line 727... | Line 738... | ||
727 | } |
738 | } |
728 | 739 | ||
Line 826... | Line 837... | ||
826 | } |
837 | } |
Line 827... | Line 838... | ||
827 | 838 | ||
828 | static void gen9_dc_off_power_well_disable(struct drm_i915_private *dev_priv, |
839 | static void gen9_dc_off_power_well_disable(struct drm_i915_private *dev_priv, |
829 | struct i915_power_well *power_well) |
840 | struct i915_power_well *power_well) |
- | 841 | { |
|
830 | { |
842 | if ((IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) && |
831 | if (IS_SKYLAKE(dev_priv) && i915.enable_dc != 0 && i915.enable_dc != 1) |
843 | i915.enable_dc != 0 && i915.enable_dc != 1) |
832 | skl_enable_dc6(dev_priv); |
844 | skl_enable_dc6(dev_priv); |
833 | else |
845 | else |
834 | gen9_enable_dc5(dev_priv); |
846 | gen9_enable_dc5(dev_priv); |
Line 838... | Line 850... | ||
838 | struct i915_power_well *power_well) |
850 | struct i915_power_well *power_well) |
839 | { |
851 | { |
840 | if (power_well->count > 0) { |
852 | if (power_well->count > 0) { |
841 | gen9_set_dc_state(dev_priv, DC_STATE_DISABLE); |
853 | gen9_set_dc_state(dev_priv, DC_STATE_DISABLE); |
842 | } else { |
854 | } else { |
843 | if (IS_SKYLAKE(dev_priv) && i915.enable_dc != 0 && |
855 | if ((IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) && |
- | 856 | i915.enable_dc != 0 && |
|
844 | i915.enable_dc != 1) |
857 | i915.enable_dc != 1) |
845 | gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC6); |
858 | gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC6); |
846 | else |
859 | else |
847 | gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC5); |
860 | gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC5); |
848 | } |
861 | } |
Line 991... | Line 1004... | ||
991 | { |
1004 | { |
992 | spin_lock_irq(&dev_priv->irq_lock); |
1005 | spin_lock_irq(&dev_priv->irq_lock); |
993 | valleyview_disable_display_irqs(dev_priv); |
1006 | valleyview_disable_display_irqs(dev_priv); |
994 | spin_unlock_irq(&dev_priv->irq_lock); |
1007 | spin_unlock_irq(&dev_priv->irq_lock); |
Line -... | Line 1008... | ||
- | 1008 | ||
- | 1009 | /* make sure we're done processing display irqs */ |
|
- | 1010 | synchronize_irq(dev_priv->dev->irq); |
|
995 | 1011 | ||
996 | vlv_power_sequencer_reset(dev_priv); |
1012 | vlv_power_sequencer_reset(dev_priv); |
Line 997... | Line 1013... | ||
997 | } |
1013 | } |
998 | 1014 | ||
Line 1939... | Line 1955... | ||
1939 | 1955 | ||
1940 | void skl_pw1_misc_io_init(struct drm_i915_private *dev_priv) |
1956 | void skl_pw1_misc_io_init(struct drm_i915_private *dev_priv) |
1941 | { |
1957 | { |
Line 1942... | Line 1958... | ||
1942 | struct i915_power_well *well; |
1958 | struct i915_power_well *well; |
1943 | 1959 | ||
Line 1944... | Line 1960... | ||
1944 | if (!IS_SKYLAKE(dev_priv)) |
1960 | if (!(IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))) |
1945 | return; |
1961 | return; |
Line 1953... | Line 1969... | ||
1953 | 1969 | ||
1954 | void skl_pw1_misc_io_fini(struct drm_i915_private *dev_priv) |
1970 | void skl_pw1_misc_io_fini(struct drm_i915_private *dev_priv) |
1955 | { |
1971 | { |
Line 1956... | Line 1972... | ||
1956 | struct i915_power_well *well; |
1972 | struct i915_power_well *well; |
1957 | 1973 | ||
Line 1958... | Line 1974... | ||
1958 | if (!IS_SKYLAKE(dev_priv)) |
1974 | if (!(IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))) |
1959 | return; |
1975 | return; |
Line 2123... | Line 2139... | ||
2123 | if (!resume) |
2139 | if (!resume) |
2124 | return; |
2140 | return; |
Line 2125... | Line 2141... | ||
2125 | 2141 | ||
Line 2126... | Line 2142... | ||
2126 | skl_init_cdclk(dev_priv); |
2142 | skl_init_cdclk(dev_priv); |
2127 | 2143 | ||
2128 | if (dev_priv->csr.dmc_payload) |
2144 | if (dev_priv->csr.dmc_payload && intel_csr_load_program(dev_priv)) |
Line 2129... | Line 2145... | ||
2129 | intel_csr_load_program(dev_priv); |
2145 | gen9_set_dc_state_debugmask(dev_priv); |
2130 | } |
2146 | } |
2131 | 2147 |