173d934d7SJessica Zhang // SPDX-License-Identifier: GPL-2.0 273d934d7SJessica Zhang /* 373d934d7SJessica Zhang * Test cases for the drm_atomic_state helpers 473d934d7SJessica Zhang * 573d934d7SJessica Zhang * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved. 673d934d7SJessica Zhang */ 773d934d7SJessica Zhang 873d934d7SJessica Zhang #include <drm/drm_atomic.h> 973d934d7SJessica Zhang #include <drm/drm_atomic_helper.h> 1073d934d7SJessica Zhang #include <drm/drm_atomic_uapi.h> 1173d934d7SJessica Zhang #include <drm/drm_kunit_helpers.h> 1273d934d7SJessica Zhang #include <drm/drm_probe_helper.h> 1373d934d7SJessica Zhang 1473d934d7SJessica Zhang #define DRM_TEST_ENC_0 BIT(0) 1573d934d7SJessica Zhang #define DRM_TEST_ENC_1 BIT(1) 1673d934d7SJessica Zhang #define DRM_TEST_ENC_2 BIT(2) 1773d934d7SJessica Zhang 1873d934d7SJessica Zhang #define DRM_TEST_CONN_0 BIT(0) 1973d934d7SJessica Zhang 205a6e8c36SJessica Zhang struct drm_clone_mode_test { 215a6e8c36SJessica Zhang const char *name; 225a6e8c36SJessica Zhang u32 encoder_mask; 235a6e8c36SJessica Zhang int expected_result; 245a6e8c36SJessica Zhang }; 255a6e8c36SJessica Zhang 2673d934d7SJessica Zhang static const struct drm_display_mode drm_atomic_test_mode = { 2773d934d7SJessica Zhang DRM_MODE("1024x768", 0, 65000, 1024, 1048, 2873d934d7SJessica Zhang 1184, 1344, 0, 768, 771, 777, 806, 0, 2973d934d7SJessica Zhang DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) 3073d934d7SJessica Zhang }; 3173d934d7SJessica Zhang 3273d934d7SJessica Zhang struct drm_atomic_test_priv { 3373d934d7SJessica Zhang struct drm_device drm; 3473d934d7SJessica Zhang struct drm_plane *plane; 3573d934d7SJessica Zhang struct drm_crtc *crtc; 3673d934d7SJessica Zhang struct drm_encoder encoders[3]; 3773d934d7SJessica Zhang struct drm_connector connectors[2]; 3873d934d7SJessica Zhang }; 3973d934d7SJessica Zhang 4073d934d7SJessica Zhang static int modeset_counter; 4173d934d7SJessica Zhang 4273d934d7SJessica Zhang static void drm_test_encoder_mode_set(struct drm_encoder *encoder, 4373d934d7SJessica Zhang struct drm_crtc_state *crtc_state, 4473d934d7SJessica Zhang struct drm_connector_state *conn_state) 4573d934d7SJessica Zhang { 4673d934d7SJessica Zhang modeset_counter++; 4773d934d7SJessica Zhang } 4873d934d7SJessica Zhang 4973d934d7SJessica Zhang static const struct drm_encoder_helper_funcs drm_atomic_test_encoder_funcs = { 5073d934d7SJessica Zhang .atomic_mode_set = drm_test_encoder_mode_set, 5173d934d7SJessica Zhang }; 5273d934d7SJessica Zhang 5373d934d7SJessica Zhang static const struct drm_connector_funcs dummy_connector_funcs = { 5473d934d7SJessica Zhang .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 5573d934d7SJessica Zhang .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 5673d934d7SJessica Zhang .reset = drm_atomic_helper_connector_reset, 5773d934d7SJessica Zhang }; 5873d934d7SJessica Zhang 5973d934d7SJessica Zhang static int drm_atomic_test_dummy_get_modes(struct drm_connector *connector) 6073d934d7SJessica Zhang { 6173d934d7SJessica Zhang return drm_connector_helper_get_modes_fixed(connector, 6273d934d7SJessica Zhang &drm_atomic_test_mode); 6373d934d7SJessica Zhang } 6473d934d7SJessica Zhang 6573d934d7SJessica Zhang static const struct drm_connector_helper_funcs dummy_connector_helper_funcs = { 6673d934d7SJessica Zhang .get_modes = drm_atomic_test_dummy_get_modes, 6773d934d7SJessica Zhang }; 6873d934d7SJessica Zhang 6973d934d7SJessica Zhang static struct drm_atomic_test_priv * 7073d934d7SJessica Zhang drm_atomic_test_init_drm_components(struct kunit *test, bool has_connectors) 7173d934d7SJessica Zhang { 7273d934d7SJessica Zhang struct drm_atomic_test_priv *priv; 7373d934d7SJessica Zhang struct drm_encoder *enc; 7473d934d7SJessica Zhang struct drm_connector *conn; 7573d934d7SJessica Zhang struct drm_device *drm; 7673d934d7SJessica Zhang struct device *dev; 7773d934d7SJessica Zhang int ret; 7873d934d7SJessica Zhang 7973d934d7SJessica Zhang dev = drm_kunit_helper_alloc_device(test); 8073d934d7SJessica Zhang KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev); 8173d934d7SJessica Zhang 8273d934d7SJessica Zhang priv = drm_kunit_helper_alloc_drm_device(test, dev, 8373d934d7SJessica Zhang struct drm_atomic_test_priv, 8473d934d7SJessica Zhang drm, 8573d934d7SJessica Zhang DRIVER_MODESET | DRIVER_ATOMIC); 8673d934d7SJessica Zhang KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv); 8773d934d7SJessica Zhang test->priv = priv; 8873d934d7SJessica Zhang 8973d934d7SJessica Zhang drm = &priv->drm; 9073d934d7SJessica Zhang priv->plane = drm_kunit_helper_create_primary_plane(test, drm, 9173d934d7SJessica Zhang NULL, 9273d934d7SJessica Zhang NULL, 9373d934d7SJessica Zhang NULL, 0, 9473d934d7SJessica Zhang NULL); 9573d934d7SJessica Zhang KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->plane); 9673d934d7SJessica Zhang 9773d934d7SJessica Zhang priv->crtc = drm_kunit_helper_create_crtc(test, drm, 9873d934d7SJessica Zhang priv->plane, NULL, 9973d934d7SJessica Zhang NULL, 10073d934d7SJessica Zhang NULL); 10173d934d7SJessica Zhang KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->crtc); 10273d934d7SJessica Zhang 10373d934d7SJessica Zhang for (int i = 0; i < ARRAY_SIZE(priv->encoders); i++) { 10473d934d7SJessica Zhang enc = &priv->encoders[i]; 10573d934d7SJessica Zhang 10673d934d7SJessica Zhang ret = drmm_encoder_init(drm, enc, NULL, 10773d934d7SJessica Zhang DRM_MODE_ENCODER_DSI, NULL); 10873d934d7SJessica Zhang KUNIT_ASSERT_EQ(test, ret, 0); 10973d934d7SJessica Zhang 11073d934d7SJessica Zhang enc->possible_crtcs = drm_crtc_mask(priv->crtc); 11173d934d7SJessica Zhang } 11273d934d7SJessica Zhang 11373d934d7SJessica Zhang priv->encoders[0].possible_clones = DRM_TEST_ENC_0 | DRM_TEST_ENC_1; 11473d934d7SJessica Zhang priv->encoders[1].possible_clones = DRM_TEST_ENC_0 | DRM_TEST_ENC_1; 11573d934d7SJessica Zhang priv->encoders[2].possible_clones = DRM_TEST_ENC_2; 11673d934d7SJessica Zhang 11773d934d7SJessica Zhang if (!has_connectors) 11873d934d7SJessica Zhang goto done; 11973d934d7SJessica Zhang 12073d934d7SJessica Zhang BUILD_BUG_ON(ARRAY_SIZE(priv->connectors) > ARRAY_SIZE(priv->encoders)); 12173d934d7SJessica Zhang 12273d934d7SJessica Zhang for (int i = 0; i < ARRAY_SIZE(priv->connectors); i++) { 12373d934d7SJessica Zhang conn = &priv->connectors[i]; 12473d934d7SJessica Zhang 12573d934d7SJessica Zhang ret = drmm_connector_init(drm, conn, &dummy_connector_funcs, 12673d934d7SJessica Zhang DRM_MODE_CONNECTOR_DSI, NULL); 12773d934d7SJessica Zhang KUNIT_ASSERT_EQ(test, ret, 0); 12873d934d7SJessica Zhang 12973d934d7SJessica Zhang drm_connector_helper_add(conn, &dummy_connector_helper_funcs); 13073d934d7SJessica Zhang drm_encoder_helper_add(&priv->encoders[i], 13173d934d7SJessica Zhang &drm_atomic_test_encoder_funcs); 13273d934d7SJessica Zhang 13373d934d7SJessica Zhang drm_connector_attach_encoder(conn, &priv->encoders[i]); 13473d934d7SJessica Zhang } 13573d934d7SJessica Zhang 13673d934d7SJessica Zhang done: 13773d934d7SJessica Zhang drm_mode_config_reset(drm); 13873d934d7SJessica Zhang 13973d934d7SJessica Zhang return priv; 14073d934d7SJessica Zhang } 14173d934d7SJessica Zhang 14273d934d7SJessica Zhang static int set_up_atomic_state(struct kunit *test, 14373d934d7SJessica Zhang struct drm_atomic_test_priv *priv, 14473d934d7SJessica Zhang struct drm_connector *connector, 14573d934d7SJessica Zhang struct drm_modeset_acquire_ctx *ctx) 14673d934d7SJessica Zhang { 14773d934d7SJessica Zhang struct drm_device *drm = &priv->drm; 14873d934d7SJessica Zhang struct drm_crtc *crtc = priv->crtc; 14973d934d7SJessica Zhang struct drm_atomic_state *state; 15073d934d7SJessica Zhang struct drm_connector_state *conn_state; 15173d934d7SJessica Zhang struct drm_crtc_state *crtc_state; 15273d934d7SJessica Zhang int ret; 15373d934d7SJessica Zhang 15473d934d7SJessica Zhang state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx); 15573d934d7SJessica Zhang KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); 15673d934d7SJessica Zhang 15773d934d7SJessica Zhang if (connector) { 15873d934d7SJessica Zhang conn_state = drm_atomic_get_connector_state(state, connector); 15973d934d7SJessica Zhang KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); 16073d934d7SJessica Zhang 16173d934d7SJessica Zhang ret = drm_atomic_set_crtc_for_connector(conn_state, crtc); 16273d934d7SJessica Zhang KUNIT_EXPECT_EQ(test, ret, 0); 16373d934d7SJessica Zhang } 16473d934d7SJessica Zhang 16573d934d7SJessica Zhang crtc_state = drm_atomic_get_crtc_state(state, crtc); 16673d934d7SJessica Zhang KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); 16773d934d7SJessica Zhang 16873d934d7SJessica Zhang ret = drm_atomic_set_mode_for_crtc(crtc_state, &drm_atomic_test_mode); 16973d934d7SJessica Zhang KUNIT_EXPECT_EQ(test, ret, 0); 17073d934d7SJessica Zhang 17173d934d7SJessica Zhang crtc_state->enable = true; 17273d934d7SJessica Zhang crtc_state->active = true; 17373d934d7SJessica Zhang 17473d934d7SJessica Zhang if (connector) { 17573d934d7SJessica Zhang ret = drm_atomic_commit(state); 17673d934d7SJessica Zhang KUNIT_ASSERT_EQ(test, ret, 0); 17773d934d7SJessica Zhang } else { 17873d934d7SJessica Zhang // dummy connector mask 17973d934d7SJessica Zhang crtc_state->connector_mask = DRM_TEST_CONN_0; 18073d934d7SJessica Zhang } 18173d934d7SJessica Zhang 18273d934d7SJessica Zhang return 0; 18373d934d7SJessica Zhang } 18473d934d7SJessica Zhang 18573d934d7SJessica Zhang /* 18673d934d7SJessica Zhang * Test that the DRM encoder mode_set() is called when the atomic state 18773d934d7SJessica Zhang * connectors are changed but the CRTC mode is not. 18873d934d7SJessica Zhang */ 18973d934d7SJessica Zhang static void drm_test_check_connector_changed_modeset(struct kunit *test) 19073d934d7SJessica Zhang { 19173d934d7SJessica Zhang struct drm_atomic_test_priv *priv; 192*30188df0SMaxime Ripard struct drm_modeset_acquire_ctx ctx; 19373d934d7SJessica Zhang struct drm_connector *old_conn, *new_conn; 19473d934d7SJessica Zhang struct drm_atomic_state *state; 19573d934d7SJessica Zhang struct drm_device *drm; 19673d934d7SJessica Zhang struct drm_connector_state *new_conn_state, *old_conn_state; 19773d934d7SJessica Zhang int ret, initial_modeset_count; 19873d934d7SJessica Zhang 19973d934d7SJessica Zhang priv = drm_atomic_test_init_drm_components(test, true); 20073d934d7SJessica Zhang KUNIT_ASSERT_NOT_NULL(test, priv); 20173d934d7SJessica Zhang 20273d934d7SJessica Zhang drm = &priv->drm; 20373d934d7SJessica Zhang old_conn = &priv->connectors[0]; 20473d934d7SJessica Zhang new_conn = &priv->connectors[1]; 20573d934d7SJessica Zhang 206*30188df0SMaxime Ripard drm_modeset_acquire_init(&ctx, 0); 20773d934d7SJessica Zhang 20873d934d7SJessica Zhang // first modeset to enable 209*30188df0SMaxime Ripard ret = set_up_atomic_state(test, priv, old_conn, &ctx); 21073d934d7SJessica Zhang KUNIT_ASSERT_EQ(test, ret, 0); 21173d934d7SJessica Zhang 212*30188df0SMaxime Ripard state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); 21373d934d7SJessica Zhang KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); 21473d934d7SJessica Zhang 21573d934d7SJessica Zhang new_conn_state = drm_atomic_get_connector_state(state, new_conn); 21673d934d7SJessica Zhang KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); 21773d934d7SJessica Zhang 21873d934d7SJessica Zhang old_conn_state = drm_atomic_get_connector_state(state, old_conn); 21973d934d7SJessica Zhang KUNIT_ASSERT_NOT_ERR_OR_NULL(test, old_conn_state); 22073d934d7SJessica Zhang 22173d934d7SJessica Zhang ret = drm_atomic_set_crtc_for_connector(old_conn_state, NULL); 22273d934d7SJessica Zhang KUNIT_EXPECT_EQ(test, ret, 0); 22373d934d7SJessica Zhang 22473d934d7SJessica Zhang ret = drm_atomic_set_crtc_for_connector(new_conn_state, priv->crtc); 22573d934d7SJessica Zhang KUNIT_EXPECT_EQ(test, ret, 0); 22673d934d7SJessica Zhang 22773d934d7SJessica Zhang initial_modeset_count = modeset_counter; 22873d934d7SJessica Zhang 22973d934d7SJessica Zhang // modeset_disables is called as part of the atomic commit tail 23073d934d7SJessica Zhang ret = drm_atomic_commit(state); 23173d934d7SJessica Zhang KUNIT_ASSERT_EQ(test, ret, 0); 23273d934d7SJessica Zhang KUNIT_ASSERT_EQ(test, modeset_counter, initial_modeset_count + 1); 233*30188df0SMaxime Ripard 234*30188df0SMaxime Ripard drm_modeset_drop_locks(&ctx); 235*30188df0SMaxime Ripard drm_modeset_acquire_fini(&ctx); 23673d934d7SJessica Zhang } 23773d934d7SJessica Zhang 2385a6e8c36SJessica Zhang /* 2395a6e8c36SJessica Zhang * Test that the drm_crtc_in_clone_mode() helper can detect if a given CRTC 2405a6e8c36SJessica Zhang * state is in clone mode 2415a6e8c36SJessica Zhang */ 2425a6e8c36SJessica Zhang static void drm_test_check_in_clone_mode(struct kunit *test) 2435a6e8c36SJessica Zhang { 2445a6e8c36SJessica Zhang bool ret; 2455a6e8c36SJessica Zhang const struct drm_clone_mode_test *param = test->param_value; 2465a6e8c36SJessica Zhang struct drm_crtc_state *crtc_state; 2475a6e8c36SJessica Zhang 2485a6e8c36SJessica Zhang crtc_state = kunit_kzalloc(test, sizeof(*crtc_state), GFP_KERNEL); 2495a6e8c36SJessica Zhang KUNIT_ASSERT_NOT_NULL(test, crtc_state); 2505a6e8c36SJessica Zhang 2515a6e8c36SJessica Zhang crtc_state->encoder_mask = param->encoder_mask; 2525a6e8c36SJessica Zhang 2535a6e8c36SJessica Zhang ret = drm_crtc_in_clone_mode(crtc_state); 2545a6e8c36SJessica Zhang 2555a6e8c36SJessica Zhang KUNIT_ASSERT_EQ(test, ret, param->expected_result); 2565a6e8c36SJessica Zhang } 2575a6e8c36SJessica Zhang 25888849f24SJessica Zhang /* 25988849f24SJessica Zhang * Test that the atomic commit path will succeed for valid clones (or non-cloned 26088849f24SJessica Zhang * states) and fail for states where the cloned encoders are not possible_clones 26188849f24SJessica Zhang * of each other. 26288849f24SJessica Zhang */ 26388849f24SJessica Zhang static void drm_test_check_valid_clones(struct kunit *test) 26488849f24SJessica Zhang { 26588849f24SJessica Zhang int ret; 26688849f24SJessica Zhang const struct drm_clone_mode_test *param = test->param_value; 26788849f24SJessica Zhang struct drm_atomic_test_priv *priv; 268*30188df0SMaxime Ripard struct drm_modeset_acquire_ctx ctx; 26988849f24SJessica Zhang struct drm_device *drm; 27088849f24SJessica Zhang struct drm_atomic_state *state; 27188849f24SJessica Zhang struct drm_crtc_state *crtc_state; 27288849f24SJessica Zhang 27388849f24SJessica Zhang priv = drm_atomic_test_init_drm_components(test, false); 27488849f24SJessica Zhang KUNIT_ASSERT_NOT_NULL(test, priv); 27588849f24SJessica Zhang 27688849f24SJessica Zhang drm = &priv->drm; 27788849f24SJessica Zhang 278*30188df0SMaxime Ripard drm_modeset_acquire_init(&ctx, 0); 27988849f24SJessica Zhang 280*30188df0SMaxime Ripard ret = set_up_atomic_state(test, priv, NULL, &ctx); 28188849f24SJessica Zhang KUNIT_ASSERT_EQ(test, ret, 0); 28288849f24SJessica Zhang 283*30188df0SMaxime Ripard state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); 28488849f24SJessica Zhang KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); 28588849f24SJessica Zhang 28688849f24SJessica Zhang crtc_state = drm_atomic_get_crtc_state(state, priv->crtc); 287e5f5f7ccSDan Carpenter KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); 28888849f24SJessica Zhang 28988849f24SJessica Zhang crtc_state->encoder_mask = param->encoder_mask; 29088849f24SJessica Zhang 29188849f24SJessica Zhang // force modeset 29288849f24SJessica Zhang crtc_state->mode_changed = true; 29388849f24SJessica Zhang 29488849f24SJessica Zhang ret = drm_atomic_helper_check_modeset(drm, state); 29588849f24SJessica Zhang KUNIT_ASSERT_EQ(test, ret, param->expected_result); 296*30188df0SMaxime Ripard 297*30188df0SMaxime Ripard drm_modeset_drop_locks(&ctx); 298*30188df0SMaxime Ripard drm_modeset_acquire_fini(&ctx); 29988849f24SJessica Zhang } 30088849f24SJessica Zhang 3015a6e8c36SJessica Zhang static void drm_check_in_clone_mode_desc(const struct drm_clone_mode_test *t, 3025a6e8c36SJessica Zhang char *desc) 3035a6e8c36SJessica Zhang { 3045a6e8c36SJessica Zhang sprintf(desc, "%s", t->name); 3055a6e8c36SJessica Zhang } 3065a6e8c36SJessica Zhang 30788849f24SJessica Zhang static void drm_check_valid_clones_desc(const struct drm_clone_mode_test *t, 30888849f24SJessica Zhang char *desc) 30988849f24SJessica Zhang { 31088849f24SJessica Zhang sprintf(desc, "%s", t->name); 31188849f24SJessica Zhang } 31288849f24SJessica Zhang 3135a6e8c36SJessica Zhang static const struct drm_clone_mode_test drm_clone_mode_tests[] = { 3145a6e8c36SJessica Zhang { 3155a6e8c36SJessica Zhang .name = "in_clone_mode", 3165a6e8c36SJessica Zhang .encoder_mask = DRM_TEST_ENC_0 | DRM_TEST_ENC_1, 3175a6e8c36SJessica Zhang .expected_result = true, 3185a6e8c36SJessica Zhang }, 3195a6e8c36SJessica Zhang { 3205a6e8c36SJessica Zhang .name = "not_in_clone_mode", 3215a6e8c36SJessica Zhang .encoder_mask = DRM_TEST_ENC_0, 3225a6e8c36SJessica Zhang .expected_result = false, 3235a6e8c36SJessica Zhang }, 3245a6e8c36SJessica Zhang }; 3255a6e8c36SJessica Zhang 32688849f24SJessica Zhang static const struct drm_clone_mode_test drm_valid_clone_mode_tests[] = { 32788849f24SJessica Zhang { 32888849f24SJessica Zhang .name = "not_in_clone_mode", 32988849f24SJessica Zhang .encoder_mask = DRM_TEST_ENC_0, 33088849f24SJessica Zhang .expected_result = 0, 33188849f24SJessica Zhang }, 33288849f24SJessica Zhang 33388849f24SJessica Zhang { 33488849f24SJessica Zhang .name = "valid_clone", 33588849f24SJessica Zhang .encoder_mask = DRM_TEST_ENC_0 | DRM_TEST_ENC_1, 33688849f24SJessica Zhang .expected_result = 0, 33788849f24SJessica Zhang }, 33888849f24SJessica Zhang { 33988849f24SJessica Zhang .name = "invalid_clone", 34088849f24SJessica Zhang .encoder_mask = DRM_TEST_ENC_0 | DRM_TEST_ENC_2, 34188849f24SJessica Zhang .expected_result = -EINVAL, 34288849f24SJessica Zhang }, 34388849f24SJessica Zhang }; 34488849f24SJessica Zhang 3455a6e8c36SJessica Zhang KUNIT_ARRAY_PARAM(drm_check_in_clone_mode, drm_clone_mode_tests, 3465a6e8c36SJessica Zhang drm_check_in_clone_mode_desc); 3475a6e8c36SJessica Zhang 34888849f24SJessica Zhang KUNIT_ARRAY_PARAM(drm_check_valid_clones, drm_valid_clone_mode_tests, 34988849f24SJessica Zhang drm_check_valid_clones_desc); 35088849f24SJessica Zhang 35173d934d7SJessica Zhang static struct kunit_case drm_test_check_modeset_test[] = { 35273d934d7SJessica Zhang KUNIT_CASE(drm_test_check_connector_changed_modeset), 35373d934d7SJessica Zhang {} 35473d934d7SJessica Zhang }; 35573d934d7SJessica Zhang 3565a6e8c36SJessica Zhang static struct kunit_case drm_in_clone_mode_check_test[] = { 3575a6e8c36SJessica Zhang KUNIT_CASE_PARAM(drm_test_check_in_clone_mode, 3585a6e8c36SJessica Zhang drm_check_in_clone_mode_gen_params), 35988849f24SJessica Zhang KUNIT_CASE_PARAM(drm_test_check_valid_clones, 36088849f24SJessica Zhang drm_check_valid_clones_gen_params), 3615a6e8c36SJessica Zhang {} 3625a6e8c36SJessica Zhang }; 3635a6e8c36SJessica Zhang 36473d934d7SJessica Zhang static struct kunit_suite drm_test_check_modeset_test_suite = { 36573d934d7SJessica Zhang .name = "drm_validate_modeset", 36673d934d7SJessica Zhang .test_cases = drm_test_check_modeset_test, 36773d934d7SJessica Zhang }; 36873d934d7SJessica Zhang 3695a6e8c36SJessica Zhang static struct kunit_suite drm_in_clone_mode_check_test_suite = { 3705a6e8c36SJessica Zhang .name = "drm_validate_clone_mode", 3715a6e8c36SJessica Zhang .test_cases = drm_in_clone_mode_check_test, 3725a6e8c36SJessica Zhang }; 3735a6e8c36SJessica Zhang 3745a6e8c36SJessica Zhang kunit_test_suites(&drm_in_clone_mode_check_test_suite, 3755a6e8c36SJessica Zhang &drm_test_check_modeset_test_suite); 37673d934d7SJessica Zhang 37773d934d7SJessica Zhang MODULE_AUTHOR("Jessica Zhang <quic_jesszhan@quicinc.com"); 37873d934d7SJessica Zhang MODULE_DESCRIPTION("Test cases for the drm_atomic_helper functions"); 37973d934d7SJessica Zhang MODULE_LICENSE("GPL"); 380