@@ -253,12 +253,59 @@ static void drm_test_check_in_clone_mode(struct kunit *test)
253253 KUNIT_ASSERT_EQ (test , ret , param -> expected_result );
254254}
255255
256+ /*
257+ * Test that the atomic commit path will succeed for valid clones (or non-cloned
258+ * states) and fail for states where the cloned encoders are not possible_clones
259+ * of each other.
260+ */
261+ static void drm_test_check_valid_clones (struct kunit * test )
262+ {
263+ int ret ;
264+ const struct drm_clone_mode_test * param = test -> param_value ;
265+ struct drm_atomic_test_priv * priv ;
266+ struct drm_modeset_acquire_ctx * ctx ;
267+ struct drm_device * drm ;
268+ struct drm_atomic_state * state ;
269+ struct drm_crtc_state * crtc_state ;
270+
271+ priv = drm_atomic_test_init_drm_components (test , false);
272+ KUNIT_ASSERT_NOT_NULL (test , priv );
273+
274+ drm = & priv -> drm ;
275+
276+ ctx = drm_kunit_helper_acquire_ctx_alloc (test );
277+ KUNIT_ASSERT_NOT_ERR_OR_NULL (test , ctx );
278+
279+ ret = set_up_atomic_state (test , priv , NULL , ctx );
280+ KUNIT_ASSERT_EQ (test , ret , 0 );
281+
282+ state = drm_kunit_helper_atomic_state_alloc (test , drm , ctx );
283+ KUNIT_ASSERT_NOT_ERR_OR_NULL (test , state );
284+
285+ crtc_state = drm_atomic_get_crtc_state (state , priv -> crtc );
286+ KUNIT_ASSERT_NOT_NULL (test , crtc_state );
287+
288+ crtc_state -> encoder_mask = param -> encoder_mask ;
289+
290+ // force modeset
291+ crtc_state -> mode_changed = true;
292+
293+ ret = drm_atomic_helper_check_modeset (drm , state );
294+ KUNIT_ASSERT_EQ (test , ret , param -> expected_result );
295+ }
296+
256297static void drm_check_in_clone_mode_desc (const struct drm_clone_mode_test * t ,
257298 char * desc )
258299{
259300 sprintf (desc , "%s" , t -> name );
260301}
261302
303+ static void drm_check_valid_clones_desc (const struct drm_clone_mode_test * t ,
304+ char * desc )
305+ {
306+ sprintf (desc , "%s" , t -> name );
307+ }
308+
262309static const struct drm_clone_mode_test drm_clone_mode_tests [] = {
263310 {
264311 .name = "in_clone_mode" ,
@@ -272,9 +319,31 @@ static const struct drm_clone_mode_test drm_clone_mode_tests[] = {
272319 },
273320};
274321
322+ static const struct drm_clone_mode_test drm_valid_clone_mode_tests [] = {
323+ {
324+ .name = "not_in_clone_mode" ,
325+ .encoder_mask = DRM_TEST_ENC_0 ,
326+ .expected_result = 0 ,
327+ },
328+
329+ {
330+ .name = "valid_clone" ,
331+ .encoder_mask = DRM_TEST_ENC_0 | DRM_TEST_ENC_1 ,
332+ .expected_result = 0 ,
333+ },
334+ {
335+ .name = "invalid_clone" ,
336+ .encoder_mask = DRM_TEST_ENC_0 | DRM_TEST_ENC_2 ,
337+ .expected_result = - EINVAL ,
338+ },
339+ };
340+
275341KUNIT_ARRAY_PARAM (drm_check_in_clone_mode , drm_clone_mode_tests ,
276342 drm_check_in_clone_mode_desc );
277343
344+ KUNIT_ARRAY_PARAM (drm_check_valid_clones , drm_valid_clone_mode_tests ,
345+ drm_check_valid_clones_desc );
346+
278347static struct kunit_case drm_test_check_modeset_test [] = {
279348 KUNIT_CASE (drm_test_check_connector_changed_modeset ),
280349 {}
@@ -283,6 +352,8 @@ static struct kunit_case drm_test_check_modeset_test[] = {
283352static struct kunit_case drm_in_clone_mode_check_test [] = {
284353 KUNIT_CASE_PARAM (drm_test_check_in_clone_mode ,
285354 drm_check_in_clone_mode_gen_params ),
355+ KUNIT_CASE_PARAM (drm_test_check_valid_clones ,
356+ drm_check_valid_clones_gen_params ),
286357 {}
287358};
288359
0 commit comments