File Index
Files and directories
Sign in
FILE

drm_modes_test.c

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/tests/drm_modes_test.c C
  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
 14struct drm_test_modes_priv {
 15	struct drm_device *drm;
 16	struct device *dev;
 17};
 18
 19static 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
 39static 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
 73static 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
 97static 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
131static 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
155static void drm_test_modes_analog_tv_mono_576i(struct kunit *test)
156{
157	struct drm_test_modes_priv *priv = test->priv;
158	struct drm_display_mode *mode;
159	int ret;
160
161	mode = drm_analog_tv_mode(priv->drm,
162				  DRM_MODE_TV_MODE_MONOCHROME,
163				  13500 * HZ_PER_KHZ, 720, 576,
164				  true);
165	KUNIT_ASSERT_NOT_NULL(test, mode);
166
167	ret = drm_kunit_add_mode_destroy_action(test, mode);
168	KUNIT_ASSERT_EQ(test, ret, 0);
169
170	KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 50);
171	KUNIT_EXPECT_EQ(test, mode->hdisplay, 720);
172
173	/* BT.601 defines hsync_start at 732 for 576i */
174	KUNIT_EXPECT_EQ(test, mode->hsync_start, 732);
175
176	/*
177	 * The PAL standard expects a line to take 64us. With a pixel
178	 * clock of 13.5 MHz, a pixel takes around 74ns, so we need to
179	 * have 64000ns / 74ns = 864.
180	 *
181	 * This is also mandated by BT.601.
182	 */
183	KUNIT_EXPECT_EQ(test, mode->htotal, 864);
184
185	KUNIT_EXPECT_EQ(test, mode->vdisplay, 576);
186	KUNIT_EXPECT_EQ(test, mode->vtotal, 625);
187}
188
189static struct kunit_case drm_modes_analog_tv_tests[] = {
190	KUNIT_CASE(drm_test_modes_analog_tv_mono_576i),
191	KUNIT_CASE(drm_test_modes_analog_tv_ntsc_480i),
192	KUNIT_CASE(drm_test_modes_analog_tv_ntsc_480i_inlined),
193	KUNIT_CASE(drm_test_modes_analog_tv_pal_576i),
194	KUNIT_CASE(drm_test_modes_analog_tv_pal_576i_inlined),
195	{ }
196};
197
198static struct kunit_suite drm_modes_analog_tv_test_suite = {
199	.name = "drm_modes_analog_tv",
200	.init = drm_test_modes_init,
201	.test_cases = drm_modes_analog_tv_tests,
202};
203
204kunit_test_suite(drm_modes_analog_tv_test_suite);
205
206MODULE_AUTHOR("Maxime Ripard <maxime@cerno.tech>");
207MODULE_DESCRIPTION("Kunit test for drm_modes functions");
208MODULE_LICENSE("GPL");
~/ Read-only file preview.