[PATCH 2/2] drm/i915: Only check pipe state for fast modeset when it's possible.

Maarten Lankhorst
2015-09-14T09:30:17Z

A fast modeset can only be performed when connectors and active are
not changed. This prevents a lot of KMS spam when going from a NULL
mode with 0 connectors to an actual mode.

When a crtc is inactive there's no need to evade either, the changes
can be applied when the crtc turns on again.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
drivers/gpu/drm/i915/intel_display.c | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index deb76c84a307..eddc81c2d459 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12281,7 +12281,7 @@ intel_compare_link_m_n(const struct intel_link_m_n *m_n,

static bool
intel_pipe_config_compare(struct drm_device *dev,
- struct intel_crtc_state *current_config,
+ const struct intel_crtc_state *current_config,
struct intel_crtc_state *pipe_config,
bool adjust)
{
@@ -13013,14 +13013,15 @@ static int intel_atomic_check(struct drm_device *dev,
if (ret)
return ret;

- if (intel_pipe_config_compare(state->dev,
- to_intel_crtc_state(crtc->state),
- pipe_config, true)) {
+ if (!crtc_state->connectors_changed &&
+ !crtc_state->active_changed &&
+ crtc_state->active &&
+ intel_pipe_config_compare(state->dev,
+ to_intel_crtc_state(crtc->state),
+ pipe_config, true)) {
crtc_state->mode_changed = false;
- to_intel_crtc_state(crtc_state)->update_pipe = true;
- }
-
- if (needs_modeset(crtc_state)) {
+ pipe_config->update_pipe = true;
+ } else {
any_ms = true;

ret = drm_atomic_add_affected_planes(state, crtc);
@@ -13029,8 +13030,8 @@ static int intel_atomic_check(struct drm_device *dev,
}

intel_dump_pipe_config(to_intel_crtc(crtc), pipe_config,
- needs_modeset(crtc_state) ?
- "[modeset]" : "[fastset]");
+ pipe_config->update_pipe ?
+ "[fastset]" : "[modeset]");
}

if (any_ms) {
--
2.1.0