Lines Matching refs:intel_dp
22 static void pps_init_delays(struct intel_dp *intel_dp);
23 static void pps_init_registers(struct intel_dp *intel_dp, bool force_disable_vdd);
59 intel_wakeref_t intel_pps_lock(struct intel_dp *intel_dp) in intel_pps_lock() argument
61 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_pps_lock()
73 intel_wakeref_t intel_pps_unlock(struct intel_dp *intel_dp, in intel_pps_unlock() argument
76 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_pps_unlock()
85 vlv_power_sequencer_kick(struct intel_dp *intel_dp) in vlv_power_sequencer_kick() argument
87 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in vlv_power_sequencer_kick()
88 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in vlv_power_sequencer_kick()
89 enum pipe pipe = intel_dp->pps.pps_pipe; in vlv_power_sequencer_kick()
96 intel_de_read(dev_priv, intel_dp->output_reg) & DP_PORT_EN, in vlv_power_sequencer_kick()
98 pps_name(dev_priv, &intel_dp->pps), in vlv_power_sequencer_kick()
104 pps_name(dev_priv, &intel_dp->pps), in vlv_power_sequencer_kick()
110 DP = intel_de_read(dev_priv, intel_dp->output_reg) & DP_DETECTED; in vlv_power_sequencer_kick()
144 intel_de_write(dev_priv, intel_dp->output_reg, DP); in vlv_power_sequencer_kick()
145 intel_de_posting_read(dev_priv, intel_dp->output_reg); in vlv_power_sequencer_kick()
147 intel_de_write(dev_priv, intel_dp->output_reg, DP | DP_PORT_EN); in vlv_power_sequencer_kick()
148 intel_de_posting_read(dev_priv, intel_dp->output_reg); in vlv_power_sequencer_kick()
150 intel_de_write(dev_priv, intel_dp->output_reg, DP & ~DP_PORT_EN); in vlv_power_sequencer_kick()
151 intel_de_posting_read(dev_priv, intel_dp->output_reg); in vlv_power_sequencer_kick()
171 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in vlv_find_free_pps() local
175 intel_dp->pps.active_pipe != INVALID_PIPE && in vlv_find_free_pps()
176 intel_dp->pps.active_pipe != in vlv_find_free_pps()
177 intel_dp->pps.pps_pipe); in vlv_find_free_pps()
179 if (intel_dp->pps.pps_pipe != INVALID_PIPE) in vlv_find_free_pps()
180 pipes &= ~(1 << intel_dp->pps.pps_pipe); in vlv_find_free_pps()
183 intel_dp->pps.pps_pipe != INVALID_PIPE); in vlv_find_free_pps()
185 if (intel_dp->pps.active_pipe != INVALID_PIPE) in vlv_find_free_pps()
186 pipes &= ~(1 << intel_dp->pps.active_pipe); in vlv_find_free_pps()
197 vlv_power_sequencer_pipe(struct intel_dp *intel_dp) in vlv_power_sequencer_pipe() argument
199 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in vlv_power_sequencer_pipe()
200 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in vlv_power_sequencer_pipe()
206 drm_WARN_ON(&dev_priv->drm, !intel_dp_is_edp(intel_dp)); in vlv_power_sequencer_pipe()
208 drm_WARN_ON(&dev_priv->drm, intel_dp->pps.active_pipe != INVALID_PIPE && in vlv_power_sequencer_pipe()
209 intel_dp->pps.active_pipe != intel_dp->pps.pps_pipe); in vlv_power_sequencer_pipe()
211 if (intel_dp->pps.pps_pipe != INVALID_PIPE) in vlv_power_sequencer_pipe()
212 return intel_dp->pps.pps_pipe; in vlv_power_sequencer_pipe()
224 intel_dp->pps.pps_pipe = pipe; in vlv_power_sequencer_pipe()
228 pps_name(dev_priv, &intel_dp->pps), in vlv_power_sequencer_pipe()
232 pps_init_delays(intel_dp); in vlv_power_sequencer_pipe()
233 pps_init_registers(intel_dp, true); in vlv_power_sequencer_pipe()
239 vlv_power_sequencer_kick(intel_dp); in vlv_power_sequencer_pipe()
241 return intel_dp->pps.pps_pipe; in vlv_power_sequencer_pipe()
245 bxt_power_sequencer_idx(struct intel_dp *intel_dp) in bxt_power_sequencer_idx() argument
247 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in bxt_power_sequencer_idx()
248 int pps_idx = intel_dp->pps.pps_idx; in bxt_power_sequencer_idx()
253 drm_WARN_ON(&dev_priv->drm, !intel_dp_is_edp(intel_dp)); in bxt_power_sequencer_idx()
255 if (!intel_dp->pps.pps_reset) in bxt_power_sequencer_idx()
258 intel_dp->pps.pps_reset = false; in bxt_power_sequencer_idx()
264 pps_init_registers(intel_dp, false); in bxt_power_sequencer_idx()
309 vlv_initial_power_sequencer_setup(struct intel_dp *intel_dp) in vlv_initial_power_sequencer_setup() argument
311 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in vlv_initial_power_sequencer_setup()
312 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in vlv_initial_power_sequencer_setup()
319 intel_dp->pps.pps_pipe = vlv_initial_pps_pipe(dev_priv, port, in vlv_initial_power_sequencer_setup()
322 if (intel_dp->pps.pps_pipe == INVALID_PIPE) in vlv_initial_power_sequencer_setup()
323 intel_dp->pps.pps_pipe = vlv_initial_pps_pipe(dev_priv, port, in vlv_initial_power_sequencer_setup()
326 if (intel_dp->pps.pps_pipe == INVALID_PIPE) in vlv_initial_power_sequencer_setup()
327 intel_dp->pps.pps_pipe = vlv_initial_pps_pipe(dev_priv, port, in vlv_initial_power_sequencer_setup()
331 if (intel_dp->pps.pps_pipe == INVALID_PIPE) { in vlv_initial_power_sequencer_setup()
341 pps_name(dev_priv, &intel_dp->pps)); in vlv_initial_power_sequencer_setup()
361 static bool intel_pps_is_valid(struct intel_dp *intel_dp) in intel_pps_is_valid() argument
363 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_pps_is_valid()
365 if (intel_dp->pps.pps_idx == 1 && in intel_pps_is_valid()
387 pps_initial_setup(struct intel_dp *intel_dp) in pps_initial_setup() argument
389 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in pps_initial_setup()
390 struct intel_connector *connector = intel_dp->attached_connector; in pps_initial_setup()
396 vlv_initial_power_sequencer_setup(intel_dp); in pps_initial_setup()
402 intel_dp->pps.pps_idx = connector->panel.vbt.backlight.controller; in pps_initial_setup()
404 intel_dp->pps.pps_idx = 0; in pps_initial_setup()
406 if (drm_WARN_ON(&i915->drm, intel_dp->pps.pps_idx >= intel_num_pps(i915))) in pps_initial_setup()
407 intel_dp->pps.pps_idx = -1; in pps_initial_setup()
410 if (intel_dp->pps.pps_idx < 0) in pps_initial_setup()
411 intel_dp->pps.pps_idx = bxt_initial_pps_idx(i915, pps_has_pp_on); in pps_initial_setup()
413 if (intel_dp->pps.pps_idx < 0) in pps_initial_setup()
414 intel_dp->pps.pps_idx = bxt_initial_pps_idx(i915, pps_has_vdd_on); in pps_initial_setup()
416 if (intel_dp->pps.pps_idx < 0) { in pps_initial_setup()
417 intel_dp->pps.pps_idx = bxt_initial_pps_idx(i915, pps_any); in pps_initial_setup()
422 pps_name(i915, &intel_dp->pps)); in pps_initial_setup()
427 pps_name(i915, &intel_dp->pps)); in pps_initial_setup()
430 return intel_pps_is_valid(intel_dp); in pps_initial_setup()
454 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in intel_pps_reset_all() local
457 intel_dp->pps.active_pipe != INVALID_PIPE); in intel_pps_reset_all()
463 intel_dp->pps.pps_reset = true; in intel_pps_reset_all()
465 intel_dp->pps.pps_pipe = INVALID_PIPE; in intel_pps_reset_all()
477 static void intel_pps_get_registers(struct intel_dp *intel_dp, in intel_pps_get_registers() argument
480 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_pps_get_registers()
486 pps_idx = vlv_power_sequencer_pipe(intel_dp); in intel_pps_get_registers()
488 pps_idx = bxt_power_sequencer_idx(intel_dp); in intel_pps_get_registers()
490 pps_idx = intel_dp->pps.pps_idx; in intel_pps_get_registers()
506 _pp_ctrl_reg(struct intel_dp *intel_dp) in _pp_ctrl_reg() argument
510 intel_pps_get_registers(intel_dp, ®s); in _pp_ctrl_reg()
516 _pp_stat_reg(struct intel_dp *intel_dp) in _pp_stat_reg() argument
520 intel_pps_get_registers(intel_dp, ®s); in _pp_stat_reg()
525 static bool edp_have_panel_power(struct intel_dp *intel_dp) in edp_have_panel_power() argument
527 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in edp_have_panel_power()
532 intel_dp->pps.pps_pipe == INVALID_PIPE) in edp_have_panel_power()
535 return (intel_de_read(dev_priv, _pp_stat_reg(intel_dp)) & PP_ON) != 0; in edp_have_panel_power()
538 static bool edp_have_panel_vdd(struct intel_dp *intel_dp) in edp_have_panel_vdd() argument
540 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in edp_have_panel_vdd()
545 intel_dp->pps.pps_pipe == INVALID_PIPE) in edp_have_panel_vdd()
548 return intel_de_read(dev_priv, _pp_ctrl_reg(intel_dp)) & EDP_FORCE_VDD; in edp_have_panel_vdd()
551 void intel_pps_check_power_unlocked(struct intel_dp *intel_dp) in intel_pps_check_power_unlocked() argument
553 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_pps_check_power_unlocked()
554 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in intel_pps_check_power_unlocked()
556 if (!intel_dp_is_edp(intel_dp)) in intel_pps_check_power_unlocked()
559 if (!edp_have_panel_power(intel_dp) && !edp_have_panel_vdd(intel_dp)) { in intel_pps_check_power_unlocked()
563 pps_name(dev_priv, &intel_dp->pps)); in intel_pps_check_power_unlocked()
567 pps_name(dev_priv, &intel_dp->pps), in intel_pps_check_power_unlocked()
568 intel_de_read(dev_priv, _pp_stat_reg(intel_dp)), in intel_pps_check_power_unlocked()
569 intel_de_read(dev_priv, _pp_ctrl_reg(intel_dp))); in intel_pps_check_power_unlocked()
582 static void intel_pps_verify_state(struct intel_dp *intel_dp);
584 static void wait_panel_status(struct intel_dp *intel_dp, in wait_panel_status() argument
587 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in wait_panel_status()
588 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in wait_panel_status()
593 intel_pps_verify_state(intel_dp); in wait_panel_status()
595 pp_stat_reg = _pp_stat_reg(intel_dp); in wait_panel_status()
596 pp_ctrl_reg = _pp_ctrl_reg(intel_dp); in wait_panel_status()
601 pps_name(dev_priv, &intel_dp->pps), in wait_panel_status()
611 pps_name(dev_priv, &intel_dp->pps), in wait_panel_status()
618 static void wait_panel_on(struct intel_dp *intel_dp) in wait_panel_on() argument
620 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in wait_panel_on()
621 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in wait_panel_on()
625 pps_name(i915, &intel_dp->pps)); in wait_panel_on()
626 wait_panel_status(intel_dp, IDLE_ON_MASK, IDLE_ON_VALUE); in wait_panel_on()
629 static void wait_panel_off(struct intel_dp *intel_dp) in wait_panel_off() argument
631 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in wait_panel_off()
632 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in wait_panel_off()
636 pps_name(i915, &intel_dp->pps)); in wait_panel_off()
637 wait_panel_status(intel_dp, IDLE_OFF_MASK, IDLE_OFF_VALUE); in wait_panel_off()
640 static void wait_panel_power_cycle(struct intel_dp *intel_dp) in wait_panel_power_cycle() argument
642 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in wait_panel_power_cycle()
643 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in wait_panel_power_cycle()
649 pps_name(i915, &intel_dp->pps)); in wait_panel_power_cycle()
654 panel_power_off_duration = ktime_ms_delta(panel_power_on_time, intel_dp->pps.panel_power_off_time); in wait_panel_power_cycle()
658 if (panel_power_off_duration < (s64)intel_dp->pps.panel_power_cycle_delay) in wait_panel_power_cycle()
660 intel_dp->pps.panel_power_cycle_delay - panel_power_off_duration); in wait_panel_power_cycle()
662 wait_panel_status(intel_dp, IDLE_CYCLE_MASK, IDLE_CYCLE_VALUE); in wait_panel_power_cycle()
665 void intel_pps_wait_power_cycle(struct intel_dp *intel_dp) in intel_pps_wait_power_cycle() argument
669 if (!intel_dp_is_edp(intel_dp)) in intel_pps_wait_power_cycle()
672 with_intel_pps_lock(intel_dp, wakeref) in intel_pps_wait_power_cycle()
673 wait_panel_power_cycle(intel_dp); in intel_pps_wait_power_cycle()
676 static void wait_backlight_on(struct intel_dp *intel_dp) in wait_backlight_on() argument
678 wait_remaining_ms_from_jiffies(intel_dp->pps.last_power_on, in wait_backlight_on()
679 intel_dp->pps.backlight_on_delay); in wait_backlight_on()
682 static void edp_wait_backlight_off(struct intel_dp *intel_dp) in edp_wait_backlight_off() argument
684 wait_remaining_ms_from_jiffies(intel_dp->pps.last_backlight_off, in edp_wait_backlight_off()
685 intel_dp->pps.backlight_off_delay); in edp_wait_backlight_off()
692 static u32 ilk_get_pp_control(struct intel_dp *intel_dp) in ilk_get_pp_control() argument
694 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in ilk_get_pp_control()
699 control = intel_de_read(dev_priv, _pp_ctrl_reg(intel_dp)); in ilk_get_pp_control()
713 bool intel_pps_vdd_on_unlocked(struct intel_dp *intel_dp) in intel_pps_vdd_on_unlocked() argument
715 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_pps_vdd_on_unlocked()
716 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in intel_pps_vdd_on_unlocked()
719 bool need_to_disable = !intel_dp->pps.want_panel_vdd; in intel_pps_vdd_on_unlocked()
723 if (!intel_dp_is_edp(intel_dp)) in intel_pps_vdd_on_unlocked()
726 cancel_delayed_work(&intel_dp->pps.panel_vdd_work); in intel_pps_vdd_on_unlocked()
727 intel_dp->pps.want_panel_vdd = true; in intel_pps_vdd_on_unlocked()
729 if (edp_have_panel_vdd(intel_dp)) in intel_pps_vdd_on_unlocked()
732 drm_WARN_ON(&dev_priv->drm, intel_dp->pps.vdd_wakeref); in intel_pps_vdd_on_unlocked()
733 intel_dp->pps.vdd_wakeref = intel_display_power_get(dev_priv, in intel_pps_vdd_on_unlocked()
736 pp_stat_reg = _pp_stat_reg(intel_dp); in intel_pps_vdd_on_unlocked()
737 pp_ctrl_reg = _pp_ctrl_reg(intel_dp); in intel_pps_vdd_on_unlocked()
741 pps_name(dev_priv, &intel_dp->pps)); in intel_pps_vdd_on_unlocked()
743 if (!edp_have_panel_power(intel_dp)) in intel_pps_vdd_on_unlocked()
744 wait_panel_power_cycle(intel_dp); in intel_pps_vdd_on_unlocked()
746 pp = ilk_get_pp_control(intel_dp); in intel_pps_vdd_on_unlocked()
753 pps_name(dev_priv, &intel_dp->pps), in intel_pps_vdd_on_unlocked()
759 if (!edp_have_panel_power(intel_dp)) { in intel_pps_vdd_on_unlocked()
763 pps_name(dev_priv, &intel_dp->pps)); in intel_pps_vdd_on_unlocked()
764 msleep(intel_dp->pps.panel_power_up_delay); in intel_pps_vdd_on_unlocked()
776 void intel_pps_vdd_on(struct intel_dp *intel_dp) in intel_pps_vdd_on() argument
778 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_pps_vdd_on()
782 if (!intel_dp_is_edp(intel_dp)) in intel_pps_vdd_on()
786 with_intel_pps_lock(intel_dp, wakeref) in intel_pps_vdd_on()
787 vdd = intel_pps_vdd_on_unlocked(intel_dp); in intel_pps_vdd_on()
789 dp_to_dig_port(intel_dp)->base.base.base.id, in intel_pps_vdd_on()
790 dp_to_dig_port(intel_dp)->base.base.name, in intel_pps_vdd_on()
791 pps_name(i915, &intel_dp->pps)); in intel_pps_vdd_on()
794 static void intel_pps_vdd_off_sync_unlocked(struct intel_dp *intel_dp) in intel_pps_vdd_off_sync_unlocked() argument
796 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_pps_vdd_off_sync_unlocked()
798 dp_to_dig_port(intel_dp); in intel_pps_vdd_off_sync_unlocked()
804 drm_WARN_ON(&dev_priv->drm, intel_dp->pps.want_panel_vdd); in intel_pps_vdd_off_sync_unlocked()
806 if (!edp_have_panel_vdd(intel_dp)) in intel_pps_vdd_off_sync_unlocked()
811 pps_name(dev_priv, &intel_dp->pps)); in intel_pps_vdd_off_sync_unlocked()
813 pp = ilk_get_pp_control(intel_dp); in intel_pps_vdd_off_sync_unlocked()
816 pp_ctrl_reg = _pp_ctrl_reg(intel_dp); in intel_pps_vdd_off_sync_unlocked()
817 pp_stat_reg = _pp_stat_reg(intel_dp); in intel_pps_vdd_off_sync_unlocked()
825 pps_name(dev_priv, &intel_dp->pps), in intel_pps_vdd_off_sync_unlocked()
830 intel_dp->pps.panel_power_off_time = ktime_get_boottime(); in intel_pps_vdd_off_sync_unlocked()
834 fetch_and_zero(&intel_dp->pps.vdd_wakeref)); in intel_pps_vdd_off_sync_unlocked()
837 void intel_pps_vdd_off_sync(struct intel_dp *intel_dp) in intel_pps_vdd_off_sync() argument
841 if (!intel_dp_is_edp(intel_dp)) in intel_pps_vdd_off_sync()
844 cancel_delayed_work_sync(&intel_dp->pps.panel_vdd_work); in intel_pps_vdd_off_sync()
849 with_intel_pps_lock(intel_dp, wakeref) in intel_pps_vdd_off_sync()
850 intel_pps_vdd_off_sync_unlocked(intel_dp); in intel_pps_vdd_off_sync()
857 struct intel_dp *intel_dp = container_of(pps, struct intel_dp, pps); in edp_panel_vdd_work() local
860 with_intel_pps_lock(intel_dp, wakeref) { in edp_panel_vdd_work()
861 if (!intel_dp->pps.want_panel_vdd) in edp_panel_vdd_work()
862 intel_pps_vdd_off_sync_unlocked(intel_dp); in edp_panel_vdd_work()
866 static void edp_panel_vdd_schedule_off(struct intel_dp *intel_dp) in edp_panel_vdd_schedule_off() argument
874 if (intel_dp->pps.initializing) in edp_panel_vdd_schedule_off()
882 delay = msecs_to_jiffies(intel_dp->pps.panel_power_cycle_delay * 5); in edp_panel_vdd_schedule_off()
883 schedule_delayed_work(&intel_dp->pps.panel_vdd_work, delay); in edp_panel_vdd_schedule_off()
891 void intel_pps_vdd_off_unlocked(struct intel_dp *intel_dp, bool sync) in intel_pps_vdd_off_unlocked() argument
893 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_pps_vdd_off_unlocked()
897 if (!intel_dp_is_edp(intel_dp)) in intel_pps_vdd_off_unlocked()
900 I915_STATE_WARN(!intel_dp->pps.want_panel_vdd, "[ENCODER:%d:%s] %s VDD not forced on", in intel_pps_vdd_off_unlocked()
901 dp_to_dig_port(intel_dp)->base.base.base.id, in intel_pps_vdd_off_unlocked()
902 dp_to_dig_port(intel_dp)->base.base.name, in intel_pps_vdd_off_unlocked()
903 pps_name(dev_priv, &intel_dp->pps)); in intel_pps_vdd_off_unlocked()
905 intel_dp->pps.want_panel_vdd = false; in intel_pps_vdd_off_unlocked()
908 intel_pps_vdd_off_sync_unlocked(intel_dp); in intel_pps_vdd_off_unlocked()
910 edp_panel_vdd_schedule_off(intel_dp); in intel_pps_vdd_off_unlocked()
913 void intel_pps_on_unlocked(struct intel_dp *intel_dp) in intel_pps_on_unlocked() argument
915 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_pps_on_unlocked()
921 if (!intel_dp_is_edp(intel_dp)) in intel_pps_on_unlocked()
925 dp_to_dig_port(intel_dp)->base.base.base.id, in intel_pps_on_unlocked()
926 dp_to_dig_port(intel_dp)->base.base.name, in intel_pps_on_unlocked()
927 pps_name(dev_priv, &intel_dp->pps)); in intel_pps_on_unlocked()
929 if (drm_WARN(&dev_priv->drm, edp_have_panel_power(intel_dp), in intel_pps_on_unlocked()
931 dp_to_dig_port(intel_dp)->base.base.base.id, in intel_pps_on_unlocked()
932 dp_to_dig_port(intel_dp)->base.base.name, in intel_pps_on_unlocked()
933 pps_name(dev_priv, &intel_dp->pps))) in intel_pps_on_unlocked()
936 wait_panel_power_cycle(intel_dp); in intel_pps_on_unlocked()
938 pp_ctrl_reg = _pp_ctrl_reg(intel_dp); in intel_pps_on_unlocked()
939 pp = ilk_get_pp_control(intel_dp); in intel_pps_on_unlocked()
954 wait_panel_on(intel_dp); in intel_pps_on_unlocked()
955 intel_dp->pps.last_power_on = jiffies; in intel_pps_on_unlocked()
964 void intel_pps_on(struct intel_dp *intel_dp) in intel_pps_on() argument
968 if (!intel_dp_is_edp(intel_dp)) in intel_pps_on()
971 with_intel_pps_lock(intel_dp, wakeref) in intel_pps_on()
972 intel_pps_on_unlocked(intel_dp); in intel_pps_on()
975 void intel_pps_off_unlocked(struct intel_dp *intel_dp) in intel_pps_off_unlocked() argument
977 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_pps_off_unlocked()
978 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in intel_pps_off_unlocked()
984 if (!intel_dp_is_edp(intel_dp)) in intel_pps_off_unlocked()
989 pps_name(dev_priv, &intel_dp->pps)); in intel_pps_off_unlocked()
991 drm_WARN(&dev_priv->drm, !intel_dp->pps.want_panel_vdd, in intel_pps_off_unlocked()
994 pps_name(dev_priv, &intel_dp->pps)); in intel_pps_off_unlocked()
996 pp = ilk_get_pp_control(intel_dp); in intel_pps_off_unlocked()
1002 pp_ctrl_reg = _pp_ctrl_reg(intel_dp); in intel_pps_off_unlocked()
1004 intel_dp->pps.want_panel_vdd = false; in intel_pps_off_unlocked()
1009 wait_panel_off(intel_dp); in intel_pps_off_unlocked()
1010 intel_dp->pps.panel_power_off_time = ktime_get_boottime(); in intel_pps_off_unlocked()
1015 fetch_and_zero(&intel_dp->pps.vdd_wakeref)); in intel_pps_off_unlocked()
1018 void intel_pps_off(struct intel_dp *intel_dp) in intel_pps_off() argument
1022 if (!intel_dp_is_edp(intel_dp)) in intel_pps_off()
1025 with_intel_pps_lock(intel_dp, wakeref) in intel_pps_off()
1026 intel_pps_off_unlocked(intel_dp); in intel_pps_off()
1030 void intel_pps_backlight_on(struct intel_dp *intel_dp) in intel_pps_backlight_on() argument
1032 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_pps_backlight_on()
1041 wait_backlight_on(intel_dp); in intel_pps_backlight_on()
1043 with_intel_pps_lock(intel_dp, wakeref) { in intel_pps_backlight_on()
1044 i915_reg_t pp_ctrl_reg = _pp_ctrl_reg(intel_dp); in intel_pps_backlight_on()
1047 pp = ilk_get_pp_control(intel_dp); in intel_pps_backlight_on()
1056 void intel_pps_backlight_off(struct intel_dp *intel_dp) in intel_pps_backlight_off() argument
1058 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_pps_backlight_off()
1061 if (!intel_dp_is_edp(intel_dp)) in intel_pps_backlight_off()
1064 with_intel_pps_lock(intel_dp, wakeref) { in intel_pps_backlight_off()
1065 i915_reg_t pp_ctrl_reg = _pp_ctrl_reg(intel_dp); in intel_pps_backlight_off()
1068 pp = ilk_get_pp_control(intel_dp); in intel_pps_backlight_off()
1075 intel_dp->pps.last_backlight_off = jiffies; in intel_pps_backlight_off()
1076 edp_wait_backlight_off(intel_dp); in intel_pps_backlight_off()
1086 struct intel_dp *intel_dp = intel_attached_dp(connector); in intel_pps_backlight_power() local
1091 with_intel_pps_lock(intel_dp, wakeref) in intel_pps_backlight_power()
1092 is_enabled = ilk_get_pp_control(intel_dp) & EDP_BLC_ENABLE; in intel_pps_backlight_power()
1100 intel_pps_backlight_on(intel_dp); in intel_pps_backlight_power()
1102 intel_pps_backlight_off(intel_dp); in intel_pps_backlight_power()
1105 static void vlv_detach_power_sequencer(struct intel_dp *intel_dp) in vlv_detach_power_sequencer() argument
1107 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in vlv_detach_power_sequencer()
1109 enum pipe pipe = intel_dp->pps.pps_pipe; in vlv_detach_power_sequencer()
1112 drm_WARN_ON(&dev_priv->drm, intel_dp->pps.active_pipe != INVALID_PIPE); in vlv_detach_power_sequencer()
1117 intel_pps_vdd_off_sync_unlocked(intel_dp); in vlv_detach_power_sequencer()
1130 pps_name(dev_priv, &intel_dp->pps), in vlv_detach_power_sequencer()
1135 intel_dp->pps.pps_pipe = INVALID_PIPE; in vlv_detach_power_sequencer()
1146 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in vlv_steal_power_sequencer() local
1148 drm_WARN(&dev_priv->drm, intel_dp->pps.active_pipe == pipe, in vlv_steal_power_sequencer()
1153 if (intel_dp->pps.pps_pipe != pipe) in vlv_steal_power_sequencer()
1162 vlv_detach_power_sequencer(intel_dp); in vlv_steal_power_sequencer()
1170 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); in vlv_pps_init() local
1175 drm_WARN_ON(&dev_priv->drm, intel_dp->pps.active_pipe != INVALID_PIPE); in vlv_pps_init()
1177 if (intel_dp->pps.pps_pipe != INVALID_PIPE && in vlv_pps_init()
1178 intel_dp->pps.pps_pipe != crtc->pipe) { in vlv_pps_init()
1184 vlv_detach_power_sequencer(intel_dp); in vlv_pps_init()
1193 intel_dp->pps.active_pipe = crtc->pipe; in vlv_pps_init()
1195 if (!intel_dp_is_edp(intel_dp)) in vlv_pps_init()
1199 intel_dp->pps.pps_pipe = crtc->pipe; in vlv_pps_init()
1203 pps_name(dev_priv, &intel_dp->pps), in vlv_pps_init()
1207 pps_init_delays(intel_dp); in vlv_pps_init()
1208 pps_init_registers(intel_dp, true); in vlv_pps_init()
1211 static void pps_vdd_init(struct intel_dp *intel_dp) in pps_vdd_init() argument
1213 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in pps_vdd_init()
1214 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); in pps_vdd_init()
1218 if (!edp_have_panel_vdd(intel_dp)) in pps_vdd_init()
1230 pps_name(dev_priv, &intel_dp->pps)); in pps_vdd_init()
1231 drm_WARN_ON(&dev_priv->drm, intel_dp->pps.vdd_wakeref); in pps_vdd_init()
1232 intel_dp->pps.vdd_wakeref = intel_display_power_get(dev_priv, in pps_vdd_init()
1236 bool intel_pps_have_panel_power_or_vdd(struct intel_dp *intel_dp) in intel_pps_have_panel_power_or_vdd() argument
1241 with_intel_pps_lock(intel_dp, wakeref) { in intel_pps_have_panel_power_or_vdd()
1242 have_power = edp_have_panel_power(intel_dp) || in intel_pps_have_panel_power_or_vdd()
1243 edp_have_panel_vdd(intel_dp); in intel_pps_have_panel_power_or_vdd()
1249 static void pps_init_timestamps(struct intel_dp *intel_dp) in pps_init_timestamps() argument
1257 intel_dp->pps.panel_power_off_time = 0; in pps_init_timestamps()
1258 intel_dp->pps.last_power_on = jiffies; in pps_init_timestamps()
1259 intel_dp->pps.last_backlight_off = jiffies; in pps_init_timestamps()
1263 intel_pps_readout_hw_state(struct intel_dp *intel_dp, struct edp_power_seq *seq) in intel_pps_readout_hw_state() argument
1265 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in intel_pps_readout_hw_state()
1269 intel_pps_get_registers(intel_dp, ®s); in intel_pps_readout_hw_state()
1271 pp_ctl = ilk_get_pp_control(intel_dp); in intel_pps_readout_hw_state()
1298 intel_pps_dump_state(struct intel_dp *intel_dp, const char *state_name, in intel_pps_dump_state() argument
1301 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_pps_dump_state()
1309 intel_pps_verify_state(struct intel_dp *intel_dp) in intel_pps_verify_state() argument
1311 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_pps_verify_state()
1313 struct edp_power_seq *sw = &intel_dp->pps.pps_delays; in intel_pps_verify_state()
1315 intel_pps_readout_hw_state(intel_dp, &hw); in intel_pps_verify_state()
1320 intel_pps_dump_state(intel_dp, "sw", sw); in intel_pps_verify_state()
1321 intel_pps_dump_state(intel_dp, "hw", &hw); in intel_pps_verify_state()
1331 static void pps_init_delays_bios(struct intel_dp *intel_dp, in pps_init_delays_bios() argument
1334 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in pps_init_delays_bios()
1338 if (!pps_delays_valid(&intel_dp->pps.bios_pps_delays)) in pps_init_delays_bios()
1339 intel_pps_readout_hw_state(intel_dp, &intel_dp->pps.bios_pps_delays); in pps_init_delays_bios()
1341 *bios = intel_dp->pps.bios_pps_delays; in pps_init_delays_bios()
1343 intel_pps_dump_state(intel_dp, "bios", bios); in pps_init_delays_bios()
1346 static void pps_init_delays_vbt(struct intel_dp *intel_dp, in pps_init_delays_vbt() argument
1349 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in pps_init_delays_vbt()
1350 struct intel_connector *connector = intel_dp->attached_connector; in pps_init_delays_vbt()
1375 intel_pps_dump_state(intel_dp, "vbt", vbt); in pps_init_delays_vbt()
1378 static void pps_init_delays_spec(struct intel_dp *intel_dp, in pps_init_delays_spec() argument
1381 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in pps_init_delays_spec()
1397 intel_pps_dump_state(intel_dp, "spec", spec); in pps_init_delays_spec()
1400 static void pps_init_delays(struct intel_dp *intel_dp) in pps_init_delays() argument
1402 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in pps_init_delays()
1404 *final = &intel_dp->pps.pps_delays; in pps_init_delays()
1412 pps_init_delays_bios(intel_dp, &cur); in pps_init_delays()
1413 pps_init_delays_vbt(intel_dp, &vbt); in pps_init_delays()
1414 pps_init_delays_spec(intel_dp, &spec); in pps_init_delays()
1429 intel_dp->pps.panel_power_up_delay = get_delay(t1_t3); in pps_init_delays()
1430 intel_dp->pps.backlight_on_delay = get_delay(t8); in pps_init_delays()
1431 intel_dp->pps.backlight_off_delay = get_delay(t9); in pps_init_delays()
1432 intel_dp->pps.panel_power_down_delay = get_delay(t10); in pps_init_delays()
1433 intel_dp->pps.panel_power_cycle_delay = get_delay(t11_t12); in pps_init_delays()
1438 intel_dp->pps.panel_power_up_delay, in pps_init_delays()
1439 intel_dp->pps.panel_power_down_delay, in pps_init_delays()
1440 intel_dp->pps.panel_power_cycle_delay); in pps_init_delays()
1443 intel_dp->pps.backlight_on_delay, in pps_init_delays()
1444 intel_dp->pps.backlight_off_delay); in pps_init_delays()
1463 static void pps_init_registers(struct intel_dp *intel_dp, bool force_disable_vdd) in pps_init_registers() argument
1465 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); in pps_init_registers()
1469 enum port port = dp_to_dig_port(intel_dp)->base.port; in pps_init_registers()
1470 const struct edp_power_seq *seq = &intel_dp->pps.pps_delays; in pps_init_registers()
1474 intel_pps_get_registers(intel_dp, ®s); in pps_init_registers()
1489 u32 pp = ilk_get_pp_control(intel_dp); in pps_init_registers()
1558 void intel_pps_encoder_reset(struct intel_dp *intel_dp) in intel_pps_encoder_reset() argument
1560 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in intel_pps_encoder_reset()
1563 if (!intel_dp_is_edp(intel_dp)) in intel_pps_encoder_reset()
1566 with_intel_pps_lock(intel_dp, wakeref) { in intel_pps_encoder_reset()
1572 vlv_initial_power_sequencer_setup(intel_dp); in intel_pps_encoder_reset()
1574 pps_init_delays(intel_dp); in intel_pps_encoder_reset()
1575 pps_init_registers(intel_dp, false); in intel_pps_encoder_reset()
1576 pps_vdd_init(intel_dp); in intel_pps_encoder_reset()
1578 if (edp_have_panel_vdd(intel_dp)) in intel_pps_encoder_reset()
1579 edp_panel_vdd_schedule_off(intel_dp); in intel_pps_encoder_reset()
1583 bool intel_pps_init(struct intel_dp *intel_dp) in intel_pps_init() argument
1588 intel_dp->pps.initializing = true; in intel_pps_init()
1589 INIT_DELAYED_WORK(&intel_dp->pps.panel_vdd_work, edp_panel_vdd_work); in intel_pps_init()
1591 pps_init_timestamps(intel_dp); in intel_pps_init()
1593 with_intel_pps_lock(intel_dp, wakeref) { in intel_pps_init()
1594 ret = pps_initial_setup(intel_dp); in intel_pps_init()
1596 pps_init_delays(intel_dp); in intel_pps_init()
1597 pps_init_registers(intel_dp, false); in intel_pps_init()
1598 pps_vdd_init(intel_dp); in intel_pps_init()
1604 static void pps_init_late(struct intel_dp *intel_dp) in pps_init_late() argument
1606 struct drm_i915_private *i915 = dp_to_i915(intel_dp); in pps_init_late()
1607 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; in pps_init_late()
1608 struct intel_connector *connector = intel_dp->attached_connector; in pps_init_late()
1617 intel_dp->pps.pps_idx != connector->panel.vbt.backlight.controller, in pps_init_late()
1620 intel_dp->pps.pps_idx, connector->panel.vbt.backlight.controller); in pps_init_late()
1623 intel_dp->pps.pps_idx = connector->panel.vbt.backlight.controller; in pps_init_late()
1626 void intel_pps_init_late(struct intel_dp *intel_dp) in intel_pps_init_late() argument
1630 with_intel_pps_lock(intel_dp, wakeref) { in intel_pps_init_late()
1632 pps_init_late(intel_dp); in intel_pps_init_late()
1634 memset(&intel_dp->pps.pps_delays, 0, sizeof(intel_dp->pps.pps_delays)); in intel_pps_init_late()
1635 pps_init_delays(intel_dp); in intel_pps_init_late()
1636 pps_init_registers(intel_dp, false); in intel_pps_init_late()
1638 intel_dp->pps.initializing = false; in intel_pps_init_late()
1640 if (edp_have_panel_vdd(intel_dp)) in intel_pps_init_late()
1641 edp_panel_vdd_schedule_off(intel_dp); in intel_pps_init_late()