Commit f0fdc55d authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Jani Nikula

drm/i915: calculate primary visibility changes instead of calling from set_config

This should be much cleaner, with the same effects.

(cherry picked for v4.2 from commit fb9d6cf8)
Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: default avatarMatt Roper <matthew.d.roper@intel.com>
References: https://bugs.freedesktop.org/show_bug.cgi?id=90398Reviewed-by: default avatarAnder Conselvan de Oliveira <conselvan2@gmail.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent e8fa4270
...@@ -12893,20 +12893,11 @@ intel_modeset_stage_output_state(struct drm_device *dev, ...@@ -12893,20 +12893,11 @@ intel_modeset_stage_output_state(struct drm_device *dev,
return 0; return 0;
} }
static bool primary_plane_visible(struct drm_crtc *crtc)
{
struct intel_plane_state *plane_state =
to_intel_plane_state(crtc->primary->state);
return plane_state->visible;
}
static int intel_crtc_set_config(struct drm_mode_set *set) static int intel_crtc_set_config(struct drm_mode_set *set)
{ {
struct drm_device *dev; struct drm_device *dev;
struct drm_atomic_state *state = NULL; struct drm_atomic_state *state = NULL;
struct intel_crtc_state *pipe_config; struct intel_crtc_state *pipe_config;
bool primary_plane_was_visible;
int ret; int ret;
BUG_ON(!set); BUG_ON(!set);
...@@ -12945,38 +12936,8 @@ static int intel_crtc_set_config(struct drm_mode_set *set) ...@@ -12945,38 +12936,8 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
intel_update_pipe_size(to_intel_crtc(set->crtc)); intel_update_pipe_size(to_intel_crtc(set->crtc));
primary_plane_was_visible = primary_plane_visible(set->crtc);
ret = intel_set_mode_with_config(set->crtc, pipe_config, true); ret = intel_set_mode_with_config(set->crtc, pipe_config, true);
if (ret == 0 &&
pipe_config->base.enable &&
pipe_config->base.planes_changed &&
!needs_modeset(&pipe_config->base)) {
struct intel_crtc *intel_crtc = to_intel_crtc(set->crtc);
/*
* We need to make sure the primary plane is re-enabled if it
* has previously been turned off.
*/
if (ret == 0 && !primary_plane_was_visible &&
primary_plane_visible(set->crtc)) {
WARN_ON(!intel_crtc->active);
intel_post_enable_primary(set->crtc);
}
/*
* In the fastboot case this may be our only check of the
* state after boot. It would be better to only do it on
* the first update, but we don't have a nice way of doing that
* (and really, set_config isn't used much for high freq page
* flipping, so increasing its cost here shouldn't be a big
* deal).
*/
if (i915.fastboot && ret == 0)
intel_modeset_check_state(set->crtc->dev);
}
if (ret) { if (ret) {
DRM_DEBUG_KMS("failed to set mode on [CRTC:%d], err = %d\n", DRM_DEBUG_KMS("failed to set mode on [CRTC:%d], err = %d\n",
set->crtc->base.id, ret); set->crtc->base.id, ret);
...@@ -13307,6 +13268,9 @@ intel_check_primary_plane(struct drm_plane *plane, ...@@ -13307,6 +13268,9 @@ intel_check_primary_plane(struct drm_plane *plane,
*/ */
if (IS_BROADWELL(dev)) if (IS_BROADWELL(dev))
intel_crtc->atomic.wait_vblank = true; intel_crtc->atomic.wait_vblank = true;
if (crtc_state && !needs_modeset(&crtc_state->base))
intel_crtc->atomic.post_enable_primary = true;
} }
/* /*
...@@ -13319,6 +13283,10 @@ intel_check_primary_plane(struct drm_plane *plane, ...@@ -13319,6 +13283,10 @@ intel_check_primary_plane(struct drm_plane *plane,
if (!state->visible || !fb) if (!state->visible || !fb)
intel_crtc->atomic.disable_ips = true; intel_crtc->atomic.disable_ips = true;
if (!state->visible && old_state->visible &&
crtc_state && !needs_modeset(&crtc_state->base))
intel_crtc->atomic.pre_disable_primary = true;
intel_crtc->atomic.fb_bits |= intel_crtc->atomic.fb_bits |=
INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe); INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment