@@ -6397,55 +6397,16 @@ static void intel_crtc_disable_noatomic(struct drm_crtc *crtc)
6397
6397
*/
6398
6398
int intel_display_suspend (struct drm_device * dev )
6399
6399
{
6400
- struct drm_mode_config * config = & dev -> mode_config ;
6401
- struct drm_modeset_acquire_ctx * ctx = config -> acquire_ctx ;
6400
+ struct drm_i915_private * dev_priv = to_i915 (dev );
6402
6401
struct drm_atomic_state * state ;
6403
- struct drm_crtc * crtc ;
6404
- unsigned crtc_mask = 0 ;
6405
- int ret = 0 ;
6406
-
6407
- if (WARN_ON (!ctx ))
6408
- return 0 ;
6409
-
6410
- lockdep_assert_held (& ctx -> ww_ctx );
6411
- state = drm_atomic_state_alloc (dev );
6412
- if (WARN_ON (!state ))
6413
- return - ENOMEM ;
6414
-
6415
- state -> acquire_ctx = ctx ;
6416
- state -> allow_modeset = true;
6417
-
6418
- for_each_crtc (dev , crtc ) {
6419
- struct drm_crtc_state * crtc_state =
6420
- drm_atomic_get_crtc_state (state , crtc );
6421
-
6422
- ret = PTR_ERR_OR_ZERO (crtc_state );
6423
- if (ret )
6424
- goto free ;
6425
-
6426
- if (!crtc_state -> active )
6427
- continue ;
6428
-
6429
- crtc_state -> active = false;
6430
- crtc_mask |= 1 << drm_crtc_index (crtc );
6431
- }
6432
-
6433
- if (crtc_mask ) {
6434
- ret = drm_atomic_commit (state );
6435
-
6436
- if (!ret ) {
6437
- for_each_crtc (dev , crtc )
6438
- if (crtc_mask & (1 << drm_crtc_index (crtc )))
6439
- crtc -> state -> active = true;
6440
-
6441
- return ret ;
6442
- }
6443
- }
6402
+ int ret ;
6444
6403
6445
- free :
6404
+ state = drm_atomic_helper_suspend (dev );
6405
+ ret = PTR_ERR_OR_ZERO (state );
6446
6406
if (ret )
6447
6407
DRM_ERROR ("Suspending crtc's failed with %i\n" , ret );
6448
- drm_atomic_state_free (state );
6408
+ else
6409
+ dev_priv -> modeset_restore_state = state ;
6449
6410
return ret ;
6450
6411
}
6451
6412
@@ -15918,51 +15879,57 @@ intel_modeset_setup_hw_state(struct drm_device *dev)
15918
15879
15919
15880
void intel_display_resume (struct drm_device * dev )
15920
15881
{
15921
- struct drm_atomic_state * state = drm_atomic_state_alloc (dev );
15922
- struct intel_connector * conn ;
15923
- struct intel_plane * plane ;
15924
- struct drm_crtc * crtc ;
15882
+ struct drm_i915_private * dev_priv = to_i915 (dev );
15883
+ struct drm_atomic_state * state = dev_priv -> modeset_restore_state ;
15884
+ struct drm_modeset_acquire_ctx ctx ;
15925
15885
int ret ;
15886
+ bool setup = false;
15926
15887
15927
- if (!state )
15928
- return ;
15888
+ dev_priv -> modeset_restore_state = NULL ;
15929
15889
15930
- state -> acquire_ctx = dev -> mode_config . acquire_ctx ;
15890
+ drm_modeset_acquire_init ( & ctx , 0 ) ;
15931
15891
15932
- for_each_crtc (dev , crtc ) {
15933
- struct drm_crtc_state * crtc_state =
15934
- drm_atomic_get_crtc_state (state , crtc );
15892
+ retry :
15893
+ ret = drm_modeset_lock_all_ctx (dev , & ctx );
15935
15894
15936
- ret = PTR_ERR_OR_ZERO (crtc_state );
15937
- if (ret )
15938
- goto err ;
15895
+ if (ret == 0 && !setup ) {
15896
+ setup = true;
15939
15897
15940
- /* force a restore */
15941
- crtc_state -> mode_changed = true ;
15898
+ intel_modeset_setup_hw_state ( dev );
15899
+ i915_redisable_vga ( dev ) ;
15942
15900
}
15943
15901
15944
- for_each_intel_plane (dev , plane ) {
15945
- ret = PTR_ERR_OR_ZERO (drm_atomic_get_plane_state (state , & plane -> base ));
15946
- if (ret )
15947
- goto err ;
15948
- }
15902
+ if (ret == 0 && state ) {
15903
+ struct drm_crtc_state * crtc_state ;
15904
+ struct drm_crtc * crtc ;
15905
+ int i ;
15949
15906
15950
- for_each_intel_connector (dev , conn ) {
15951
- ret = PTR_ERR_OR_ZERO (drm_atomic_get_connector_state (state , & conn -> base ));
15952
- if (ret )
15953
- goto err ;
15907
+ state -> acquire_ctx = & ctx ;
15908
+
15909
+ for_each_crtc_in_state (state , crtc , crtc_state , i ) {
15910
+ /*
15911
+ * Force recalculation even if we restore
15912
+ * current state. With fast modeset this may not result
15913
+ * in a modeset when the state is compatible.
15914
+ */
15915
+ crtc_state -> mode_changed = true;
15916
+ }
15917
+
15918
+ ret = drm_atomic_commit (state );
15954
15919
}
15955
15920
15956
- intel_modeset_setup_hw_state (dev );
15921
+ if (ret == - EDEADLK ) {
15922
+ drm_modeset_backoff (& ctx );
15923
+ goto retry ;
15924
+ }
15957
15925
15958
- i915_redisable_vga (dev );
15959
- ret = drm_atomic_commit (state );
15960
- if (!ret )
15961
- return ;
15926
+ drm_modeset_drop_locks (& ctx );
15927
+ drm_modeset_acquire_fini (& ctx );
15962
15928
15963
- err :
15964
- DRM_ERROR ("Restoring old state failed with %i\n" , ret );
15965
- drm_atomic_state_free (state );
15929
+ if (ret ) {
15930
+ DRM_ERROR ("Restoring old state failed with %i\n" , ret );
15931
+ drm_atomic_state_free (state );
15932
+ }
15966
15933
}
15967
15934
15968
15935
void intel_modeset_gem_init (struct drm_device * dev )
0 commit comments