|
@@ -481,10 +481,10 @@ static void intel_fbc_deactivate(struct drm_i915_private *dev_priv)
|
|
|
intel_fbc_hw_deactivate(dev_priv);
|
|
|
}
|
|
|
|
|
|
-static bool multiple_pipes_ok(struct intel_crtc *crtc)
|
|
|
+static bool multiple_pipes_ok(struct intel_crtc *crtc,
|
|
|
+ struct intel_plane_state *plane_state)
|
|
|
{
|
|
|
- struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
|
|
|
- struct drm_plane *primary = crtc->base.primary;
|
|
|
+ struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
|
|
struct intel_fbc *fbc = &dev_priv->fbc;
|
|
|
enum pipe pipe = crtc->pipe;
|
|
|
|
|
@@ -492,9 +492,7 @@ static bool multiple_pipes_ok(struct intel_crtc *crtc)
|
|
|
if (!no_fbc_on_multiple_pipes(dev_priv))
|
|
|
return true;
|
|
|
|
|
|
- WARN_ON(!drm_modeset_is_locked(&primary->mutex));
|
|
|
-
|
|
|
- if (to_intel_plane_state(primary->state)->visible)
|
|
|
+ if (plane_state->visible)
|
|
|
fbc->visible_pipes_mask |= (1 << pipe);
|
|
|
else
|
|
|
fbc->visible_pipes_mask &= ~(1 << pipe);
|
|
@@ -709,21 +707,16 @@ static bool intel_fbc_hw_tracking_covers_screen(struct intel_crtc *crtc)
|
|
|
return effective_w <= max_w && effective_h <= max_h;
|
|
|
}
|
|
|
|
|
|
-static void intel_fbc_update_state_cache(struct intel_crtc *crtc)
|
|
|
+static void intel_fbc_update_state_cache(struct intel_crtc *crtc,
|
|
|
+ struct intel_crtc_state *crtc_state,
|
|
|
+ struct intel_plane_state *plane_state)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
|
|
|
struct intel_fbc *fbc = &dev_priv->fbc;
|
|
|
struct intel_fbc_state_cache *cache = &fbc->state_cache;
|
|
|
- struct intel_crtc_state *crtc_state =
|
|
|
- to_intel_crtc_state(crtc->base.state);
|
|
|
- struct intel_plane_state *plane_state =
|
|
|
- to_intel_plane_state(crtc->base.primary->state);
|
|
|
struct drm_framebuffer *fb = plane_state->base.fb;
|
|
|
struct drm_i915_gem_object *obj;
|
|
|
|
|
|
- WARN_ON(!drm_modeset_is_locked(&crtc->base.mutex));
|
|
|
- WARN_ON(!drm_modeset_is_locked(&crtc->base.primary->mutex));
|
|
|
-
|
|
|
cache->crtc.mode_flags = crtc_state->base.adjusted_mode.flags;
|
|
|
if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
|
|
|
cache->crtc.hsw_bdw_pixel_rate =
|
|
@@ -888,7 +881,9 @@ static bool intel_fbc_reg_params_equal(struct intel_fbc_reg_params *params1,
|
|
|
return memcmp(params1, params2, sizeof(*params1)) == 0;
|
|
|
}
|
|
|
|
|
|
-void intel_fbc_pre_update(struct intel_crtc *crtc)
|
|
|
+void intel_fbc_pre_update(struct intel_crtc *crtc,
|
|
|
+ struct intel_crtc_state *crtc_state,
|
|
|
+ struct intel_plane_state *plane_state)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
|
|
|
struct intel_fbc *fbc = &dev_priv->fbc;
|
|
@@ -898,7 +893,7 @@ void intel_fbc_pre_update(struct intel_crtc *crtc)
|
|
|
|
|
|
mutex_lock(&fbc->lock);
|
|
|
|
|
|
- if (!multiple_pipes_ok(crtc)) {
|
|
|
+ if (!multiple_pipes_ok(crtc, plane_state)) {
|
|
|
fbc->no_fbc_reason = "more than one pipe active";
|
|
|
goto deactivate;
|
|
|
}
|
|
@@ -906,7 +901,7 @@ void intel_fbc_pre_update(struct intel_crtc *crtc)
|
|
|
if (!fbc->enabled || fbc->crtc != crtc)
|
|
|
goto unlock;
|
|
|
|
|
|
- intel_fbc_update_state_cache(crtc);
|
|
|
+ intel_fbc_update_state_cache(crtc, crtc_state, plane_state);
|
|
|
|
|
|
deactivate:
|
|
|
intel_fbc_deactivate(dev_priv);
|
|
@@ -1090,7 +1085,9 @@ out:
|
|
|
* intel_fbc_enable multiple times for the same pipe without an
|
|
|
* intel_fbc_disable in the middle, as long as it is deactivated.
|
|
|
*/
|
|
|
-void intel_fbc_enable(struct intel_crtc *crtc)
|
|
|
+void intel_fbc_enable(struct intel_crtc *crtc,
|
|
|
+ struct intel_crtc_state *crtc_state,
|
|
|
+ struct intel_plane_state *plane_state)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
|
|
|
struct intel_fbc *fbc = &dev_priv->fbc;
|
|
@@ -1103,19 +1100,19 @@ void intel_fbc_enable(struct intel_crtc *crtc)
|
|
|
if (fbc->enabled) {
|
|
|
WARN_ON(fbc->crtc == NULL);
|
|
|
if (fbc->crtc == crtc) {
|
|
|
- WARN_ON(!crtc->config->enable_fbc);
|
|
|
+ WARN_ON(!crtc_state->enable_fbc);
|
|
|
WARN_ON(fbc->active);
|
|
|
}
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (!crtc->config->enable_fbc)
|
|
|
+ if (!crtc_state->enable_fbc)
|
|
|
goto out;
|
|
|
|
|
|
WARN_ON(fbc->active);
|
|
|
WARN_ON(fbc->crtc != NULL);
|
|
|
|
|
|
- intel_fbc_update_state_cache(crtc);
|
|
|
+ intel_fbc_update_state_cache(crtc, crtc_state, plane_state);
|
|
|
if (intel_fbc_alloc_cfb(crtc)) {
|
|
|
fbc->no_fbc_reason = "not enough stolen memory";
|
|
|
goto out;
|