LCOV - code coverage report
Current view: top level - drivers/gpu/drm/tests - drm_modes_test.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 47 0.0 %
Date: 2023-08-24 13:40:31 Functions: 0 5 0.0 %

          Line data    Source code
       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           0 : static int drm_test_modes_init(struct kunit *test)
      20             : {
      21             :         struct drm_test_modes_priv *priv;
      22             : 
      23           0 :         priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
      24           0 :         KUNIT_ASSERT_NOT_NULL(test, priv);
      25             : 
      26           0 :         priv->dev = drm_kunit_helper_alloc_device(test);
      27           0 :         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->dev);
      28             : 
      29           0 :         priv->drm = __drm_kunit_helper_alloc_drm_device(test, priv->dev,
      30             :                                                         sizeof(*priv->drm), 0,
      31             :                                                         DRIVER_MODESET);
      32           0 :         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->drm);
      33             : 
      34           0 :         test->priv = priv;
      35             : 
      36           0 :         return 0;
      37             : }
      38             : 
      39           0 : static void drm_test_modes_analog_tv_ntsc_480i(struct kunit *test)
      40             : {
      41           0 :         struct drm_test_modes_priv *priv = test->priv;
      42             :         struct drm_display_mode *mode;
      43             : 
      44           0 :         mode = drm_analog_tv_mode(priv->drm,
      45             :                                   DRM_MODE_TV_MODE_NTSC,
      46             :                                   13500 * HZ_PER_KHZ, 720, 480,
      47             :                                   true);
      48           0 :         KUNIT_ASSERT_NOT_NULL(test, mode);
      49             : 
      50           0 :         KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 60);
      51           0 :         KUNIT_EXPECT_EQ(test, mode->hdisplay, 720);
      52             : 
      53             :         /* BT.601 defines hsync_start at 736 for 480i */
      54           0 :         KUNIT_EXPECT_EQ(test, mode->hsync_start, 736);
      55             : 
      56             :         /*
      57             :          * The NTSC standard expects a line to take 63.556us. With a
      58             :          * pixel clock of 13.5 MHz, a pixel takes around 74ns, so we
      59             :          * need to have 63556ns / 74ns = 858.
      60             :          *
      61             :          * This is also mandated by BT.601.
      62             :          */
      63           0 :         KUNIT_EXPECT_EQ(test, mode->htotal, 858);
      64             : 
      65           0 :         KUNIT_EXPECT_EQ(test, mode->vdisplay, 480);
      66           0 :         KUNIT_EXPECT_EQ(test, mode->vtotal, 525);
      67           0 : }
      68             : 
      69           0 : static void drm_test_modes_analog_tv_ntsc_480i_inlined(struct kunit *test)
      70             : {
      71           0 :         struct drm_test_modes_priv *priv = test->priv;
      72             :         struct drm_display_mode *expected, *mode;
      73             : 
      74           0 :         expected = drm_analog_tv_mode(priv->drm,
      75             :                                       DRM_MODE_TV_MODE_NTSC,
      76             :                                       13500 * HZ_PER_KHZ, 720, 480,
      77             :                                       true);
      78           0 :         KUNIT_ASSERT_NOT_NULL(test, expected);
      79             : 
      80           0 :         mode = drm_mode_analog_ntsc_480i(priv->drm);
      81           0 :         KUNIT_ASSERT_NOT_NULL(test, mode);
      82             : 
      83           0 :         KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected, mode));
      84           0 : }
      85             : 
      86           0 : static void drm_test_modes_analog_tv_pal_576i(struct kunit *test)
      87             : {
      88           0 :         struct drm_test_modes_priv *priv = test->priv;
      89             :         struct drm_display_mode *mode;
      90             : 
      91           0 :         mode = drm_analog_tv_mode(priv->drm,
      92             :                                   DRM_MODE_TV_MODE_PAL,
      93             :                                   13500 * HZ_PER_KHZ, 720, 576,
      94             :                                   true);
      95           0 :         KUNIT_ASSERT_NOT_NULL(test, mode);
      96             : 
      97           0 :         KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 50);
      98           0 :         KUNIT_EXPECT_EQ(test, mode->hdisplay, 720);
      99             : 
     100             :         /* BT.601 defines hsync_start at 732 for 576i */
     101           0 :         KUNIT_EXPECT_EQ(test, mode->hsync_start, 732);
     102             : 
     103             :         /*
     104             :          * The PAL standard expects a line to take 64us. With a pixel
     105             :          * clock of 13.5 MHz, a pixel takes around 74ns, so we need to
     106             :          * have 64000ns / 74ns = 864.
     107             :          *
     108             :          * This is also mandated by BT.601.
     109             :          */
     110           0 :         KUNIT_EXPECT_EQ(test, mode->htotal, 864);
     111             : 
     112           0 :         KUNIT_EXPECT_EQ(test, mode->vdisplay, 576);
     113           0 :         KUNIT_EXPECT_EQ(test, mode->vtotal, 625);
     114           0 : }
     115             : 
     116           0 : static void drm_test_modes_analog_tv_pal_576i_inlined(struct kunit *test)
     117             : {
     118           0 :         struct drm_test_modes_priv *priv = test->priv;
     119             :         struct drm_display_mode *expected, *mode;
     120             : 
     121           0 :         expected = drm_analog_tv_mode(priv->drm,
     122             :                                       DRM_MODE_TV_MODE_PAL,
     123             :                                       13500 * HZ_PER_KHZ, 720, 576,
     124             :                                       true);
     125           0 :         KUNIT_ASSERT_NOT_NULL(test, expected);
     126             : 
     127           0 :         mode = drm_mode_analog_pal_576i(priv->drm);
     128           0 :         KUNIT_ASSERT_NOT_NULL(test, mode);
     129             : 
     130           0 :         KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected, mode));
     131           0 : }
     132             : 
     133             : static struct kunit_case drm_modes_analog_tv_tests[] = {
     134             :         KUNIT_CASE(drm_test_modes_analog_tv_ntsc_480i),
     135             :         KUNIT_CASE(drm_test_modes_analog_tv_ntsc_480i_inlined),
     136             :         KUNIT_CASE(drm_test_modes_analog_tv_pal_576i),
     137             :         KUNIT_CASE(drm_test_modes_analog_tv_pal_576i_inlined),
     138             :         { }
     139             : };
     140             : 
     141             : static struct kunit_suite drm_modes_analog_tv_test_suite = {
     142             :         .name = "drm_modes_analog_tv",
     143             :         .init = drm_test_modes_init,
     144             :         .test_cases = drm_modes_analog_tv_tests,
     145             : };
     146             : 
     147             : kunit_test_suite(drm_modes_analog_tv_test_suite);
     148             : 
     149             : MODULE_AUTHOR("Maxime Ripard <maxime@cerno.tech>");
     150             : MODULE_LICENSE("GPL");

Generated by: LCOV version 1.14