Message ID | 20181011100457.8776-2-maarten.lankhorst@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/i915: Remove low hanging crtc->config fruit, part 2. | expand |
On Thu, Oct 11, 2018 at 12:04:48PM +0200, Maarten Lankhorst wrote: > Wait for idle, and iterate over connectors instead of encoders. > With this information we know crtc->state is the actual state, > and we can enable/disable drrs safely. > > Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Looks sensible Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/i915_debugfs.c | 54 ++++++++++++++++++++++------- > 1 file changed, 42 insertions(+), 12 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c > index f42e93b71e67..b04d5ade5a15 100644 > --- a/drivers/gpu/drm/i915/i915_debugfs.c > +++ b/drivers/gpu/drm/i915/i915_debugfs.c > @@ -4661,20 +4661,45 @@ static int i915_drrs_ctl_set(void *data, u64 val) > { > struct drm_i915_private *dev_priv = data; > struct drm_device *dev = &dev_priv->drm; > - struct intel_crtc *intel_crtc; > - struct intel_encoder *encoder; > - struct intel_dp *intel_dp; > + struct intel_crtc *crtc; > > if (INTEL_GEN(dev_priv) < 7) > return -ENODEV; > > - drm_modeset_lock_all(dev); > - for_each_intel_crtc(dev, intel_crtc) { > - if (!intel_crtc->base.state->active || > - !intel_crtc->config->has_drrs) > - continue; > + for_each_intel_crtc(dev, crtc) { > + struct drm_connector_list_iter conn_iter; > + struct intel_crtc_state *crtc_state; > + struct drm_connector *connector; > + struct drm_crtc_commit *commit; > + int ret; > + > + ret = drm_modeset_lock_single_interruptible(&crtc->base.mutex); > + if (ret) > + return ret; > + > + crtc_state = to_intel_crtc_state(crtc->base.state); > + > + if (!crtc_state->base.active || > + !crtc_state->has_drrs) > + goto out; > > - for_each_encoder_on_crtc(dev, &intel_crtc->base, encoder) { > + commit = crtc_state->base.commit; > + if (commit) { > + ret = wait_for_completion_interruptible(&commit->hw_done); > + if (ret) > + goto out; > + } > + > + drm_connector_list_iter_begin(dev, &conn_iter); > + drm_for_each_connector_iter(connector, &conn_iter) { > + struct intel_encoder *encoder; > + struct intel_dp *intel_dp; > + > + if (!(crtc_state->base.connector_mask & > + drm_connector_mask(connector))) > + continue; > + > + encoder = intel_attached_encoder(connector); > if (encoder->type != INTEL_OUTPUT_EDP) > continue; > > @@ -4684,13 +4709,18 @@ static int i915_drrs_ctl_set(void *data, u64 val) > intel_dp = enc_to_intel_dp(&encoder->base); > if (val) > intel_edp_drrs_enable(intel_dp, > - intel_crtc->config); > + crtc_state); > else > intel_edp_drrs_disable(intel_dp, > - intel_crtc->config); > + crtc_state); > } > + drm_connector_list_iter_end(&conn_iter); > + > +out: > + drm_modeset_unlock(&crtc->base.mutex); > + if (ret) > + return ret; > } > - drm_modeset_unlock_all(dev); > > return 0; > } > -- > 2.19.0 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Op 16-10-18 om 22:13 schreef Ville Syrjälä: > On Thu, Oct 11, 2018 at 12:04:48PM +0200, Maarten Lankhorst wrote: >> Wait for idle, and iterate over connectors instead of encoders. >> With this information we know crtc->state is the actual state, >> and we can enable/disable drrs safely. >> >> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> > Looks sensible > > Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Thanks, pushed. ~Maarten
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index f42e93b71e67..b04d5ade5a15 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -4661,20 +4661,45 @@ static int i915_drrs_ctl_set(void *data, u64 val) { struct drm_i915_private *dev_priv = data; struct drm_device *dev = &dev_priv->drm; - struct intel_crtc *intel_crtc; - struct intel_encoder *encoder; - struct intel_dp *intel_dp; + struct intel_crtc *crtc; if (INTEL_GEN(dev_priv) < 7) return -ENODEV; - drm_modeset_lock_all(dev); - for_each_intel_crtc(dev, intel_crtc) { - if (!intel_crtc->base.state->active || - !intel_crtc->config->has_drrs) - continue; + for_each_intel_crtc(dev, crtc) { + struct drm_connector_list_iter conn_iter; + struct intel_crtc_state *crtc_state; + struct drm_connector *connector; + struct drm_crtc_commit *commit; + int ret; + + ret = drm_modeset_lock_single_interruptible(&crtc->base.mutex); + if (ret) + return ret; + + crtc_state = to_intel_crtc_state(crtc->base.state); + + if (!crtc_state->base.active || + !crtc_state->has_drrs) + goto out; - for_each_encoder_on_crtc(dev, &intel_crtc->base, encoder) { + commit = crtc_state->base.commit; + if (commit) { + ret = wait_for_completion_interruptible(&commit->hw_done); + if (ret) + goto out; + } + + drm_connector_list_iter_begin(dev, &conn_iter); + drm_for_each_connector_iter(connector, &conn_iter) { + struct intel_encoder *encoder; + struct intel_dp *intel_dp; + + if (!(crtc_state->base.connector_mask & + drm_connector_mask(connector))) + continue; + + encoder = intel_attached_encoder(connector); if (encoder->type != INTEL_OUTPUT_EDP) continue; @@ -4684,13 +4709,18 @@ static int i915_drrs_ctl_set(void *data, u64 val) intel_dp = enc_to_intel_dp(&encoder->base); if (val) intel_edp_drrs_enable(intel_dp, - intel_crtc->config); + crtc_state); else intel_edp_drrs_disable(intel_dp, - intel_crtc->config); + crtc_state); } + drm_connector_list_iter_end(&conn_iter); + +out: + drm_modeset_unlock(&crtc->base.mutex); + if (ret) + return ret; } - drm_modeset_unlock_all(dev); return 0; }
Wait for idle, and iterate over connectors instead of encoders. With this information we know crtc->state is the actual state, and we can enable/disable drrs safely. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> --- drivers/gpu/drm/i915/i915_debugfs.c | 54 ++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 12 deletions(-)