diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_display.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_display.c | 113 | 
1 files changed, 24 insertions, 89 deletions
| diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 16603d591f56..763ab569d8f3 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -53,7 +53,6 @@  #include "i915_utils.h"  #include "i9xx_plane.h"  #include "i9xx_wm.h" -#include "icl_dsi.h"  #include "intel_atomic.h"  #include "intel_atomic_plane.h"  #include "intel_audio.h" @@ -1750,7 +1749,7 @@ bool intel_phy_is_combo(struct drm_i915_private *dev_priv, enum phy phy)  		return phy <= PHY_E;  	else if (IS_DG1(dev_priv) || IS_ROCKETLAKE(dev_priv))  		return phy <= PHY_D; -	else if (IS_JSL_EHL(dev_priv)) +	else if (IS_JASPERLAKE(dev_priv) || IS_ELKHARTLAKE(dev_priv))  		return phy <= PHY_C;  	else if (IS_ALDERLAKE_P(dev_priv) || IS_DISPLAY_VER(dev_priv, 11, 12))  		return phy <= PHY_B; @@ -1802,7 +1801,8 @@ enum phy intel_port_to_phy(struct drm_i915_private *i915, enum port port)  		return PHY_B + port - PORT_TC1;  	else if ((IS_DG1(i915) || IS_ROCKETLAKE(i915)) && port >= PORT_TC1)  		return PHY_C + port - PORT_TC1; -	else if (IS_JSL_EHL(i915) && port == PORT_D) +	else if ((IS_JASPERLAKE(i915) || IS_ELKHARTLAKE(i915)) && +		 port == PORT_D)  		return PHY_A;  	return PHY_A + port - PORT_A; @@ -3153,6 +3153,10 @@ static void bdw_set_pipe_misc(const struct intel_crtc_state *crtc_state)  	if (DISPLAY_VER(dev_priv) >= 12)  		val |= PIPE_MISC_PIXEL_ROUNDING_TRUNC; +	/* allow PSR with sprite enabled */ +	if (IS_BROADWELL(dev_priv)) +		val |= PIPE_MISC_PSR_MASK_SPRITE_ENABLE; +  	intel_de_write(dev_priv, PIPE_MISC(crtc->pipe), val);  } @@ -7143,7 +7147,11 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)  		 */  		intel_uncore_arm_unclaimed_mmio_detection(&dev_priv->uncore);  	} -	intel_display_power_put(dev_priv, POWER_DOMAIN_DC_OFF, wakeref); +	/* +	 * Delay re-enabling DC states by 17 ms to avoid the off->on->off +	 * toggling overhead at and above 60 FPS. +	 */ +	intel_display_power_put_async_delay(dev_priv, POWER_DOMAIN_DC_OFF, wakeref, 17);  	intel_runtime_pm_put(&dev_priv->runtime_pm, state->wakeref);  	/* @@ -7370,7 +7378,7 @@ static bool intel_ddi_crt_present(struct drm_i915_private *dev_priv)  	if (DISPLAY_VER(dev_priv) >= 9)  		return false; -	if (IS_HSW_ULT(dev_priv) || IS_BDW_ULT(dev_priv)) +	if (IS_HASWELL_ULT(dev_priv) || IS_BROADWELL_ULT(dev_priv))  		return false;  	if (HAS_PCH_LPT_H(dev_priv) && @@ -7387,6 +7395,12 @@ static bool intel_ddi_crt_present(struct drm_i915_private *dev_priv)  	return true;  } +bool assert_port_valid(struct drm_i915_private *i915, enum port port) +{ +	return !drm_WARN(&i915->drm, !(DISPLAY_RUNTIME_INFO(i915)->port_mask & BIT(port)), +			 "Platform does not support port %c\n", port_name(port)); +} +  void intel_setup_outputs(struct drm_i915_private *dev_priv)  {  	struct intel_encoder *encoder; @@ -7397,93 +7411,14 @@ void intel_setup_outputs(struct drm_i915_private *dev_priv)  	if (!HAS_DISPLAY(dev_priv))  		return; -	if (IS_METEORLAKE(dev_priv)) { -		intel_ddi_init(dev_priv, PORT_A); -		intel_ddi_init(dev_priv, PORT_B); -		intel_ddi_init(dev_priv, PORT_TC1); -		intel_ddi_init(dev_priv, PORT_TC2); -		intel_ddi_init(dev_priv, PORT_TC3); -		intel_ddi_init(dev_priv, PORT_TC4); -	} else if (IS_DG2(dev_priv)) { -		intel_ddi_init(dev_priv, PORT_A); -		intel_ddi_init(dev_priv, PORT_B); -		intel_ddi_init(dev_priv, PORT_C); -		intel_ddi_init(dev_priv, PORT_D_XELPD); -		intel_ddi_init(dev_priv, PORT_TC1); -	} else if (IS_ALDERLAKE_P(dev_priv)) { -		intel_ddi_init(dev_priv, PORT_A); -		intel_ddi_init(dev_priv, PORT_B); -		intel_ddi_init(dev_priv, PORT_TC1); -		intel_ddi_init(dev_priv, PORT_TC2); -		intel_ddi_init(dev_priv, PORT_TC3); -		intel_ddi_init(dev_priv, PORT_TC4); -		icl_dsi_init(dev_priv); -	} else if (IS_ALDERLAKE_S(dev_priv)) { -		intel_ddi_init(dev_priv, PORT_A); -		intel_ddi_init(dev_priv, PORT_TC1); -		intel_ddi_init(dev_priv, PORT_TC2); -		intel_ddi_init(dev_priv, PORT_TC3); -		intel_ddi_init(dev_priv, PORT_TC4); -	} else if (IS_DG1(dev_priv) || IS_ROCKETLAKE(dev_priv)) { -		intel_ddi_init(dev_priv, PORT_A); -		intel_ddi_init(dev_priv, PORT_B); -		intel_ddi_init(dev_priv, PORT_TC1); -		intel_ddi_init(dev_priv, PORT_TC2); -	} else if (DISPLAY_VER(dev_priv) >= 12) { -		intel_ddi_init(dev_priv, PORT_A); -		intel_ddi_init(dev_priv, PORT_B); -		intel_ddi_init(dev_priv, PORT_TC1); -		intel_ddi_init(dev_priv, PORT_TC2); -		intel_ddi_init(dev_priv, PORT_TC3); -		intel_ddi_init(dev_priv, PORT_TC4); -		intel_ddi_init(dev_priv, PORT_TC5); -		intel_ddi_init(dev_priv, PORT_TC6); -		icl_dsi_init(dev_priv); -	} else if (IS_JSL_EHL(dev_priv)) { -		intel_ddi_init(dev_priv, PORT_A); -		intel_ddi_init(dev_priv, PORT_B); -		intel_ddi_init(dev_priv, PORT_C); -		intel_ddi_init(dev_priv, PORT_D); -		icl_dsi_init(dev_priv); -	} else if (DISPLAY_VER(dev_priv) == 11) { -		intel_ddi_init(dev_priv, PORT_A); -		intel_ddi_init(dev_priv, PORT_B); -		intel_ddi_init(dev_priv, PORT_C); -		intel_ddi_init(dev_priv, PORT_D); -		intel_ddi_init(dev_priv, PORT_E); -		intel_ddi_init(dev_priv, PORT_F); -		icl_dsi_init(dev_priv); -	} else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) { -		intel_ddi_init(dev_priv, PORT_A); -		intel_ddi_init(dev_priv, PORT_B); -		intel_ddi_init(dev_priv, PORT_C); -		vlv_dsi_init(dev_priv); -	} else if (DISPLAY_VER(dev_priv) >= 9) { -		intel_ddi_init(dev_priv, PORT_A); -		intel_ddi_init(dev_priv, PORT_B); -		intel_ddi_init(dev_priv, PORT_C); -		intel_ddi_init(dev_priv, PORT_D); -		intel_ddi_init(dev_priv, PORT_E); -	} else if (HAS_DDI(dev_priv)) { -		u32 found; - +	if (HAS_DDI(dev_priv)) {  		if (intel_ddi_crt_present(dev_priv))  			intel_crt_init(dev_priv); -		/* Haswell uses DDI functions to detect digital outputs. */ -		found = intel_de_read(dev_priv, DDI_BUF_CTL(PORT_A)) & DDI_INIT_DISPLAY_DETECTED; -		if (found) -			intel_ddi_init(dev_priv, PORT_A); - -		found = intel_de_read(dev_priv, SFUSE_STRAP); -		if (found & SFUSE_STRAP_DDIB_DETECTED) -			intel_ddi_init(dev_priv, PORT_B); -		if (found & SFUSE_STRAP_DDIC_DETECTED) -			intel_ddi_init(dev_priv, PORT_C); -		if (found & SFUSE_STRAP_DDID_DETECTED) -			intel_ddi_init(dev_priv, PORT_D); -		if (found & SFUSE_STRAP_DDIF_DETECTED) -			intel_ddi_init(dev_priv, PORT_F); +		intel_bios_for_each_encoder(dev_priv, intel_ddi_init); + +		if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) +			vlv_dsi_init(dev_priv);  	} else if (HAS_PCH_SPLIT(dev_priv)) {  		int found; | 
