diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_dpll.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_dpll.c | 41 | 
1 files changed, 36 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_dpll.c b/drivers/gpu/drm/i915/display/intel_dpll.c index 4e9c18be7e1f..999badfe2906 100644 --- a/drivers/gpu/drm/i915/display/intel_dpll.c +++ b/drivers/gpu/drm/i915/display/intel_dpll.c @@ -8,6 +8,7 @@  #include "i915_reg.h"  #include "intel_crtc.h" +#include "intel_cx0_phy.h"  #include "intel_de.h"  #include "intel_display.h"  #include "intel_display_types.h" @@ -995,6 +996,32 @@ static int dg2_crtc_compute_clock(struct intel_atomic_state *state,  	return 0;  } +static int mtl_crtc_compute_clock(struct intel_atomic_state *state, +				  struct intel_crtc *crtc) +{ +	struct drm_i915_private *i915 = to_i915(state->base.dev); +	struct intel_crtc_state *crtc_state = +		intel_atomic_get_new_crtc_state(state, crtc); +	struct intel_encoder *encoder = +		intel_get_crtc_new_encoder(state, crtc_state); +	enum phy phy = intel_port_to_phy(i915, encoder->port); +	int ret; + +	ret = intel_cx0pll_calc_state(crtc_state, encoder); +	if (ret) +		return ret; + +	/* TODO: Do the readback via intel_compute_shared_dplls() */ +	if (intel_is_c10phy(i915, phy)) +		crtc_state->port_clock = intel_c10pll_calc_port_clock(encoder, &crtc_state->cx0pll_state.c10); +	else +		crtc_state->port_clock = intel_c20pll_calc_port_clock(encoder, &crtc_state->cx0pll_state.c20); + +	crtc_state->hw.adjusted_mode.crtc_clock = intel_crtc_dotclock(crtc_state); + +	return 0; +} +  static bool ilk_needs_fb_cb_tune(const struct dpll *dpll, int factor)  {  	return dpll->m < factor * dpll->n; @@ -1423,6 +1450,10 @@ static int i8xx_crtc_compute_clock(struct intel_atomic_state *state,  	return 0;  } +static const struct intel_dpll_funcs mtl_dpll_funcs = { +	.crtc_compute_clock = mtl_crtc_compute_clock, +}; +  static const struct intel_dpll_funcs dg2_dpll_funcs = {  	.crtc_compute_clock = dg2_crtc_compute_clock,  }; @@ -1517,7 +1548,9 @@ int intel_dpll_crtc_get_shared_dpll(struct intel_atomic_state *state,  void  intel_dpll_init_clock_hook(struct drm_i915_private *dev_priv)  { -	if (IS_DG2(dev_priv)) +	if (DISPLAY_VER(dev_priv) >= 14) +		dev_priv->display.funcs.dpll = &mtl_dpll_funcs; +	else if (IS_DG2(dev_priv))  		dev_priv->display.funcs.dpll = &dg2_dpll_funcs;  	else if (DISPLAY_VER(dev_priv) >= 9 || HAS_DDI(dev_priv))  		dev_priv->display.funcs.dpll = &hsw_dpll_funcs; @@ -1760,13 +1793,11 @@ static void chv_prepare_pll(const struct intel_crtc_state *crtc_state)  	enum pipe pipe = crtc->pipe;  	enum dpio_channel port = vlv_pipe_to_channel(pipe);  	u32 loopfilter, tribuf_calcntr; -	u32 bestn, bestm1, bestm2, bestp1, bestp2, bestm2_frac; +	u32 bestm2, bestp1, bestp2, bestm2_frac;  	u32 dpio_val;  	int vco; -	bestn = crtc_state->dpll.n;  	bestm2_frac = crtc_state->dpll.m2 & 0x3fffff; -	bestm1 = crtc_state->dpll.m1;  	bestm2 = crtc_state->dpll.m2 >> 22;  	bestp1 = crtc_state->dpll.p1;  	bestp2 = crtc_state->dpll.p2; @@ -2047,7 +2078,7 @@ static void assert_pll(struct drm_i915_private *dev_priv,  	bool cur_state;  	cur_state = intel_de_read(dev_priv, DPLL(pipe)) & DPLL_VCO_ENABLE; -	I915_STATE_WARN(cur_state != state, +	I915_STATE_WARN(dev_priv, cur_state != state,  			"PLL state assertion failure (expected %s, current %s)\n",  			str_on_off(state), str_on_off(cur_state));  }  |