mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-20 04:23:55 -04:00
drm/modes: Add a function to generate analog display modes
Multiple drivers (meson, vc4, sun4i) define analog TV 525-lines and 625-lines modes in their drivers. Since those modes are fairly standard, and that we'll need to use them in more places in the future, it makes sense to move their definition into the core framework. However, analog display usually have fairly loose timings requirements, the only discrete parameters being the total number of lines and pixel clock frequency. Thus, we created a function that will create a display mode from the standard, the pixel frequency and the active area. Tested-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> Acked-in-principle-or-something-like-that-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://lore.kernel.org/r/20220728-rpi-analog-tv-properties-v10-6-256dad125326@cerno.tech Signed-off-by: Maxime Ripard <maxime@cerno.tech>
This commit is contained in:
145
drivers/gpu/drm/tests/drm_modes_test.c
Normal file
145
drivers/gpu/drm/tests/drm_modes_test.c
Normal file
@@ -0,0 +1,145 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Kunit test for drm_modes functions
|
||||
*/
|
||||
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_modes.h>
|
||||
|
||||
#include <kunit/test.h>
|
||||
|
||||
#include <linux/units.h>
|
||||
|
||||
#include "drm_kunit_helpers.h"
|
||||
|
||||
struct drm_test_modes_priv {
|
||||
struct drm_device *drm;
|
||||
};
|
||||
|
||||
static int drm_test_modes_init(struct kunit *test)
|
||||
{
|
||||
struct drm_test_modes_priv *priv;
|
||||
|
||||
priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
|
||||
KUNIT_ASSERT_NOT_NULL(test, priv);
|
||||
|
||||
priv->drm = drm_kunit_device_init(test, DRIVER_MODESET, "drm-modes-test");
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->drm);
|
||||
|
||||
test->priv = priv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void drm_test_modes_analog_tv_ntsc_480i(struct kunit *test)
|
||||
{
|
||||
struct drm_test_modes_priv *priv = test->priv;
|
||||
struct drm_display_mode *mode;
|
||||
|
||||
mode = drm_analog_tv_mode(priv->drm,
|
||||
DRM_MODE_TV_MODE_NTSC,
|
||||
13500 * HZ_PER_KHZ, 720, 480,
|
||||
true);
|
||||
KUNIT_ASSERT_NOT_NULL(test, mode);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 60);
|
||||
KUNIT_EXPECT_EQ(test, mode->hdisplay, 720);
|
||||
|
||||
/* BT.601 defines hsync_start at 736 for 480i */
|
||||
KUNIT_EXPECT_EQ(test, mode->hsync_start, 736);
|
||||
|
||||
/*
|
||||
* The NTSC standard expects a line to take 63.556us. With a
|
||||
* pixel clock of 13.5 MHz, a pixel takes around 74ns, so we
|
||||
* need to have 63556ns / 74ns = 858.
|
||||
*
|
||||
* This is also mandated by BT.601.
|
||||
*/
|
||||
KUNIT_EXPECT_EQ(test, mode->htotal, 858);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, mode->vdisplay, 480);
|
||||
KUNIT_EXPECT_EQ(test, mode->vtotal, 525);
|
||||
}
|
||||
|
||||
static void drm_test_modes_analog_tv_ntsc_480i_inlined(struct kunit *test)
|
||||
{
|
||||
struct drm_test_modes_priv *priv = test->priv;
|
||||
struct drm_display_mode *expected, *mode;
|
||||
|
||||
expected = drm_analog_tv_mode(priv->drm,
|
||||
DRM_MODE_TV_MODE_NTSC,
|
||||
13500 * HZ_PER_KHZ, 720, 480,
|
||||
true);
|
||||
KUNIT_ASSERT_NOT_NULL(test, expected);
|
||||
|
||||
mode = drm_mode_analog_ntsc_480i(priv->drm);
|
||||
KUNIT_ASSERT_NOT_NULL(test, mode);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected, mode));
|
||||
}
|
||||
|
||||
static void drm_test_modes_analog_tv_pal_576i(struct kunit *test)
|
||||
{
|
||||
struct drm_test_modes_priv *priv = test->priv;
|
||||
struct drm_display_mode *mode;
|
||||
|
||||
mode = drm_analog_tv_mode(priv->drm,
|
||||
DRM_MODE_TV_MODE_PAL,
|
||||
13500 * HZ_PER_KHZ, 720, 576,
|
||||
true);
|
||||
KUNIT_ASSERT_NOT_NULL(test, mode);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 50);
|
||||
KUNIT_EXPECT_EQ(test, mode->hdisplay, 720);
|
||||
|
||||
/* BT.601 defines hsync_start at 732 for 576i */
|
||||
KUNIT_EXPECT_EQ(test, mode->hsync_start, 732);
|
||||
|
||||
/*
|
||||
* The PAL standard expects a line to take 64us. With a pixel
|
||||
* clock of 13.5 MHz, a pixel takes around 74ns, so we need to
|
||||
* have 64000ns / 74ns = 864.
|
||||
*
|
||||
* This is also mandated by BT.601.
|
||||
*/
|
||||
KUNIT_EXPECT_EQ(test, mode->htotal, 864);
|
||||
|
||||
KUNIT_EXPECT_EQ(test, mode->vdisplay, 576);
|
||||
KUNIT_EXPECT_EQ(test, mode->vtotal, 625);
|
||||
}
|
||||
|
||||
static void drm_test_modes_analog_tv_pal_576i_inlined(struct kunit *test)
|
||||
{
|
||||
struct drm_test_modes_priv *priv = test->priv;
|
||||
struct drm_display_mode *expected, *mode;
|
||||
|
||||
expected = drm_analog_tv_mode(priv->drm,
|
||||
DRM_MODE_TV_MODE_PAL,
|
||||
13500 * HZ_PER_KHZ, 720, 576,
|
||||
true);
|
||||
KUNIT_ASSERT_NOT_NULL(test, expected);
|
||||
|
||||
mode = drm_mode_analog_pal_576i(priv->drm);
|
||||
KUNIT_ASSERT_NOT_NULL(test, mode);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected, mode));
|
||||
}
|
||||
|
||||
static struct kunit_case drm_modes_analog_tv_tests[] = {
|
||||
KUNIT_CASE(drm_test_modes_analog_tv_ntsc_480i),
|
||||
KUNIT_CASE(drm_test_modes_analog_tv_ntsc_480i_inlined),
|
||||
KUNIT_CASE(drm_test_modes_analog_tv_pal_576i),
|
||||
KUNIT_CASE(drm_test_modes_analog_tv_pal_576i_inlined),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct kunit_suite drm_modes_analog_tv_test_suite = {
|
||||
.name = "drm_modes_analog_tv",
|
||||
.init = drm_test_modes_init,
|
||||
.test_cases = drm_modes_analog_tv_tests,
|
||||
};
|
||||
|
||||
kunit_test_suite(drm_modes_analog_tv_test_suite);
|
||||
|
||||
MODULE_AUTHOR("Maxime Ripard <maxime@cerno.tech>");
|
||||
MODULE_LICENSE("GPL");
|
||||
Reference in New Issue
Block a user