1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Kunit test for drm_modes functions 4 */ 5 6 #include <drm/drm_drv.h> 7 #include <drm/drm_kunit_helpers.h> 8 #include <drm/drm_modes.h> 9 10 #include <kunit/test.h> 11 12 #include <linux/units.h> 13 14 struct drm_test_modes_priv { 15 struct drm_device *drm; 16 struct device *dev; 17 }; 18 19 static int drm_test_modes_init(struct kunit *test) 20 { 21 struct drm_test_modes_priv *priv; 22 23 priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL); 24 KUNIT_ASSERT_NOT_NULL(test, priv); 25 26 priv->dev = drm_kunit_helper_alloc_device(test); 27 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->dev); 28 29 priv->drm = __drm_kunit_helper_alloc_drm_device(test, priv->dev, 30 sizeof(*priv->drm), 0, 31 DRIVER_MODESET); 32 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->drm); 33 34 test->priv = priv; 35 36 return 0; 37 } 38 39 static void drm_test_modes_analog_tv_ntsc_480i(struct kunit *test) 40 { 41 struct drm_test_modes_priv *priv = test->priv; 42 struct drm_display_mode *mode; 43 int ret; 44 45 mode = drm_analog_tv_mode(priv->drm, 46 DRM_MODE_TV_MODE_NTSC, 47 13500 * HZ_PER_KHZ, 720, 480, 48 true); 49 KUNIT_ASSERT_NOT_NULL(test, mode); 50 51 ret = drm_kunit_add_mode_destroy_action(test, mode); 52 KUNIT_ASSERT_EQ(test, ret, 0); 53 54 KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 60); 55 KUNIT_EXPECT_EQ(test, mode->hdisplay, 720); 56 57 /* BT.601 defines hsync_start at 736 for 480i */ 58 KUNIT_EXPECT_EQ(test, mode->hsync_start, 736); 59 60 /* 61 * The NTSC standard expects a line to take 63.556us. With a 62 * pixel clock of 13.5 MHz, a pixel takes around 74ns, so we 63 * need to have 63556ns / 74ns = 858. 64 * 65 * This is also mandated by BT.601. 66 */ 67 KUNIT_EXPECT_EQ(test, mode->htotal, 858); 68 69 KUNIT_EXPECT_EQ(test, mode->vdisplay, 480); 70 KUNIT_EXPECT_EQ(test, mode->vtotal, 525); 71 } 72 73 static void drm_test_modes_analog_tv_ntsc_480i_inlined(struct kunit *test) 74 { 75 struct drm_test_modes_priv *priv = test->priv; 76 struct drm_display_mode *expected, *mode; 77 int ret; 78 79 expected = drm_analog_tv_mode(priv->drm, 80 DRM_MODE_TV_MODE_NTSC, 81 13500 * HZ_PER_KHZ, 720, 480, 82 true); 83 KUNIT_ASSERT_NOT_NULL(test, expected); 84 85 ret = drm_kunit_add_mode_destroy_action(test, expected); 86 KUNIT_ASSERT_EQ(test, ret, 0); 87 88 mode = drm_mode_analog_ntsc_480i(priv->drm); 89 KUNIT_ASSERT_NOT_NULL(test, mode); 90 91 ret = drm_kunit_add_mode_destroy_action(test, mode); 92 KUNIT_ASSERT_EQ(test, ret, 0); 93 94 KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected, mode)); 95 } 96 97 static void drm_test_modes_analog_tv_pal_576i(struct kunit *test) 98 { 99 struct drm_test_modes_priv *priv = test->priv; 100 struct drm_display_mode *mode; 101 int ret; 102 103 mode = drm_analog_tv_mode(priv->drm, 104 DRM_MODE_TV_MODE_PAL, 105 13500 * HZ_PER_KHZ, 720, 576, 106 true); 107 KUNIT_ASSERT_NOT_NULL(test, mode); 108 109 ret = drm_kunit_add_mode_destroy_action(test, mode); 110 KUNIT_ASSERT_EQ(test, ret, 0); 111 112 KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 50); 113 KUNIT_EXPECT_EQ(test, mode->hdisplay, 720); 114 115 /* BT.601 defines hsync_start at 732 for 576i */ 116 KUNIT_EXPECT_EQ(test, mode->hsync_start, 732); 117 118 /* 119 * The PAL standard expects a line to take 64us. With a pixel 120 * clock of 13.5 MHz, a pixel takes around 74ns, so we need to 121 * have 64000ns / 74ns = 864. 122 * 123 * This is also mandated by BT.601. 124 */ 125 KUNIT_EXPECT_EQ(test, mode->htotal, 864); 126 127 KUNIT_EXPECT_EQ(test, mode->vdisplay, 576); 128 KUNIT_EXPECT_EQ(test, mode->vtotal, 625); 129 } 130 131 static void drm_test_modes_analog_tv_pal_576i_inlined(struct kunit *test) 132 { 133 struct drm_test_modes_priv *priv = test->priv; 134 struct drm_display_mode *expected, *mode; 135 int ret; 136 137 expected = drm_analog_tv_mode(priv->drm, 138 DRM_MODE_TV_MODE_PAL, 139 13500 * HZ_PER_KHZ, 720, 576, 140 true); 141 KUNIT_ASSERT_NOT_NULL(test, expected); 142 143 ret = drm_kunit_add_mode_destroy_action(test, expected); 144 KUNIT_ASSERT_EQ(test, ret, 0); 145 146 mode = drm_mode_analog_pal_576i(priv->drm); 147 KUNIT_ASSERT_NOT_NULL(test, mode); 148 149 ret = drm_kunit_add_mode_destroy_action(test, mode); 150 KUNIT_ASSERT_EQ(test, ret, 0); 151 152 KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected, mode)); 153 } 154 155 static struct kunit_case drm_modes_analog_tv_tests[] = { 156 KUNIT_CASE(drm_test_modes_analog_tv_ntsc_480i), 157 KUNIT_CASE(drm_test_modes_analog_tv_ntsc_480i_inlined), 158 KUNIT_CASE(drm_test_modes_analog_tv_pal_576i), 159 KUNIT_CASE(drm_test_modes_analog_tv_pal_576i_inlined), 160 { } 161 }; 162 163 static struct kunit_suite drm_modes_analog_tv_test_suite = { 164 .name = "drm_modes_analog_tv", 165 .init = drm_test_modes_init, 166 .test_cases = drm_modes_analog_tv_tests, 167 }; 168 169 kunit_test_suite(drm_modes_analog_tv_test_suite); 170 171 MODULE_AUTHOR("Maxime Ripard <maxime@cerno.tech>"); 172 MODULE_LICENSE("GPL"); 173