Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/tests: Add HDMI connector rate filter hook tests

The previous patch adds a new hook for HDMI connectors to filter out
configurations based on the TMDS character rate. Let's add some tests to
make sure it works as expected.

Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240527-kms-hdmi-connector-state-v15-14-c5af16c3aae2@kernel.org
Signed-off-by: Maxime Ripard <mripard@kernel.org>

+65
+65
drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c
··· 115 115 static const struct drm_connector_hdmi_funcs dummy_connector_hdmi_funcs = { 116 116 }; 117 117 118 + static enum drm_mode_status 119 + reject_connector_tmds_char_rate_valid(const struct drm_connector *connector, 120 + const struct drm_display_mode *mode, 121 + unsigned long long tmds_rate) 122 + { 123 + return MODE_BAD; 124 + } 125 + 126 + static const struct drm_connector_hdmi_funcs reject_connector_hdmi_funcs = { 127 + .tmds_char_rate_valid = reject_connector_tmds_char_rate_valid, 128 + }; 129 + 118 130 static int dummy_connector_get_modes(struct drm_connector *connector) 119 131 { 120 132 struct drm_atomic_helper_connector_hdmi_priv *priv = ··· 505 493 KUNIT_EXPECT_EQ(test, conn_state->hdmi.tmds_char_rate, preferred->clock * 1500); 506 494 } 507 495 496 + /* 497 + * Test that if we filter a rate through our hook, it's indeed rejected 498 + * by the whole atomic_check logic. 499 + * 500 + * We do so by first doing a commit on the pipeline to make sure that it 501 + * works, change the HDMI helpers pointer, and then try the same commit 502 + * again to see if it fails as it should. 503 + */ 504 + static void drm_test_check_hdmi_funcs_reject_rate(struct kunit *test) 505 + { 506 + struct drm_atomic_helper_connector_hdmi_priv *priv; 507 + struct drm_modeset_acquire_ctx *ctx; 508 + struct drm_atomic_state *state; 509 + struct drm_display_mode *preferred; 510 + struct drm_crtc_state *crtc_state; 511 + struct drm_connector *conn; 512 + struct drm_device *drm; 513 + struct drm_crtc *crtc; 514 + int ret; 515 + 516 + priv = drm_atomic_helper_connector_hdmi_init(test, 517 + BIT(HDMI_COLORSPACE_RGB), 518 + 8); 519 + KUNIT_ASSERT_NOT_NULL(test, priv); 520 + 521 + ctx = drm_kunit_helper_acquire_ctx_alloc(test); 522 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx); 523 + 524 + conn = &priv->connector; 525 + preferred = find_preferred_mode(conn); 526 + KUNIT_ASSERT_NOT_NULL(test, preferred); 527 + 528 + drm = &priv->drm; 529 + crtc = priv->crtc; 530 + ret = light_up_connector(test, drm, crtc, conn, preferred, ctx); 531 + KUNIT_ASSERT_EQ(test, ret, 0); 532 + 533 + /* You shouldn't be doing that at home. */ 534 + conn->hdmi.funcs = &reject_connector_hdmi_funcs; 535 + 536 + state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx); 537 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); 538 + 539 + crtc_state = drm_atomic_get_crtc_state(state, crtc); 540 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); 541 + 542 + crtc_state->connectors_changed = true; 543 + 544 + ret = drm_atomic_check_only(state); 545 + KUNIT_EXPECT_LT(test, ret, 0); 546 + } 547 + 508 548 static struct kunit_case drm_atomic_helper_connector_hdmi_check_tests[] = { 549 + KUNIT_CASE(drm_test_check_hdmi_funcs_reject_rate), 509 550 KUNIT_CASE(drm_test_check_output_bpc_crtc_mode_changed), 510 551 KUNIT_CASE(drm_test_check_output_bpc_crtc_mode_not_changed), 511 552 KUNIT_CASE(drm_test_check_tmds_char_rate_rgb_8bpc),