diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ddi.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 54 |
1 files changed, 48 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c index 044fe1fb9872..32838ed89ee7 100644 --- a/drivers/gpu/drm/i915/intel_ddi.c +++ b/drivers/gpu/drm/i915/intel_ddi.c | |||
@@ -1069,6 +1069,7 @@ static uint32_t icl_pll_to_ddi_pll_sel(struct intel_encoder *encoder, | |||
1069 | switch (id) { | 1069 | switch (id) { |
1070 | default: | 1070 | default: |
1071 | MISSING_CASE(id); | 1071 | MISSING_CASE(id); |
1072 | /* fall through */ | ||
1072 | case DPLL_ID_ICL_DPLL0: | 1073 | case DPLL_ID_ICL_DPLL0: |
1073 | case DPLL_ID_ICL_DPLL1: | 1074 | case DPLL_ID_ICL_DPLL1: |
1074 | return DDI_CLK_SEL_NONE; | 1075 | return DDI_CLK_SEL_NONE; |
@@ -1983,15 +1984,50 @@ out: | |||
1983 | return ret; | 1984 | return ret; |
1984 | } | 1985 | } |
1985 | 1986 | ||
1986 | static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder) | 1987 | static inline enum intel_display_power_domain |
1988 | intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp) | ||
1989 | { | ||
1990 | /* CNL HW requires corresponding AUX IOs to be powered up for PSR with | ||
1991 | * DC states enabled at the same time, while for driver initiated AUX | ||
1992 | * transfers we need the same AUX IOs to be powered but with DC states | ||
1993 | * disabled. Accordingly use the AUX power domain here which leaves DC | ||
1994 | * states enabled. | ||
1995 | * However, for non-A AUX ports the corresponding non-EDP transcoders | ||
1996 | * would have already enabled power well 2 and DC_OFF. This means we can | ||
1997 | * acquire a wider POWER_DOMAIN_AUX_{B,C,D,F} reference instead of a | ||
1998 | * specific AUX_IO reference without powering up any extra wells. | ||
1999 | * Note that PSR is enabled only on Port A even though this function | ||
2000 | * returns the correct domain for other ports too. | ||
2001 | */ | ||
2002 | return intel_dp->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A : | ||
2003 | intel_dp->aux_power_domain; | ||
2004 | } | ||
2005 | |||
2006 | static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder, | ||
2007 | struct intel_crtc_state *crtc_state) | ||
1987 | { | 2008 | { |
1988 | struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); | 2009 | struct intel_digital_port *dig_port; |
1989 | enum pipe pipe; | 2010 | u64 domains; |
1990 | 2011 | ||
1991 | if (intel_ddi_get_hw_state(encoder, &pipe)) | 2012 | /* |
1992 | return BIT_ULL(dig_port->ddi_io_power_domain); | 2013 | * TODO: Add support for MST encoders. Atm, the following should never |
2014 | * happen since fake-MST encoders don't set their get_power_domains() | ||
2015 | * hook. | ||
2016 | */ | ||
2017 | if (WARN_ON(intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST))) | ||
2018 | return 0; | ||
1993 | 2019 | ||
1994 | return 0; | 2020 | dig_port = enc_to_dig_port(&encoder->base); |
2021 | domains = BIT_ULL(dig_port->ddi_io_power_domain); | ||
2022 | |||
2023 | /* AUX power is only needed for (e)DP mode, not for HDMI. */ | ||
2024 | if (intel_crtc_has_dp_encoder(crtc_state)) { | ||
2025 | struct intel_dp *intel_dp = &dig_port->dp; | ||
2026 | |||
2027 | domains |= BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp)); | ||
2028 | } | ||
2029 | |||
2030 | return domains; | ||
1995 | } | 2031 | } |
1996 | 2032 | ||
1997 | void intel_ddi_enable_pipe_clock(const struct intel_crtc_state *crtc_state) | 2033 | void intel_ddi_enable_pipe_clock(const struct intel_crtc_state *crtc_state) |
@@ -2631,6 +2667,9 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder, | |||
2631 | 2667 | ||
2632 | WARN_ON(is_mst && (port == PORT_A || port == PORT_E)); | 2668 | WARN_ON(is_mst && (port == PORT_A || port == PORT_E)); |
2633 | 2669 | ||
2670 | intel_display_power_get(dev_priv, | ||
2671 | intel_ddi_main_link_aux_domain(intel_dp)); | ||
2672 | |||
2634 | intel_dp_set_link_params(intel_dp, crtc_state->port_clock, | 2673 | intel_dp_set_link_params(intel_dp, crtc_state->port_clock, |
2635 | crtc_state->lane_count, is_mst); | 2674 | crtc_state->lane_count, is_mst); |
2636 | 2675 | ||
@@ -2775,6 +2814,9 @@ static void intel_ddi_post_disable_dp(struct intel_encoder *encoder, | |||
2775 | intel_display_power_put(dev_priv, dig_port->ddi_io_power_domain); | 2814 | intel_display_power_put(dev_priv, dig_port->ddi_io_power_domain); |
2776 | 2815 | ||
2777 | intel_ddi_clk_disable(encoder); | 2816 | intel_ddi_clk_disable(encoder); |
2817 | |||
2818 | intel_display_power_put(dev_priv, | ||
2819 | intel_ddi_main_link_aux_domain(intel_dp)); | ||
2778 | } | 2820 | } |
2779 | 2821 | ||
2780 | static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder, | 2822 | static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder, |