at master 153 lines 4.0 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Kunit test for drm_atomic functions 4 */ 5#include <drm/drm_atomic.h> 6#include <drm/drm_atomic_state_helper.h> 7#include <drm/drm_atomic_uapi.h> 8#include <drm/drm_encoder.h> 9#include <drm/drm_kunit_helpers.h> 10#include <drm/drm_modeset_helper_vtables.h> 11 12#include <kunit/test.h> 13 14struct drm_atomic_test_priv { 15 struct drm_device drm; 16 struct drm_plane *plane; 17 struct drm_crtc *crtc; 18 struct drm_encoder encoder; 19 struct drm_connector connector; 20}; 21 22static const struct drm_connector_helper_funcs drm_atomic_init_connector_helper_funcs = { 23}; 24 25static const struct drm_connector_funcs drm_atomic_init_connector_funcs = { 26 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 27 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 28 .reset = drm_atomic_helper_connector_reset, 29}; 30 31static struct drm_atomic_test_priv *create_device(struct kunit *test) 32{ 33 struct drm_atomic_test_priv *priv; 34 struct drm_connector *connector; 35 struct drm_encoder *enc; 36 struct drm_device *drm; 37 struct drm_plane *plane; 38 struct drm_crtc *crtc; 39 struct device *dev; 40 int ret; 41 42 dev = drm_kunit_helper_alloc_device(test); 43 if (IS_ERR(dev)) 44 return ERR_CAST(dev); 45 46 priv = drm_kunit_helper_alloc_drm_device(test, dev, 47 struct drm_atomic_test_priv, drm, 48 DRIVER_MODESET | DRIVER_ATOMIC); 49 if (IS_ERR(priv)) 50 return ERR_CAST(priv); 51 52 drm = &priv->drm; 53 plane = drm_kunit_helper_create_primary_plane(test, drm, 54 NULL, 55 NULL, 56 NULL, 0, 57 NULL); 58 if (IS_ERR(plane)) 59 return ERR_CAST(plane); 60 priv->plane = plane; 61 62 crtc = drm_kunit_helper_create_crtc(test, drm, 63 plane, NULL, 64 NULL, 65 NULL); 66 if (IS_ERR(crtc)) 67 return ERR_CAST(crtc); 68 priv->crtc = crtc; 69 70 enc = &priv->encoder; 71 ret = drmm_encoder_init(drm, enc, NULL, DRM_MODE_ENCODER_TMDS, NULL); 72 if (ret) 73 return ERR_PTR(ret); 74 75 enc->possible_crtcs = drm_crtc_mask(crtc); 76 77 connector = &priv->connector; 78 ret = drmm_connector_init(drm, connector, 79 &drm_atomic_init_connector_funcs, 80 DRM_MODE_CONNECTOR_VIRTUAL, 81 NULL); 82 if (ret) 83 return ERR_PTR(ret); 84 85 drm_connector_helper_add(connector, &drm_atomic_init_connector_helper_funcs); 86 87 drm_connector_attach_encoder(connector, enc); 88 89 drm_mode_config_reset(drm); 90 91 return priv; 92} 93 94static void drm_test_drm_atomic_get_connector_for_encoder(struct kunit *test) 95{ 96 struct drm_modeset_acquire_ctx ctx; 97 struct drm_atomic_test_priv *priv; 98 struct drm_display_mode *mode; 99 struct drm_connector *curr_connector; 100 int ret; 101 102 priv = create_device(test); 103 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv); 104 105 mode = drm_kunit_display_mode_from_cea_vic(test, &priv->drm, 16); 106 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, mode); 107 108 drm_modeset_acquire_init(&ctx, 0); 109 110retry_enable: 111 ret = drm_kunit_helper_enable_crtc_connector(test, &priv->drm, 112 priv->crtc, &priv->connector, 113 mode, &ctx); 114 if (ret == -EDEADLK) { 115 drm_modeset_backoff(&ctx); 116 goto retry_enable; 117 } 118 KUNIT_ASSERT_EQ(test, ret, 0); 119 120 drm_modeset_drop_locks(&ctx); 121 drm_modeset_acquire_fini(&ctx); 122 123 drm_modeset_acquire_init(&ctx, 0); 124 125retry_conn: 126 curr_connector = drm_atomic_get_connector_for_encoder(&priv->encoder, 127 &ctx); 128 if (PTR_ERR(curr_connector) == -EDEADLK) { 129 drm_modeset_backoff(&ctx); 130 goto retry_conn; 131 } 132 KUNIT_EXPECT_PTR_EQ(test, curr_connector, &priv->connector); 133 134 drm_modeset_drop_locks(&ctx); 135 drm_modeset_acquire_fini(&ctx); 136} 137 138static struct kunit_case drm_atomic_get_connector_for_encoder_tests[] = { 139 KUNIT_CASE(drm_test_drm_atomic_get_connector_for_encoder), 140 { } 141}; 142 143 144static struct kunit_suite drm_atomic_get_connector_for_encoder_test_suite = { 145 .name = "drm_test_atomic_get_connector_for_encoder", 146 .test_cases = drm_atomic_get_connector_for_encoder_tests, 147}; 148 149kunit_test_suite(drm_atomic_get_connector_for_encoder_test_suite); 150 151MODULE_AUTHOR("Maxime Ripard <mripard@kernel.org>"); 152MODULE_DESCRIPTION("Kunit test for drm_atomic functions"); 153MODULE_LICENSE("GPL");