Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/tests: Add test for drm_atomic_helper_check_modeset()

Add a test for drm_atomic_check_modeset() specifically to validate
drm_atomic_check_valid_clones() helper

Signed-off-by: Jessica Zhang <quic_jesszhan@quicinc.com>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20241216-concurrent-wb-v4-4-fe220297a7f0@quicinc.com
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

authored by

Jessica Zhang and committed by
Dmitry Baryshkov
88849f24 41b4b11d

+71
+71
drivers/gpu/drm/tests/drm_atomic_state_test.c
··· 253 253 KUNIT_ASSERT_EQ(test, ret, param->expected_result); 254 254 } 255 255 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 + 256 297 static void drm_check_in_clone_mode_desc(const struct drm_clone_mode_test *t, 298 + char *desc) 299 + { 300 + sprintf(desc, "%s", t->name); 301 + } 302 + 303 + static void drm_check_valid_clones_desc(const struct drm_clone_mode_test *t, 257 304 char *desc) 258 305 { 259 306 sprintf(desc, "%s", t->name); ··· 319 272 }, 320 273 }; 321 274 275 + static const struct drm_clone_mode_test drm_valid_clone_mode_tests[] = { 276 + { 277 + .name = "not_in_clone_mode", 278 + .encoder_mask = DRM_TEST_ENC_0, 279 + .expected_result = 0, 280 + }, 281 + 282 + { 283 + .name = "valid_clone", 284 + .encoder_mask = DRM_TEST_ENC_0 | DRM_TEST_ENC_1, 285 + .expected_result = 0, 286 + }, 287 + { 288 + .name = "invalid_clone", 289 + .encoder_mask = DRM_TEST_ENC_0 | DRM_TEST_ENC_2, 290 + .expected_result = -EINVAL, 291 + }, 292 + }; 293 + 322 294 KUNIT_ARRAY_PARAM(drm_check_in_clone_mode, drm_clone_mode_tests, 323 295 drm_check_in_clone_mode_desc); 296 + 297 + KUNIT_ARRAY_PARAM(drm_check_valid_clones, drm_valid_clone_mode_tests, 298 + drm_check_valid_clones_desc); 324 299 325 300 static struct kunit_case drm_test_check_modeset_test[] = { 326 301 KUNIT_CASE(drm_test_check_connector_changed_modeset), ··· 352 283 static struct kunit_case drm_in_clone_mode_check_test[] = { 353 284 KUNIT_CASE_PARAM(drm_test_check_in_clone_mode, 354 285 drm_check_in_clone_mode_gen_params), 286 + KUNIT_CASE_PARAM(drm_test_check_valid_clones, 287 + drm_check_valid_clones_gen_params), 355 288 {} 356 289 }; 357 290