[PATCH v2 27/27] drm/tests: hdmi: Add tests for vrr_display_{min,max} properties

From: Nicolas Frattaroli

Date: Thu Nov 05 2026 - 11:29:13 EST


Attach the vrr_display_min and vrr_display_max properties to the KUnit
HDMI state helper test connector, and add two simple tests to verify the
introduced drm_connector_hdmi_update_vrr_limits() helper sets the
properties right depending on EDID.

Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@xxxxxxxxxxxxx>
---
drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c | 87 ++++++++++++++++++++++
1 file changed, 87 insertions(+)

diff --git a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c b/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c
index 4c7e563ca51d..7bd06b65d241 100644
--- a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c
+++ b/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c
@@ -308,6 +308,9 @@ __connector_hdmi_init(struct kunit *test,
KUNIT_ASSERT_EQ(test, ret, 0);
conn->hdmi.qms_supported = true;

+ ret = drm_connector_attach_vrr_display_limits_properties(conn);
+ KUNIT_ASSERT_EQ(test, ret, 0);
+
drm_mode_config_reset(drm);

if (edid_data && edid_len) {
@@ -3676,6 +3679,88 @@ static void drm_test_check_hdmi_vrr_flush_vsync(struct kunit *test)
crtc_state->vrr_state.max_vtotal);
}

+/*
+ * Check that on a VRR-capable sink, the HDMI VRR limits helper sets the
+ * display_min/display_max connector properties to the right values.
+ */
+static void drm_test_check_hdmi_vrr_display_limits(struct kunit *test)
+{
+ struct drm_atomic_helper_connector_hdmi_priv *priv;
+ struct drm_display_mode *preferred;
+ struct drm_connector *conn;
+ u64 disp_min, disp_max;
+ int ret;
+
+ priv = drm_kunit_helper_connector_hdmi_init_with_edid_funcs(test,
+ BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444),
+ 8,
+ &dummy_connector_hdmi_funcs,
+ test_edid_hdmi_vrr);
+ KUNIT_ASSERT_NOT_NULL(test, priv);
+
+ conn = &priv->connector;
+ KUNIT_ASSERT_TRUE(test, conn->display_info.is_hdmi);
+ KUNIT_ASSERT_TRUE(test, conn->display_info.hdmi.vrr_cap.supported);
+
+ preferred = find_preferred_mode(conn);
+ KUNIT_ASSERT_NOT_NULL(test, preferred);
+
+ ret = drm_connector_hdmi_update_vrr_limits(conn, preferred);
+ KUNIT_ASSERT_EQ(test, ret, 0);
+
+ ret = drm_object_property_get_value(&conn->base, conn->vrr_display_min_property,
+ &disp_min);
+ KUNIT_EXPECT_EQ(test, ret, 0);
+
+ ret = drm_object_property_get_value(&conn->base, conn->vrr_display_max_property,
+ &disp_max);
+ KUNIT_EXPECT_EQ(test, ret, 0);
+
+ KUNIT_EXPECT_EQ(test, disp_min, 30);
+ KUNIT_EXPECT_EQ(test, disp_max, 120);
+}
+
+/*
+ * Check that on a non-VRR-capable sink, the HDMI VRR limits helper sets the
+ * display_min/display_max connector properties to 0.
+ */
+static void drm_test_check_hdmi_vrr_display_limits_zero(struct kunit *test)
+{
+ struct drm_atomic_helper_connector_hdmi_priv *priv;
+ struct drm_display_mode *preferred;
+ struct drm_connector *conn;
+ u64 disp_min, disp_max;
+ int ret;
+
+ priv = drm_kunit_helper_connector_hdmi_init_with_edid_funcs(test,
+ BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444),
+ 8,
+ &dummy_connector_hdmi_funcs,
+ test_edid_hdmi_4k_rgb_yuv420_dc_max_340mhz);
+ KUNIT_ASSERT_NOT_NULL(test, priv);
+
+ conn = &priv->connector;
+ KUNIT_ASSERT_TRUE(test, conn->display_info.is_hdmi);
+ KUNIT_ASSERT_FALSE(test, conn->display_info.hdmi.vrr_cap.supported);
+
+ preferred = find_preferred_mode(conn);
+ KUNIT_ASSERT_NOT_NULL(test, preferred);
+
+ ret = drm_connector_hdmi_update_vrr_limits(conn, preferred);
+ KUNIT_ASSERT_EQ(test, ret, 0);
+
+ ret = drm_object_property_get_value(&conn->base, conn->vrr_display_min_property,
+ &disp_min);
+ KUNIT_EXPECT_EQ(test, ret, 0);
+
+ ret = drm_object_property_get_value(&conn->base, conn->vrr_display_max_property,
+ &disp_max);
+ KUNIT_EXPECT_EQ(test, ret, 0);
+
+ KUNIT_EXPECT_EQ(test, disp_min, 0);
+ KUNIT_EXPECT_EQ(test, disp_max, 0);
+}
+
/*
* Check that on a VRR-capable sink with VRR enabled and a fixed target rate
* set, an atomic commit works, and the derived vtotals are as expected.
@@ -4622,6 +4707,8 @@ static struct kunit_case drm_atomic_helper_connector_hdmi_vrr_tests[] = {
KUNIT_CASE(drm_test_check_hdmi_vrr),
KUNIT_CASE(drm_test_check_hdmi_vrr_sink_fail),
KUNIT_CASE(drm_test_check_hdmi_vrr_flush_vsync),
+ KUNIT_CASE(drm_test_check_hdmi_vrr_display_limits),
+ KUNIT_CASE(drm_test_check_hdmi_vrr_display_limits_zero),
KUNIT_CASE(drm_test_check_hdmi_vrr_fixed_rate),
KUNIT_CASE(drm_test_check_hdmi_vrr_fixed_rate_flush_vsync),
KUNIT_CASE_PARAM(drm_test_check_hdmi_vrr_target_rate_fail,

--
2.56.0