*
         * Should measure whether using a lower cdclk w/o IPS
         */
-       return ilk_pipe_pixel_rate(pipe_config) <=
+       return pipe_config->pixel_rate <=
                dev_priv->max_cdclk_freq * 95 / 100;
 }
 
                (crtc->pipe == PIPE_A || IS_I915G(dev_priv));
 }
 
+static void intel_crtc_compute_pixel_rate(struct intel_crtc_state *crtc_state)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
+
+       if (HAS_GMCH_DISPLAY(dev_priv))
+               /* FIXME calculate proper pipe pixel rate for GMCH pfit */
+               crtc_state->pixel_rate =
+                       crtc_state->base.adjusted_mode.crtc_clock;
+       else
+               crtc_state->pixel_rate =
+                       ilk_pipe_pixel_rate(crtc_state);
+}
+
 static int intel_crtc_compute_config(struct intel_crtc *crtc,
                                     struct intel_crtc_state *pipe_config)
 {
                adjusted_mode->crtc_hsync_start == adjusted_mode->crtc_hdisplay)
                return -EINVAL;
 
+       intel_crtc_compute_pixel_rate(pipe_config);
+
        if (HAS_IPS(dev_priv))
                hsw_compute_ips_config(crtc, pipe_config);
 
                        continue;
                }
 
-               pixel_rate = ilk_pipe_pixel_rate(crtc_state);
+               pixel_rate = crtc_state->pixel_rate;
 
                if (IS_BROADWELL(dev_priv) || IS_GEN9(dev_priv))
                        pixel_rate = bdw_adjust_min_pipe_pixel_rate(crtc_state,
        DRM_DEBUG_KMS("adjusted mode:\n");
        drm_mode_debug_printmodeline(&pipe_config->base.adjusted_mode);
        intel_dump_crtc_timings(&pipe_config->base.adjusted_mode);
-       DRM_DEBUG_KMS("port clock: %d, pipe src size: %dx%d\n",
+       DRM_DEBUG_KMS("port clock: %d, pipe src size: %dx%d, pixel rate %d\n",
                      pipe_config->port_clock,
-                     pipe_config->pipe_src_w, pipe_config->pipe_src_h);
+                     pipe_config->pipe_src_w, pipe_config->pipe_src_h,
+                     pipe_config->pixel_rate);
 
        if (INTEL_GEN(dev_priv) >= 9)
                DRM_DEBUG_KMS("num_scalers: %d, scaler_users: 0x%x, scaler_id: %d\n",
                }
 
                PIPE_CONF_CHECK_I(scaler_state.scaler_id);
+               PIPE_CONF_CHECK_CLOCK_FUZZY(pixel_rate);
        }
 
        /* BDW+ don't expose a synchronous way to read the state */
                }
        }
 
+       intel_crtc_compute_pixel_rate(pipe_config);
+
        if (!new_crtc_state->active)
                return;
 
                         */
                        crtc_state->base.mode.private_flags = I915_MODE_FLAG_INHERITED;
 
-                       if (INTEL_GEN(dev_priv) >= 9 || IS_BROADWELL(dev_priv))
-                               pixclk = ilk_pipe_pixel_rate(crtc_state);
-                       else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
-                               pixclk = crtc_state->base.adjusted_mode.crtc_clock;
+                       intel_crtc_compute_pixel_rate(crtc_state);
+
+                       if (INTEL_GEN(dev_priv) >= 9 || IS_BROADWELL(dev_priv) ||
+                           IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
+                               pixclk = crtc_state->pixel_rate;
                        else
                                WARN_ON(dev_priv->display.modeset_calc_cdclk);
 
 
 
        cpp = pstate->base.fb->format->cpp[0];
 
-       method1 = ilk_wm_method1(ilk_pipe_pixel_rate(cstate), cpp, mem_value);
+       method1 = ilk_wm_method1(cstate->pixel_rate, cpp, mem_value);
 
        if (!is_lp)
                return method1;
 
-       method2 = ilk_wm_method2(ilk_pipe_pixel_rate(cstate),
+       method2 = ilk_wm_method2(cstate->pixel_rate,
                                 cstate->base.adjusted_mode.crtc_htotal,
                                 drm_rect_width(&pstate->base.dst),
                                 cpp, mem_value);
 
        cpp = pstate->base.fb->format->cpp[0];
 
-       method1 = ilk_wm_method1(ilk_pipe_pixel_rate(cstate), cpp, mem_value);
-       method2 = ilk_wm_method2(ilk_pipe_pixel_rate(cstate),
+       method1 = ilk_wm_method1(cstate->pixel_rate, cpp, mem_value);
+       method2 = ilk_wm_method2(cstate->pixel_rate,
                                 cstate->base.adjusted_mode.crtc_htotal,
                                 drm_rect_width(&pstate->base.dst),
                                 cpp, mem_value);
        if (!cstate->base.active)
                return 0;
 
-       return ilk_wm_method2(ilk_pipe_pixel_rate(cstate),
+       return ilk_wm_method2(cstate->pixel_rate,
                              cstate->base.adjusted_mode.crtc_htotal,
                              width, cpp, mem_value);
 }
         * Adjusted plane pixel rate is just the pipe's adjusted pixel rate
         * with additional adjustments for plane-specific scaling.
         */
-       adjusted_pixel_rate = ilk_pipe_pixel_rate(cstate);
+       adjusted_pixel_rate = cstate->pixel_rate;
        downscale_amount = skl_plane_downscale_amount(pstate);
 
        pixel_rate = adjusted_pixel_rate * downscale_amount >> 16;
        if (!cstate->base.active)
                return 0;
 
-       pixel_rate = ilk_pipe_pixel_rate(cstate);
+       pixel_rate = cstate->pixel_rate;
 
        if (WARN_ON(pixel_rate == 0))
                return 0;