|
@@ -107,13 +107,21 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state)
|
|
VBLANK_EVASION_TIME_US);
|
|
VBLANK_EVASION_TIME_US);
|
|
max = vblank_start - 1;
|
|
max = vblank_start - 1;
|
|
|
|
|
|
- local_irq_disable();
|
|
|
|
-
|
|
|
|
if (min <= 0 || max <= 0)
|
|
if (min <= 0 || max <= 0)
|
|
- return;
|
|
|
|
|
|
+ goto irq_disable;
|
|
|
|
|
|
if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
|
|
if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
|
|
- return;
|
|
|
|
|
|
+ goto irq_disable;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Wait for psr to idle out after enabling the VBL interrupts
|
|
|
|
+ * VBL interrupts will start the PSR exit and prevent a PSR
|
|
|
|
+ * re-entry as well.
|
|
|
|
+ */
|
|
|
|
+ if (CAN_PSR(dev_priv) && intel_psr_wait_for_idle(dev_priv))
|
|
|
|
+ DRM_ERROR("PSR idle timed out, atomic update may fail\n");
|
|
|
|
+
|
|
|
|
+ local_irq_disable();
|
|
|
|
|
|
crtc->debug.min_vbl = min;
|
|
crtc->debug.min_vbl = min;
|
|
crtc->debug.max_vbl = max;
|
|
crtc->debug.max_vbl = max;
|
|
@@ -171,6 +179,10 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state)
|
|
crtc->debug.start_vbl_count = intel_crtc_get_vblank_counter(crtc);
|
|
crtc->debug.start_vbl_count = intel_crtc_get_vblank_counter(crtc);
|
|
|
|
|
|
trace_i915_pipe_update_vblank_evaded(crtc);
|
|
trace_i915_pipe_update_vblank_evaded(crtc);
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+irq_disable:
|
|
|
|
+ local_irq_disable();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|