diff options
author | Dave Airlie <airlied@redhat.com> | 2016-07-14 23:50:58 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-07-14 23:50:58 -0400 |
commit | ff37c05a996bb96eccc21f4fb1b32ba0e24f3443 (patch) | |
tree | c09b09b37521f2f8f3f7a9bb3b0a33a2b3bde1a1 /drivers/gpu/drm/i915/intel_psr.c | |
parent | 6c181c82106e12dced317e93a7a396cbb8c64f75 (diff) | |
parent | 0b2c0582f1570bfc95aa9ac1cd340a215d8e8335 (diff) |
Merge tag 'drm-intel-next-2016-07-11' of git://anongit.freedesktop.org/drm-intel into drm-next
- select igt testing depencies for CONFIG_DRM_I915_DEBUG (Chris)
- track outputs in crtc state and clean up all our ad-hoc connector/encoder
walking in modest code (Ville)
- demidlayer drm_device/drm_i915_private (Chris Wilson)
- thundering herd fix from Chris Wilson, with lots of help from Tvrtko Ursulin
- piles of assorted clean and fallout from the thundering herd fix
- documentation and more tuning for waitboosting (Chris)
- pooled EU support on bxt (Arun Siluvery)
- bxt support is no longer considered prelimary!
- ring/engine vfunc cleanup from Tvrtko
- introduce intel_wait_for_register helper (Chris)
- opregion updates (Jani Nukla)
- tuning and fixes for wait_for macros (Tvrkto&Imre)
- more kabylake pci ids (Rodrigo)
- pps cleanup and fixes for bxt (Imre)
- move sink crc support over to atomic state (Maarten)
- fix up async fbdev init ordering (Chris)
- fbc fixes from Paulo and Chris
* tag 'drm-intel-next-2016-07-11' of git://anongit.freedesktop.org/drm-intel: (223 commits)
drm/i915: Update DRIVER_DATE to 20160711
drm/i915: Select DRM_VGEM for igt
drm/i915: Select X86_MSR for igt
drm/i915: Fill unused GGTT with scratch pages for VT-d
drm/i915: Introduce Kabypoint PCH for Kabylake H/DT.
drm/i915:gen9: implement WaMediaPoolStateCmdInWABB
drm/i915: Check for invalid cloning earlier during modeset
drm/i915: Simplify hdmi_12bpc_possible()
drm/i915: Kill has_dsi_encoder
drm/i915: s/INTEL_OUTPUT_DISPLAYPORT/INTEL_OUTPUT_DP/
drm/i915: Replace some open coded intel_crtc_has_dp_encoder()s
drm/i915: Kill has_dp_encoder from pipe_config
drm/i915: Replace manual lvds and sdvo/hdmi counting with intel_crtc_has_type()
drm/i915: Unify intel_pipe_has_type() and intel_pipe_will_have_type()
drm/i915: Add output_types bitmask into the crtc state
drm/i915: Remove encoder type checks from MST suspend/resume
drm/i915: Don't mark eDP encoders as MST capable
drm/i915: avoid wait_for_atomic() in non-atomic host2guc_action()
drm/i915: Group the irq breadcrumb variables into the same cacheline
drm/i915: Wake up the bottom-half if we steal their interrupt
...
Diffstat (limited to 'drivers/gpu/drm/i915/intel_psr.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_psr.c | 65 |
1 files changed, 38 insertions, 27 deletions
diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c index 29a09bf6bd18..68bd0bb34817 100644 --- a/drivers/gpu/drm/i915/intel_psr.c +++ b/drivers/gpu/drm/i915/intel_psr.c | |||
@@ -63,7 +63,7 @@ static bool is_edp_psr(struct intel_dp *intel_dp) | |||
63 | 63 | ||
64 | static bool vlv_is_psr_active_on_pipe(struct drm_device *dev, int pipe) | 64 | static bool vlv_is_psr_active_on_pipe(struct drm_device *dev, int pipe) |
65 | { | 65 | { |
66 | struct drm_i915_private *dev_priv = dev->dev_private; | 66 | struct drm_i915_private *dev_priv = to_i915(dev); |
67 | uint32_t val; | 67 | uint32_t val; |
68 | 68 | ||
69 | val = I915_READ(VLV_PSRSTAT(pipe)) & | 69 | val = I915_READ(VLV_PSRSTAT(pipe)) & |
@@ -77,7 +77,7 @@ static void intel_psr_write_vsc(struct intel_dp *intel_dp, | |||
77 | { | 77 | { |
78 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 78 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
79 | struct drm_device *dev = dig_port->base.base.dev; | 79 | struct drm_device *dev = dig_port->base.base.dev; |
80 | struct drm_i915_private *dev_priv = dev->dev_private; | 80 | struct drm_i915_private *dev_priv = to_i915(dev); |
81 | struct intel_crtc *crtc = to_intel_crtc(dig_port->base.base.crtc); | 81 | struct intel_crtc *crtc = to_intel_crtc(dig_port->base.base.crtc); |
82 | enum transcoder cpu_transcoder = crtc->config->cpu_transcoder; | 82 | enum transcoder cpu_transcoder = crtc->config->cpu_transcoder; |
83 | i915_reg_t ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder); | 83 | i915_reg_t ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder); |
@@ -107,7 +107,7 @@ static void vlv_psr_setup_vsc(struct intel_dp *intel_dp) | |||
107 | { | 107 | { |
108 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 108 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
109 | struct drm_device *dev = intel_dig_port->base.base.dev; | 109 | struct drm_device *dev = intel_dig_port->base.base.dev; |
110 | struct drm_i915_private *dev_priv = dev->dev_private; | 110 | struct drm_i915_private *dev_priv = to_i915(dev); |
111 | struct drm_crtc *crtc = intel_dig_port->base.base.crtc; | 111 | struct drm_crtc *crtc = intel_dig_port->base.base.crtc; |
112 | enum pipe pipe = to_intel_crtc(crtc)->pipe; | 112 | enum pipe pipe = to_intel_crtc(crtc)->pipe; |
113 | uint32_t val; | 113 | uint32_t val; |
@@ -173,7 +173,7 @@ static void hsw_psr_enable_sink(struct intel_dp *intel_dp) | |||
173 | { | 173 | { |
174 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 174 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
175 | struct drm_device *dev = dig_port->base.base.dev; | 175 | struct drm_device *dev = dig_port->base.base.dev; |
176 | struct drm_i915_private *dev_priv = dev->dev_private; | 176 | struct drm_i915_private *dev_priv = to_i915(dev); |
177 | uint32_t aux_clock_divider; | 177 | uint32_t aux_clock_divider; |
178 | i915_reg_t aux_ctl_reg; | 178 | i915_reg_t aux_ctl_reg; |
179 | static const uint8_t aux_msg[] = { | 179 | static const uint8_t aux_msg[] = { |
@@ -220,7 +220,7 @@ static void vlv_psr_enable_source(struct intel_dp *intel_dp) | |||
220 | { | 220 | { |
221 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 221 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
222 | struct drm_device *dev = dig_port->base.base.dev; | 222 | struct drm_device *dev = dig_port->base.base.dev; |
223 | struct drm_i915_private *dev_priv = dev->dev_private; | 223 | struct drm_i915_private *dev_priv = to_i915(dev); |
224 | struct drm_crtc *crtc = dig_port->base.base.crtc; | 224 | struct drm_crtc *crtc = dig_port->base.base.crtc; |
225 | enum pipe pipe = to_intel_crtc(crtc)->pipe; | 225 | enum pipe pipe = to_intel_crtc(crtc)->pipe; |
226 | 226 | ||
@@ -235,7 +235,7 @@ static void vlv_psr_activate(struct intel_dp *intel_dp) | |||
235 | { | 235 | { |
236 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 236 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
237 | struct drm_device *dev = dig_port->base.base.dev; | 237 | struct drm_device *dev = dig_port->base.base.dev; |
238 | struct drm_i915_private *dev_priv = dev->dev_private; | 238 | struct drm_i915_private *dev_priv = to_i915(dev); |
239 | struct drm_crtc *crtc = dig_port->base.base.crtc; | 239 | struct drm_crtc *crtc = dig_port->base.base.crtc; |
240 | enum pipe pipe = to_intel_crtc(crtc)->pipe; | 240 | enum pipe pipe = to_intel_crtc(crtc)->pipe; |
241 | 241 | ||
@@ -252,7 +252,7 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp) | |||
252 | { | 252 | { |
253 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 253 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
254 | struct drm_device *dev = dig_port->base.base.dev; | 254 | struct drm_device *dev = dig_port->base.base.dev; |
255 | struct drm_i915_private *dev_priv = dev->dev_private; | 255 | struct drm_i915_private *dev_priv = to_i915(dev); |
256 | 256 | ||
257 | uint32_t max_sleep_time = 0x1f; | 257 | uint32_t max_sleep_time = 0x1f; |
258 | /* Lately it was identified that depending on panel idle frame count | 258 | /* Lately it was identified that depending on panel idle frame count |
@@ -324,7 +324,7 @@ static bool intel_psr_match_conditions(struct intel_dp *intel_dp) | |||
324 | { | 324 | { |
325 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); | 325 | struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); |
326 | struct drm_device *dev = dig_port->base.base.dev; | 326 | struct drm_device *dev = dig_port->base.base.dev; |
327 | struct drm_i915_private *dev_priv = dev->dev_private; | 327 | struct drm_i915_private *dev_priv = to_i915(dev); |
328 | struct drm_crtc *crtc = dig_port->base.base.crtc; | 328 | struct drm_crtc *crtc = dig_port->base.base.crtc; |
329 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 329 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
330 | 330 | ||
@@ -378,7 +378,7 @@ static void intel_psr_activate(struct intel_dp *intel_dp) | |||
378 | { | 378 | { |
379 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 379 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
380 | struct drm_device *dev = intel_dig_port->base.base.dev; | 380 | struct drm_device *dev = intel_dig_port->base.base.dev; |
381 | struct drm_i915_private *dev_priv = dev->dev_private; | 381 | struct drm_i915_private *dev_priv = to_i915(dev); |
382 | 382 | ||
383 | WARN_ON(I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE); | 383 | WARN_ON(I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE); |
384 | WARN_ON(dev_priv->psr.active); | 384 | WARN_ON(dev_priv->psr.active); |
@@ -407,7 +407,7 @@ void intel_psr_enable(struct intel_dp *intel_dp) | |||
407 | { | 407 | { |
408 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 408 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
409 | struct drm_device *dev = intel_dig_port->base.base.dev; | 409 | struct drm_device *dev = intel_dig_port->base.base.dev; |
410 | struct drm_i915_private *dev_priv = dev->dev_private; | 410 | struct drm_i915_private *dev_priv = to_i915(dev); |
411 | struct intel_crtc *crtc = to_intel_crtc(intel_dig_port->base.base.crtc); | 411 | struct intel_crtc *crtc = to_intel_crtc(intel_dig_port->base.base.crtc); |
412 | 412 | ||
413 | if (!HAS_PSR(dev)) { | 413 | if (!HAS_PSR(dev)) { |
@@ -494,15 +494,18 @@ static void vlv_psr_disable(struct intel_dp *intel_dp) | |||
494 | { | 494 | { |
495 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 495 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
496 | struct drm_device *dev = intel_dig_port->base.base.dev; | 496 | struct drm_device *dev = intel_dig_port->base.base.dev; |
497 | struct drm_i915_private *dev_priv = dev->dev_private; | 497 | struct drm_i915_private *dev_priv = to_i915(dev); |
498 | struct intel_crtc *intel_crtc = | 498 | struct intel_crtc *intel_crtc = |
499 | to_intel_crtc(intel_dig_port->base.base.crtc); | 499 | to_intel_crtc(intel_dig_port->base.base.crtc); |
500 | uint32_t val; | 500 | uint32_t val; |
501 | 501 | ||
502 | if (dev_priv->psr.active) { | 502 | if (dev_priv->psr.active) { |
503 | /* Put VLV PSR back to PSR_state 0 that is PSR Disabled. */ | 503 | /* Put VLV PSR back to PSR_state 0 that is PSR Disabled. */ |
504 | if (wait_for((I915_READ(VLV_PSRSTAT(intel_crtc->pipe)) & | 504 | if (intel_wait_for_register(dev_priv, |
505 | VLV_EDP_PSR_IN_TRANS) == 0, 1)) | 505 | VLV_PSRSTAT(intel_crtc->pipe), |
506 | VLV_EDP_PSR_IN_TRANS, | ||
507 | 0, | ||
508 | 1)) | ||
506 | WARN(1, "PSR transition took longer than expected\n"); | 509 | WARN(1, "PSR transition took longer than expected\n"); |
507 | 510 | ||
508 | val = I915_READ(VLV_PSRCTL(intel_crtc->pipe)); | 511 | val = I915_READ(VLV_PSRCTL(intel_crtc->pipe)); |
@@ -521,16 +524,18 @@ static void hsw_psr_disable(struct intel_dp *intel_dp) | |||
521 | { | 524 | { |
522 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 525 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
523 | struct drm_device *dev = intel_dig_port->base.base.dev; | 526 | struct drm_device *dev = intel_dig_port->base.base.dev; |
524 | struct drm_i915_private *dev_priv = dev->dev_private; | 527 | struct drm_i915_private *dev_priv = to_i915(dev); |
525 | 528 | ||
526 | if (dev_priv->psr.active) { | 529 | if (dev_priv->psr.active) { |
527 | I915_WRITE(EDP_PSR_CTL, | 530 | I915_WRITE(EDP_PSR_CTL, |
528 | I915_READ(EDP_PSR_CTL) & ~EDP_PSR_ENABLE); | 531 | I915_READ(EDP_PSR_CTL) & ~EDP_PSR_ENABLE); |
529 | 532 | ||
530 | /* Wait till PSR is idle */ | 533 | /* Wait till PSR is idle */ |
531 | if (_wait_for((I915_READ(EDP_PSR_STATUS_CTL) & | 534 | if (intel_wait_for_register(dev_priv, |
532 | EDP_PSR_STATUS_STATE_MASK) == 0, | 535 | EDP_PSR_STATUS_CTL, |
533 | 2 * USEC_PER_SEC, 10 * USEC_PER_MSEC)) | 536 | EDP_PSR_STATUS_STATE_MASK, |
537 | 0, | ||
538 | 2000)) | ||
534 | DRM_ERROR("Timed out waiting for PSR Idle State\n"); | 539 | DRM_ERROR("Timed out waiting for PSR Idle State\n"); |
535 | 540 | ||
536 | dev_priv->psr.active = false; | 541 | dev_priv->psr.active = false; |
@@ -549,7 +554,7 @@ void intel_psr_disable(struct intel_dp *intel_dp) | |||
549 | { | 554 | { |
550 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 555 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
551 | struct drm_device *dev = intel_dig_port->base.base.dev; | 556 | struct drm_device *dev = intel_dig_port->base.base.dev; |
552 | struct drm_i915_private *dev_priv = dev->dev_private; | 557 | struct drm_i915_private *dev_priv = to_i915(dev); |
553 | 558 | ||
554 | mutex_lock(&dev_priv->psr.lock); | 559 | mutex_lock(&dev_priv->psr.lock); |
555 | if (!dev_priv->psr.enabled) { | 560 | if (!dev_priv->psr.enabled) { |
@@ -586,14 +591,20 @@ static void intel_psr_work(struct work_struct *work) | |||
586 | * and be ready for re-enable. | 591 | * and be ready for re-enable. |
587 | */ | 592 | */ |
588 | if (HAS_DDI(dev_priv)) { | 593 | if (HAS_DDI(dev_priv)) { |
589 | if (wait_for((I915_READ(EDP_PSR_STATUS_CTL) & | 594 | if (intel_wait_for_register(dev_priv, |
590 | EDP_PSR_STATUS_STATE_MASK) == 0, 50)) { | 595 | EDP_PSR_STATUS_CTL, |
596 | EDP_PSR_STATUS_STATE_MASK, | ||
597 | 0, | ||
598 | 50)) { | ||
591 | DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n"); | 599 | DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n"); |
592 | return; | 600 | return; |
593 | } | 601 | } |
594 | } else { | 602 | } else { |
595 | if (wait_for((I915_READ(VLV_PSRSTAT(pipe)) & | 603 | if (intel_wait_for_register(dev_priv, |
596 | VLV_EDP_PSR_IN_TRANS) == 0, 1)) { | 604 | VLV_PSRSTAT(pipe), |
605 | VLV_EDP_PSR_IN_TRANS, | ||
606 | 0, | ||
607 | 1)) { | ||
597 | DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n"); | 608 | DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n"); |
598 | return; | 609 | return; |
599 | } | 610 | } |
@@ -619,7 +630,7 @@ unlock: | |||
619 | 630 | ||
620 | static void intel_psr_exit(struct drm_device *dev) | 631 | static void intel_psr_exit(struct drm_device *dev) |
621 | { | 632 | { |
622 | struct drm_i915_private *dev_priv = dev->dev_private; | 633 | struct drm_i915_private *dev_priv = to_i915(dev); |
623 | struct intel_dp *intel_dp = dev_priv->psr.enabled; | 634 | struct intel_dp *intel_dp = dev_priv->psr.enabled; |
624 | struct drm_crtc *crtc = dp_to_dig_port(intel_dp)->base.base.crtc; | 635 | struct drm_crtc *crtc = dp_to_dig_port(intel_dp)->base.base.crtc; |
625 | enum pipe pipe = to_intel_crtc(crtc)->pipe; | 636 | enum pipe pipe = to_intel_crtc(crtc)->pipe; |
@@ -674,7 +685,7 @@ static void intel_psr_exit(struct drm_device *dev) | |||
674 | void intel_psr_single_frame_update(struct drm_device *dev, | 685 | void intel_psr_single_frame_update(struct drm_device *dev, |
675 | unsigned frontbuffer_bits) | 686 | unsigned frontbuffer_bits) |
676 | { | 687 | { |
677 | struct drm_i915_private *dev_priv = dev->dev_private; | 688 | struct drm_i915_private *dev_priv = to_i915(dev); |
678 | struct drm_crtc *crtc; | 689 | struct drm_crtc *crtc; |
679 | enum pipe pipe; | 690 | enum pipe pipe; |
680 | u32 val; | 691 | u32 val; |
@@ -722,7 +733,7 @@ void intel_psr_single_frame_update(struct drm_device *dev, | |||
722 | void intel_psr_invalidate(struct drm_device *dev, | 733 | void intel_psr_invalidate(struct drm_device *dev, |
723 | unsigned frontbuffer_bits) | 734 | unsigned frontbuffer_bits) |
724 | { | 735 | { |
725 | struct drm_i915_private *dev_priv = dev->dev_private; | 736 | struct drm_i915_private *dev_priv = to_i915(dev); |
726 | struct drm_crtc *crtc; | 737 | struct drm_crtc *crtc; |
727 | enum pipe pipe; | 738 | enum pipe pipe; |
728 | 739 | ||
@@ -760,7 +771,7 @@ void intel_psr_invalidate(struct drm_device *dev, | |||
760 | void intel_psr_flush(struct drm_device *dev, | 771 | void intel_psr_flush(struct drm_device *dev, |
761 | unsigned frontbuffer_bits, enum fb_op_origin origin) | 772 | unsigned frontbuffer_bits, enum fb_op_origin origin) |
762 | { | 773 | { |
763 | struct drm_i915_private *dev_priv = dev->dev_private; | 774 | struct drm_i915_private *dev_priv = to_i915(dev); |
764 | struct drm_crtc *crtc; | 775 | struct drm_crtc *crtc; |
765 | enum pipe pipe; | 776 | enum pipe pipe; |
766 | 777 | ||
@@ -796,7 +807,7 @@ void intel_psr_flush(struct drm_device *dev, | |||
796 | */ | 807 | */ |
797 | void intel_psr_init(struct drm_device *dev) | 808 | void intel_psr_init(struct drm_device *dev) |
798 | { | 809 | { |
799 | struct drm_i915_private *dev_priv = dev->dev_private; | 810 | struct drm_i915_private *dev_priv = to_i915(dev); |
800 | 811 | ||
801 | dev_priv->psr_mmio_base = IS_HASWELL(dev_priv) ? | 812 | dev_priv->psr_mmio_base = IS_HASWELL(dev_priv) ? |
802 | HSW_EDP_PSR_BASE : BDW_EDP_PSR_BASE; | 813 | HSW_EDP_PSR_BASE : BDW_EDP_PSR_BASE; |