Skip to content

Commit 138bdac

Browse files
committed
drm/i915: Remove crtc->config dereference from drrs_ctl
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> Link: https://patchwork.freedesktop.org/patch/msgid/20181011100457.8776-2-maarten.lankhorst@linux.intel.com Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
1 parent 914a4fd commit 138bdac

File tree

1 file changed

+42
-12
lines changed

1 file changed

+42
-12
lines changed

drivers/gpu/drm/i915/i915_debugfs.c

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4660,20 +4660,45 @@ static int i915_drrs_ctl_set(void *data, u64 val)
46604660
{
46614661
struct drm_i915_private *dev_priv = data;
46624662
struct drm_device *dev = &dev_priv->drm;
4663-
struct intel_crtc *intel_crtc;
4664-
struct intel_encoder *encoder;
4665-
struct intel_dp *intel_dp;
4663+
struct intel_crtc *crtc;
46664664

46674665
if (INTEL_GEN(dev_priv) < 7)
46684666
return -ENODEV;
46694667

4670-
drm_modeset_lock_all(dev);
4671-
for_each_intel_crtc(dev, intel_crtc) {
4672-
if (!intel_crtc->base.state->active ||
4673-
!intel_crtc->config->has_drrs)
4674-
continue;
4668+
for_each_intel_crtc(dev, crtc) {
4669+
struct drm_connector_list_iter conn_iter;
4670+
struct intel_crtc_state *crtc_state;
4671+
struct drm_connector *connector;
4672+
struct drm_crtc_commit *commit;
4673+
int ret;
4674+
4675+
ret = drm_modeset_lock_single_interruptible(&crtc->base.mutex);
4676+
if (ret)
4677+
return ret;
4678+
4679+
crtc_state = to_intel_crtc_state(crtc->base.state);
4680+
4681+
if (!crtc_state->base.active ||
4682+
!crtc_state->has_drrs)
4683+
goto out;
46754684

4676-
for_each_encoder_on_crtc(dev, &intel_crtc->base, encoder) {
4685+
commit = crtc_state->base.commit;
4686+
if (commit) {
4687+
ret = wait_for_completion_interruptible(&commit->hw_done);
4688+
if (ret)
4689+
goto out;
4690+
}
4691+
4692+
drm_connector_list_iter_begin(dev, &conn_iter);
4693+
drm_for_each_connector_iter(connector, &conn_iter) {
4694+
struct intel_encoder *encoder;
4695+
struct intel_dp *intel_dp;
4696+
4697+
if (!(crtc_state->base.connector_mask &
4698+
drm_connector_mask(connector)))
4699+
continue;
4700+
4701+
encoder = intel_attached_encoder(connector);
46774702
if (encoder->type != INTEL_OUTPUT_EDP)
46784703
continue;
46794704

@@ -4683,13 +4708,18 @@ static int i915_drrs_ctl_set(void *data, u64 val)
46834708
intel_dp = enc_to_intel_dp(&encoder->base);
46844709
if (val)
46854710
intel_edp_drrs_enable(intel_dp,
4686-
intel_crtc->config);
4711+
crtc_state);
46874712
else
46884713
intel_edp_drrs_disable(intel_dp,
4689-
intel_crtc->config);
4714+
crtc_state);
46904715
}
4716+
drm_connector_list_iter_end(&conn_iter);
4717+
4718+
out:
4719+
drm_modeset_unlock(&crtc->base.mutex);
4720+
if (ret)
4721+
return ret;
46914722
}
4692-
drm_modeset_unlock_all(dev);
46934723

46944724
return 0;
46954725
}

0 commit comments

Comments
 (0)