]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/gpu/drm/i915/intel_cdclk.c
drm/i915: Force 2*96 MHz cdclk on glk/cnl when audio power is enabled
[mirror_ubuntu-bionic-kernel.git] / drivers / gpu / drm / i915 / intel_cdclk.c
index 2f678aff46f85cdbfced1fc1aa1a5fd38426e194..cb23023d9da188e371b95d449c93a66f146476a6 100644 (file)
@@ -1819,19 +1819,8 @@ int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state)
        /*
         * According to BSpec, "The CD clock frequency must be at least twice
         * the frequency of the Azalia BCLK." and BCLK is 96 MHz by default.
-        *
-        * FIXME: Check the actual, not default, BCLK being used.
-        *
-        * FIXME: This does not depend on ->has_audio because the higher CDCLK
-        * is required for audio probe, also when there are no audio capable
-        * displays connected at probe time. This leads to unnecessarily high
-        * CDCLK when audio is not required.
-        *
-        * FIXME: This limit is only applied when there are displays connected
-        * at probe time. If we probe without displays, we'll still end up using
-        * the platform minimum CDCLK, failing audio probe.
         */
-       if (INTEL_GEN(dev_priv) >= 9)
+       if (crtc_state->has_audio && INTEL_GEN(dev_priv) >= 9)
                min_cdclk = max(2 * 96000, min_cdclk);
 
        if (min_cdclk > dev_priv->max_cdclk_freq) {
@@ -1863,7 +1852,7 @@ static int intel_compute_min_cdclk(struct drm_atomic_state *state)
                intel_state->min_cdclk[i] = min_cdclk;
        }
 
-       min_cdclk = 0;
+       min_cdclk = intel_state->cdclk.force_min_cdclk;
        for_each_pipe(dev_priv, pipe)
                min_cdclk = max(intel_state->min_cdclk[pipe], min_cdclk);
 
@@ -1885,7 +1874,8 @@ static int vlv_modeset_calc_cdclk(struct drm_atomic_state *state)
        intel_state->cdclk.logical.cdclk = cdclk;
 
        if (!intel_state->active_crtcs) {
-               cdclk = vlv_calc_cdclk(dev_priv, 0);
+               cdclk = vlv_calc_cdclk(dev_priv,
+                                      intel_state->cdclk.force_min_cdclk);
 
                intel_state->cdclk.actual.cdclk = cdclk;
        } else {
@@ -1914,7 +1904,7 @@ static int bdw_modeset_calc_cdclk(struct drm_atomic_state *state)
        intel_state->cdclk.logical.cdclk = cdclk;
 
        if (!intel_state->active_crtcs) {
-               cdclk = bdw_calc_cdclk(0);
+               cdclk = bdw_calc_cdclk(intel_state->cdclk.force_min_cdclk);
 
                intel_state->cdclk.actual.cdclk = cdclk;
        } else {
@@ -1982,7 +1972,7 @@ static int skl_modeset_calc_cdclk(struct drm_atomic_state *state)
        intel_state->cdclk.logical.cdclk = cdclk;
 
        if (!intel_state->active_crtcs) {
-               cdclk = skl_calc_cdclk(0, vco);
+               cdclk = skl_calc_cdclk(intel_state->cdclk.force_min_cdclk, vco);
 
                intel_state->cdclk.actual.vco = vco;
                intel_state->cdclk.actual.cdclk = cdclk;
@@ -2017,10 +2007,10 @@ static int bxt_modeset_calc_cdclk(struct drm_atomic_state *state)
 
        if (!intel_state->active_crtcs) {
                if (IS_GEMINILAKE(dev_priv)) {
-                       cdclk = glk_calc_cdclk(0);
+                       cdclk = glk_calc_cdclk(intel_state->cdclk.force_min_cdclk);
                        vco = glk_de_pll_vco(dev_priv, cdclk);
                } else {
-                       cdclk = bxt_calc_cdclk(0);
+                       cdclk = bxt_calc_cdclk(intel_state->cdclk.force_min_cdclk);
                        vco = bxt_de_pll_vco(dev_priv, cdclk);
                }
 
@@ -2051,7 +2041,7 @@ static int cnl_modeset_calc_cdclk(struct drm_atomic_state *state)
        intel_state->cdclk.logical.cdclk = cdclk;
 
        if (!intel_state->active_crtcs) {
-               cdclk = cnl_calc_cdclk(0);
+               cdclk = cnl_calc_cdclk(intel_state->cdclk.force_min_cdclk);
                vco = cnl_cdclk_pll_vco(dev_priv, cdclk);
 
                intel_state->cdclk.actual.vco = vco;