From: jsg Date: Wed, 2 Mar 2022 13:06:03 +0000 (+0000) Subject: drm/i915: Fix bw atomic check when switching between SAGV vs. no SAGV X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=679bd9412dcea82540e3703664c70ad322158d1b;p=openbsd drm/i915: Fix bw atomic check when switching between SAGV vs. no SAGV From Ville Syrjala 0726fca0b6cc26a9ee6b0a0ac8984b8be0c62fb8 in linux 5.15.y/5.15.26 ec663bca9128f13eada25cd0446e7fcb5fcdc088 in mainline linux --- diff --git a/sys/dev/pci/drm/i915/display/intel_bw.c b/sys/dev/pci/drm/i915/display/intel_bw.c index 4b94256d731..7144c76ac97 100644 --- a/sys/dev/pci/drm/i915/display/intel_bw.c +++ b/sys/dev/pci/drm/i915/display/intel_bw.c @@ -681,6 +681,7 @@ int intel_bw_atomic_check(struct intel_atomic_state *state) unsigned int max_bw_point = 0, max_bw = 0; unsigned int num_qgv_points = dev_priv->max_bw[0].num_qgv_points; unsigned int num_psf_gv_points = dev_priv->max_bw[0].num_psf_gv_points; + bool changed = false; u32 mask = 0; /* FIXME earlier gens need some checks too */ @@ -724,6 +725,8 @@ int intel_bw_atomic_check(struct intel_atomic_state *state) new_bw_state->data_rate[crtc->pipe] = new_data_rate; new_bw_state->num_active_planes[crtc->pipe] = new_active_planes; + changed = true; + drm_dbg_kms(&dev_priv->drm, "pipe %c data rate %u num active planes %u\n", pipe_name(crtc->pipe), @@ -731,7 +734,19 @@ int intel_bw_atomic_check(struct intel_atomic_state *state) new_bw_state->num_active_planes[crtc->pipe]); } - if (!new_bw_state) + old_bw_state = intel_atomic_get_old_bw_state(state); + new_bw_state = intel_atomic_get_new_bw_state(state); + + if (new_bw_state && + intel_can_enable_sagv(dev_priv, old_bw_state) != + intel_can_enable_sagv(dev_priv, new_bw_state)) + changed = true; + + /* + * If none of our inputs (data rates, number of active + * planes, SAGV yes/no) changed then nothing to do here. + */ + if (!changed) return 0; ret = intel_atomic_lock_global_state(&new_bw_state->base); @@ -814,7 +829,6 @@ int intel_bw_atomic_check(struct intel_atomic_state *state) */ new_bw_state->qgv_points_mask = ~allowed_points & mask; - old_bw_state = intel_atomic_get_old_bw_state(state); /* * If the actual mask had changed we need to make sure that * the commits are serialized(in case this is a nomodeset, nonblocking)