diff options
-rw-r--r-- | drivers/gpu/drm/i915/intel_cdclk.c | 41 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 20 |
2 files changed, 37 insertions, 24 deletions
diff --git a/drivers/gpu/drm/i915/intel_cdclk.c b/drivers/gpu/drm/i915/intel_cdclk.c index 32d24c69da3c..704ddb4d3ca7 100644 --- a/drivers/gpu/drm/i915/intel_cdclk.c +++ b/drivers/gpu/drm/i915/intel_cdclk.c | |||
@@ -2302,9 +2302,44 @@ static int bdw_modeset_calc_cdclk(struct drm_atomic_state *state) | |||
2302 | return 0; | 2302 | return 0; |
2303 | } | 2303 | } |
2304 | 2304 | ||
2305 | static int skl_dpll0_vco(struct intel_atomic_state *intel_state) | ||
2306 | { | ||
2307 | struct drm_i915_private *dev_priv = to_i915(intel_state->base.dev); | ||
2308 | struct intel_crtc *crtc; | ||
2309 | struct intel_crtc_state *crtc_state; | ||
2310 | int vco, i; | ||
2311 | |||
2312 | vco = intel_state->cdclk.logical.vco; | ||
2313 | if (!vco) | ||
2314 | vco = dev_priv->skl_preferred_vco_freq; | ||
2315 | |||
2316 | for_each_new_intel_crtc_in_state(intel_state, crtc, crtc_state, i) { | ||
2317 | if (!crtc_state->base.enable) | ||
2318 | continue; | ||
2319 | |||
2320 | if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) | ||
2321 | continue; | ||
2322 | |||
2323 | /* | ||
2324 | * DPLL0 VCO may need to be adjusted to get the correct | ||
2325 | * clock for eDP. This will affect cdclk as well. | ||
2326 | */ | ||
2327 | switch (crtc_state->port_clock / 2) { | ||
2328 | case 108000: | ||
2329 | case 216000: | ||
2330 | vco = 8640000; | ||
2331 | break; | ||
2332 | default: | ||
2333 | vco = 8100000; | ||
2334 | break; | ||
2335 | } | ||
2336 | } | ||
2337 | |||
2338 | return vco; | ||
2339 | } | ||
2340 | |||
2305 | static int skl_modeset_calc_cdclk(struct drm_atomic_state *state) | 2341 | static int skl_modeset_calc_cdclk(struct drm_atomic_state *state) |
2306 | { | 2342 | { |
2307 | struct drm_i915_private *dev_priv = to_i915(state->dev); | ||
2308 | struct intel_atomic_state *intel_state = to_intel_atomic_state(state); | 2343 | struct intel_atomic_state *intel_state = to_intel_atomic_state(state); |
2309 | int min_cdclk, cdclk, vco; | 2344 | int min_cdclk, cdclk, vco; |
2310 | 2345 | ||
@@ -2312,9 +2347,7 @@ static int skl_modeset_calc_cdclk(struct drm_atomic_state *state) | |||
2312 | if (min_cdclk < 0) | 2347 | if (min_cdclk < 0) |
2313 | return min_cdclk; | 2348 | return min_cdclk; |
2314 | 2349 | ||
2315 | vco = intel_state->cdclk.logical.vco; | 2350 | vco = skl_dpll0_vco(intel_state); |
2316 | if (!vco) | ||
2317 | vco = dev_priv->skl_preferred_vco_freq; | ||
2318 | 2351 | ||
2319 | /* | 2352 | /* |
2320 | * FIXME should also account for plane ratio | 2353 | * FIXME should also account for plane ratio |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 9a4a51e79fa1..b7b4cfdeb974 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -1881,26 +1881,6 @@ found: | |||
1881 | reduce_m_n); | 1881 | reduce_m_n); |
1882 | } | 1882 | } |
1883 | 1883 | ||
1884 | /* | ||
1885 | * DPLL0 VCO may need to be adjusted to get the correct | ||
1886 | * clock for eDP. This will affect cdclk as well. | ||
1887 | */ | ||
1888 | if (intel_dp_is_edp(intel_dp) && IS_GEN9_BC(dev_priv)) { | ||
1889 | int vco; | ||
1890 | |||
1891 | switch (pipe_config->port_clock / 2) { | ||
1892 | case 108000: | ||
1893 | case 216000: | ||
1894 | vco = 8640000; | ||
1895 | break; | ||
1896 | default: | ||
1897 | vco = 8100000; | ||
1898 | break; | ||
1899 | } | ||
1900 | |||
1901 | to_intel_atomic_state(pipe_config->base.state)->cdclk.logical.vco = vco; | ||
1902 | } | ||
1903 | |||
1904 | if (!HAS_DDI(dev_priv)) | 1884 | if (!HAS_DDI(dev_priv)) |
1905 | intel_dp_set_clock(encoder, pipe_config); | 1885 | intel_dp_set_clock(encoder, pipe_config); |
1906 | 1886 | ||