@@ -4660,20 +4660,45 @@ static int i915_drrs_ctl_set(void *data, u64 val)
4660
4660
{
4661
4661
struct drm_i915_private * dev_priv = data ;
4662
4662
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 ;
4666
4664
4667
4665
if (INTEL_GEN (dev_priv ) < 7 )
4668
4666
return - ENODEV ;
4669
4667
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 ;
4675
4684
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 );
4677
4702
if (encoder -> type != INTEL_OUTPUT_EDP )
4678
4703
continue ;
4679
4704
@@ -4683,13 +4708,18 @@ static int i915_drrs_ctl_set(void *data, u64 val)
4683
4708
intel_dp = enc_to_intel_dp (& encoder -> base );
4684
4709
if (val )
4685
4710
intel_edp_drrs_enable (intel_dp ,
4686
- intel_crtc -> config );
4711
+ crtc_state );
4687
4712
else
4688
4713
intel_edp_drrs_disable (intel_dp ,
4689
- intel_crtc -> config );
4714
+ crtc_state );
4690
4715
}
4716
+ drm_connector_list_iter_end (& conn_iter );
4717
+
4718
+ out :
4719
+ drm_modeset_unlock (& crtc -> base .mutex );
4720
+ if (ret )
4721
+ return ret ;
4691
4722
}
4692
- drm_modeset_unlock_all (dev );
4693
4723
4694
4724
return 0 ;
4695
4725
}
0 commit comments