@@ -3140,6 +3140,7 @@ drm_atomic_helper_duplicate_state(struct drm_device *dev,
3140
3140
struct drm_atomic_state * state ;
3141
3141
struct drm_connector * conn ;
3142
3142
struct drm_connector_list_iter conn_iter ;
3143
+ struct drm_private_obj * priv_obj ;
3143
3144
struct drm_plane * plane ;
3144
3145
struct drm_crtc * crtc ;
3145
3146
int err = 0 ;
@@ -3184,6 +3185,19 @@ drm_atomic_helper_duplicate_state(struct drm_device *dev,
3184
3185
}
3185
3186
drm_connector_list_iter_end (& conn_iter );
3186
3187
3188
+ drm_for_each_privobj (priv_obj , dev ) {
3189
+ struct drm_private_state * priv_state ;
3190
+
3191
+ if (!priv_obj -> needs_duplicate_state )
3192
+ continue ;
3193
+
3194
+ priv_state = drm_atomic_get_private_obj_state (state , priv_obj );
3195
+ if (IS_ERR (priv_state )) {
3196
+ err = PTR_ERR (priv_state );
3197
+ goto free ;
3198
+ }
3199
+ }
3200
+
3187
3201
/* clear the acquire context so that it isn't accidentally reused */
3188
3202
state -> acquire_ctx = NULL ;
3189
3203
@@ -3278,6 +3292,8 @@ int drm_atomic_helper_commit_duplicated_state(struct drm_atomic_state *state,
3278
3292
struct drm_connector_state * new_conn_state ;
3279
3293
struct drm_crtc * crtc ;
3280
3294
struct drm_crtc_state * new_crtc_state ;
3295
+ struct drm_private_state * new_priv_state ;
3296
+ struct drm_private_obj * priv_obj ;
3281
3297
3282
3298
state -> acquire_ctx = ctx ;
3283
3299
@@ -3290,6 +3306,12 @@ int drm_atomic_helper_commit_duplicated_state(struct drm_atomic_state *state,
3290
3306
for_each_new_connector_in_state (state , connector , new_conn_state , i )
3291
3307
state -> connectors [i ].old_state = connector -> state ;
3292
3308
3309
+ for_each_new_private_obj_in_state (state , priv_obj , new_priv_state , i ) {
3310
+ if (!priv_obj -> needs_duplicate_state )
3311
+ continue ;
3312
+ state -> private_objs [i ].old_state = priv_obj -> state ;
3313
+ }
3314
+
3293
3315
ret = drm_atomic_commit (state );
3294
3316
3295
3317
state -> acquire_ctx = NULL ;
0 commit comments