static u32 i915_get_vblank_counter(struct drm_device *dev, unsigned int pipe)
 {
        struct drm_i915_private *dev_priv = to_i915(dev);
+       struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
+       const struct drm_display_mode *mode = &vblank->hwmode;
        i915_reg_t high_frame, low_frame;
        u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal;
-       const struct drm_display_mode *mode = &dev->vblank[pipe].hwmode;
        unsigned long irqflags;
 
+       /*
+        * On i965gm TV output the frame counter only works up to
+        * the point when we enable the TV encoder. After that the
+        * frame counter ceases to work and reads zero. We need a
+        * vblank wait before enabling the TV encoder and so we
+        * have to enable vblank interrupts while the frame counter
+        * is still in a working state. However the core vblank code
+        * does not like us returning non-zero frame counter values
+        * when we've told it that we don't have a working frame
+        * counter. Thus we must stop non-zero values leaking out.
+        */
+       if (!vblank->max_vblank_count)
+               return 0;
+
        htotal = mode->crtc_htotal;
        hsync_start = mode->crtc_hsync_start;
        vbl_start = mode->crtc_vblank_start;
        if (INTEL_GEN(dev_priv) >= 8)
                rps->pm_intrmsk_mbz |= GEN8_PMINTR_DISABLE_REDIRECT_TO_GUC;
 
-       if (IS_GEN(dev_priv, 2)) {
-               /* Gen2 doesn't have a hardware frame counter */
-               dev->max_vblank_count = 0;
-       } else if (IS_G4X(dev_priv) || INTEL_GEN(dev_priv) >= 5) {
-               dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */
+       if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
                dev->driver->get_vblank_counter = g4x_get_vblank_counter;
-       } else {
+       else if (INTEL_GEN(dev_priv) >= 3)
                dev->driver->get_vblank_counter = i915_get_vblank_counter;
-               dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
-       }
 
        /*
         * Opt out of the vblank disable timer on everything except gen2.
 
                return crtc->pipe;
 }
 
+static u32 intel_crtc_max_vblank_count(const struct intel_crtc_state *crtc_state)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
+
+       /*
+        * On i965gm the hardware frame counter reads
+        * zero when the TV encoder is enabled :(
+        */
+       if (IS_I965GM(dev_priv) &&
+           (crtc_state->output_types & BIT(INTEL_OUTPUT_TVOUT)))
+               return 0;
+
+       if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
+               return 0xffffffff; /* full 32 bit counter */
+       else if (INTEL_GEN(dev_priv) >= 3)
+               return 0xffffff; /* only 24 bits of frame count */
+       else
+               return 0; /* Gen2 doesn't have a hardware frame counter */
+}
+
+static void intel_crtc_vblank_on(const struct intel_crtc_state *crtc_state)
+{
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
+
+       drm_crtc_set_max_vblank_count(&crtc->base,
+                                     intel_crtc_max_vblank_count(crtc_state));
+       drm_crtc_vblank_on(&crtc->base);
+}
+
 static void intel_enable_pipe(const struct intel_crtc_state *new_crtc_state)
 {
        struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->base.crtc);
         * when it's derived from the timestamps. So let's wait for the
         * pipe to start properly before we call drm_crtc_vblank_on()
         */
-       if (dev_priv->drm.max_vblank_count == 0)
+       if (intel_crtc_max_vblank_count(new_crtc_state) == 0)
                intel_wait_for_pipe_scanline_moving(crtc);
 }
 
                ironlake_pch_enable(old_intel_state, pipe_config);
 
        assert_vblank_disabled(crtc);
-       drm_crtc_vblank_on(crtc);
+       intel_crtc_vblank_on(pipe_config);
 
        intel_encoders_enable(crtc, pipe_config, old_state);
 
                intel_ddi_set_vc_payload_alloc(pipe_config, true);
 
        assert_vblank_disabled(crtc);
-       drm_crtc_vblank_on(crtc);
+       intel_crtc_vblank_on(pipe_config);
 
        intel_encoders_enable(crtc, pipe_config, old_state);
 
        intel_enable_pipe(pipe_config);
 
        assert_vblank_disabled(crtc);
-       drm_crtc_vblank_on(crtc);
+       intel_crtc_vblank_on(pipe_config);
 
        intel_encoders_enable(crtc, pipe_config, old_state);
 }
        intel_enable_pipe(pipe_config);
 
        assert_vblank_disabled(crtc);
-       drm_crtc_vblank_on(crtc);
+       intel_crtc_vblank_on(pipe_config);
 
        intel_encoders_enable(crtc, pipe_config, old_state);
 }
 u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc)
 {
        struct drm_device *dev = crtc->base.dev;
+       struct drm_vblank_crtc *vblank = &dev->vblank[drm_crtc_index(&crtc->base)];
 
-       if (!dev->max_vblank_count)
+       if (!vblank->max_vblank_count)
                return (u32)drm_crtc_accurate_vblank_count(&crtc->base);
 
        return dev->driver->get_vblank_counter(dev, crtc->pipe);
         * waits, so we need vblank interrupts restored beforehand.
         */
        for_each_intel_crtc(&dev_priv->drm, crtc) {
+               crtc_state = to_intel_crtc_state(crtc->base.state);
+
                drm_crtc_vblank_reset(&crtc->base);
 
-               if (crtc->base.state->active)
-                       drm_crtc_vblank_on(&crtc->base);
+               if (crtc_state->base.active)
+                       intel_crtc_vblank_on(crtc_state);
        }
 
        intel_sanitize_plane_mapping(dev_priv);