|
@@ -493,24 +493,17 @@ static struct drm_crtc *intel_fbc_find_crtc(struct drm_i915_private *dev_priv)
|
|
|
{
|
|
|
struct drm_crtc *crtc = NULL, *tmp_crtc;
|
|
|
enum pipe pipe;
|
|
|
- bool pipe_a_only = false, one_pipe_only = false;
|
|
|
+ bool pipe_a_only = false;
|
|
|
|
|
|
if (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8)
|
|
|
pipe_a_only = true;
|
|
|
- else if (INTEL_INFO(dev_priv)->gen <= 4)
|
|
|
- one_pipe_only = true;
|
|
|
|
|
|
for_each_pipe(dev_priv, pipe) {
|
|
|
tmp_crtc = dev_priv->pipe_to_crtc_mapping[pipe];
|
|
|
|
|
|
if (intel_crtc_active(tmp_crtc) &&
|
|
|
- to_intel_plane_state(tmp_crtc->primary->state)->visible) {
|
|
|
- if (one_pipe_only && crtc) {
|
|
|
- set_no_fbc_reason(dev_priv, FBC_MULTIPLE_PIPES);
|
|
|
- return NULL;
|
|
|
- }
|
|
|
+ to_intel_plane_state(tmp_crtc->primary->state)->visible)
|
|
|
crtc = tmp_crtc;
|
|
|
- }
|
|
|
|
|
|
if (pipe_a_only)
|
|
|
break;
|
|
@@ -524,6 +517,26 @@ static struct drm_crtc *intel_fbc_find_crtc(struct drm_i915_private *dev_priv)
|
|
|
return crtc;
|
|
|
}
|
|
|
|
|
|
+static bool multiple_pipes_ok(struct drm_i915_private *dev_priv)
|
|
|
+{
|
|
|
+ enum pipe pipe;
|
|
|
+ int n_pipes = 0;
|
|
|
+ struct drm_crtc *crtc;
|
|
|
+
|
|
|
+ if (INTEL_INFO(dev_priv)->gen > 4)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ for_each_pipe(dev_priv, pipe) {
|
|
|
+ crtc = dev_priv->pipe_to_crtc_mapping[pipe];
|
|
|
+
|
|
|
+ if (intel_crtc_active(crtc) &&
|
|
|
+ to_intel_plane_state(crtc->primary->state)->visible)
|
|
|
+ n_pipes++;
|
|
|
+ }
|
|
|
+
|
|
|
+ return (n_pipes < 2);
|
|
|
+}
|
|
|
+
|
|
|
static int find_compression_threshold(struct drm_i915_private *dev_priv,
|
|
|
struct drm_mm_node *node,
|
|
|
int size,
|
|
@@ -710,6 +723,11 @@ static void __intel_fbc_update(struct drm_i915_private *dev_priv)
|
|
|
if (!crtc)
|
|
|
goto out_disable;
|
|
|
|
|
|
+ if (!multiple_pipes_ok(dev_priv)) {
|
|
|
+ set_no_fbc_reason(dev_priv, FBC_MULTIPLE_PIPES);
|
|
|
+ goto out_disable;
|
|
|
+ }
|
|
|
+
|
|
|
intel_crtc = to_intel_crtc(crtc);
|
|
|
fb = crtc->primary->fb;
|
|
|
obj = intel_fb_obj(fb);
|