Add KUnit tests for the HDMI source-side scrambling validation done by
the new drmm_connector_hdmi_init() helper.

Connector initialization derives scrambler support from the
driver-provided supported_hdmi_ver capability.  Therefore, connectors
that advertise HDMI 2.0 or later must provide both .scrambler_enable()
and .scrambler_disable() callbacks.  Registration is rejected if either
callback is missing.

Signed-off-by: Cristian Ciocaltea <[email protected]>
---
 drivers/gpu/drm/tests/drm_connector_test.c | 102 +++++++++++++++++++++++++++++
 1 file changed, 102 insertions(+)

diff --git a/drivers/gpu/drm/tests/drm_connector_test.c 
b/drivers/gpu/drm/tests/drm_connector_test.c
index 17242d1c1b16..0613568ef5b7 100644
--- a/drivers/gpu/drm/tests/drm_connector_test.c
+++ b/drivers/gpu/drm/tests/drm_connector_test.c
@@ -1417,6 +1417,104 @@ static void 
drm_test_connector_hdmi_init_max_tmds_rate_no_version(struct kunit *
        KUNIT_EXPECT_LT(test, ret, 0);
 }
 
+/*
+ * Test that the registration of an HDMI connector advertising HDMI 2.0 support
+ * succeeds when the .scrambler_{enable,disable} callbacks are provided.
+ */
+static void drm_test_connector_hdmi_init_scrambler_valid(struct kunit *test)
+{
+       struct drm_connector_init_priv *priv = test->priv;
+       int ret;
+
+       ret = drmm_connector_hdmi_init(&priv->drm, &priv->connector,
+                                      &dummy_funcs,
+                                      &dummy_hdmi_funcs_scrambler,
+                                      DRM_MODE_CONNECTOR_HDMIA,
+                                      &priv->ddc);
+       KUNIT_EXPECT_EQ(test, ret, 0);
+       KUNIT_EXPECT_TRUE(test, 
drm_connector_hdmi_scrambler_supported(&priv->connector));
+}
+
+/*
+ * Test that the registration of an HDMI connector not advertising HDMI 2.0
+ * support succeeds, and the connector is not reported as scrambling capable.
+ */
+static void drm_test_connector_hdmi_init_scrambler_unsupported(struct kunit 
*test)
+{
+       struct drm_connector_init_priv *priv = test->priv;
+       int ret;
+
+       ret = drmm_connector_hdmi_init(&priv->drm, &priv->connector,
+                                      &dummy_funcs,
+                                      &dummy_hdmi_funcs,
+                                      DRM_MODE_CONNECTOR_HDMIA,
+                                      &priv->ddc);
+       KUNIT_EXPECT_EQ(test, ret, 0);
+       KUNIT_EXPECT_FALSE(test, 
drm_connector_hdmi_scrambler_supported(&priv->connector));
+}
+
+enum drm_connector_hdmi_scrambler_cb {
+       SCRAMBLER_CALLBACK_ENABLE,
+       SCRAMBLER_CALLBACK_DISABLE,
+       SCRAMBLER_CALLBACK_ALL,
+};
+
+struct drm_connector_hdmi_init_scrambler_missing_cb_case {
+       const char *desc;
+       enum drm_connector_hdmi_scrambler_cb cb;
+};
+
+/*
+ * Test that the registration of an HDMI connector advertising HDMI 2.0 support
+ * fails when any single .scrambler_* callback is missing.
+ */
+static void drm_test_connector_hdmi_init_scrambler_missing_cb(struct kunit 
*test)
+{
+       const struct drm_connector_hdmi_init_scrambler_missing_cb_case *params 
= test->param_value;
+       struct drm_connector_init_priv *priv = test->priv;
+       int ret;
+
+       priv->hdmi_funcs = dummy_hdmi_funcs_scrambler;
+
+       switch (params->cb) {
+       case SCRAMBLER_CALLBACK_ENABLE:
+               priv->hdmi_funcs.scrambler_enable = NULL;
+               break;
+       case SCRAMBLER_CALLBACK_DISABLE:
+               priv->hdmi_funcs.scrambler_disable = NULL;
+               break;
+       case SCRAMBLER_CALLBACK_ALL:
+               priv->hdmi_funcs.scrambler_enable = NULL;
+               priv->hdmi_funcs.scrambler_disable = NULL;
+               break;
+       }
+
+       ret = drmm_connector_hdmi_init(&priv->drm, &priv->connector,
+                                      &dummy_funcs,
+                                      &priv->hdmi_funcs,
+                                      DRM_MODE_CONNECTOR_HDMIA,
+                                      &priv->ddc);
+       KUNIT_EXPECT_LT(test, ret, 0);
+}
+
+static const struct drm_connector_hdmi_init_scrambler_missing_cb_case
+drm_connector_hdmi_init_scrambler_missing_cb_tests[] = {
+       { "scrambler_enable",   SCRAMBLER_CALLBACK_ENABLE },
+       { "scrambler_disable",  SCRAMBLER_CALLBACK_DISABLE },
+       { "scrambler_*",        SCRAMBLER_CALLBACK_ALL },
+};
+
+static void
+drm_connector_hdmi_init_scrambler_missing_cb_desc(const struct 
drm_connector_hdmi_init_scrambler_missing_cb_case *t,
+                                                 char *desc)
+{
+       strscpy(desc, t->desc, KUNIT_PARAM_DESC_SIZE);
+}
+
+KUNIT_ARRAY_PARAM(drm_connector_hdmi_init_scrambler_missing_cb,
+                 drm_connector_hdmi_init_scrambler_missing_cb_tests,
+                 drm_connector_hdmi_init_scrambler_missing_cb_desc);
+
 static struct kunit_case drmm_connector_hdmi_init_tests[] = {
        KUNIT_CASE(drm_test_connector_hdmi_init_valid),
        KUNIT_CASE(drm_test_connector_hdmi_init_bpc_8),
@@ -1447,6 +1545,10 @@ static struct kunit_case 
drmm_connector_hdmi_init_tests[] = {
        KUNIT_CASE(drm_test_connector_hdmi_init_max_tmds_rate_at_limit),
        KUNIT_CASE(drm_test_connector_hdmi_init_max_tmds_rate_off_limit),
        KUNIT_CASE(drm_test_connector_hdmi_init_max_tmds_rate_no_version),
+       KUNIT_CASE(drm_test_connector_hdmi_init_scrambler_valid),
+       KUNIT_CASE(drm_test_connector_hdmi_init_scrambler_unsupported),
+       KUNIT_CASE_PARAM(drm_test_connector_hdmi_init_scrambler_missing_cb,
+                        
drm_connector_hdmi_init_scrambler_missing_cb_gen_params),
        { }
 };
 

-- 
2.55.0

Reply via email to