From: Bhawanpreet Lakha <[email protected]> Add KUnit coverage for adjust_colour_depth_from_display_info() 420 reduction, amdgpu_dm_get_output_color_space() Y_ONLY/YCbCr601/BT2020 fallbacks, to_drm_connector_type() dual-link DVI-D, and copy_crtc_timing_for_drm_display_mode().
Export copy_crtc_timing_for_drm_display_mode via EXPORT_IF_KUNIT so the tests can reach it. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <[email protected]> Signed-off-by: Bhawanpreet Lakha <[email protected]> Signed-off-by: George Zhang <[email protected]> --- .../display/amdgpu_dm/amdgpu_dm_connector.c | 3 +- .../display/amdgpu_dm/amdgpu_dm_connector.h | 2 + .../tests/amdgpu_dm_connector_test.c | 186 ++++++++++++++++++ 3 files changed, 190 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c index 56e4bbff383f..96f7bf446570 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c @@ -948,7 +948,7 @@ static void fill_stream_properties_from_drm_display_mode( stream->content_type = get_output_content_type(connector_state); } -static void +STATIC_IFN_KUNIT void copy_crtc_timing_for_drm_display_mode(const struct drm_display_mode *src_mode, struct drm_display_mode *dst_mode) { @@ -967,6 +967,7 @@ copy_crtc_timing_for_drm_display_mode(const struct drm_display_mode *src_mode, dst_mode->crtc_vsync_end = src_mode->crtc_vsync_end; dst_mode->crtc_vtotal = src_mode->crtc_vtotal; } +EXPORT_IF_KUNIT(copy_crtc_timing_for_drm_display_mode); STATIC_IFN_KUNIT void decide_crtc_timing_for_drm_display_mode(struct drm_display_mode *drm_mode, diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h index 865646303dcb..e9ee4a4ad30e 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h @@ -155,6 +155,8 @@ bool adjust_colour_depth_from_display_info(struct dc_crtc_timing *timing_out, int to_drm_connector_type(enum signal_type st, uint32_t connector_id); bool is_duplicate_mode(struct amdgpu_dm_connector *aconnector, struct drm_display_mode *mode); enum dc_aspect_ratio get_aspect_ratio(const struct drm_display_mode *mode_in); +void copy_crtc_timing_for_drm_display_mode(const struct drm_display_mode *src_mode, + struct drm_display_mode *dst_mode); void decide_crtc_timing_for_drm_display_mode(struct drm_display_mode *drm_mode, const struct drm_display_mode *native_mode, bool scale_enabled); diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c index 45210c64a000..91f9543dd7bb 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c @@ -290,6 +290,30 @@ static void dm_test_adjust_colour_depth_420_halves_clk(struct kunit *test) KUNIT_EXPECT_EQ(test, (int)timing.display_color_depth, (int)COLOR_DEPTH_101010); } +/** + * dm_test_adjust_colour_depth_420_reduces - Test Adjust colour depth 420 reduces + * @test: The KUnit test context + */ +static void dm_test_adjust_colour_depth_420_reduces(struct kunit *test) +{ + struct dc_crtc_timing timing = {}; + struct drm_display_info info = {}; + + /* 4K @ 594000 KHz = 5940000 in 100Hz units */ + timing.pix_clk_100hz = 5940000; + timing.display_color_depth = COLOR_DEPTH_121212; + timing.pixel_encoding = PIXEL_ENCODING_YCBCR420; + /* + * With 420: effective = 594000/2 = 297000. + * 12bpc = 297000*36/24 = 445500 (exceeds limit), + * 10bpc = 297000*30/24 = 371250 (fits). + */ + info.max_tmds_clock = 400000; + + KUNIT_EXPECT_TRUE(test, adjust_colour_depth_from_display_info(&timing, &info)); + KUNIT_EXPECT_EQ(test, (int)timing.display_color_depth, (int)COLOR_DEPTH_101010); +} + /** * dm_test_adjust_colour_depth_reduces_12bpc_to_10bpc - Test Adjust colour * depth reduces 12bpc to 10bpc @@ -550,6 +574,78 @@ static void dm_test_output_color_space_bt2020_ycc(struct kunit *test) (int)COLOR_SPACE_2020_YCBCR_LIMITED); } +/** + * dm_test_output_color_space_default_ycbcr709_y_only - Test Output color space + * default ycbcr709 limited via Y_ONLY at high pixel clock + * @test: The KUnit test context + */ +static void dm_test_output_color_space_default_ycbcr709_y_only(struct kunit *test) +{ + struct dc_crtc_timing timing = {}; + struct drm_connector_state state = {}; + + timing.pixel_encoding = PIXEL_ENCODING_YCBCR444; + timing.pix_clk_100hz = 300000; + timing.flags.Y_ONLY = 1; + state.colorspace = DRM_MODE_COLORIMETRY_DEFAULT; + + KUNIT_EXPECT_EQ(test, (int)amdgpu_dm_get_output_color_space(&timing, &state), + (int)COLOR_SPACE_YCBCR709_LIMITED); +} + +/** + * dm_test_output_color_space_default_ycbcr601 - Test Output color space default + * ycbcr601 full range at low pixel clock + * @test: The KUnit test context + */ +static void dm_test_output_color_space_default_ycbcr601(struct kunit *test) +{ + struct dc_crtc_timing timing = {}; + struct drm_connector_state state = {}; + + timing.pixel_encoding = PIXEL_ENCODING_YCBCR444; + timing.pix_clk_100hz = 270300; + timing.flags.Y_ONLY = 0; + state.colorspace = DRM_MODE_COLORIMETRY_DEFAULT; + + KUNIT_EXPECT_EQ(test, (int)amdgpu_dm_get_output_color_space(&timing, &state), + (int)COLOR_SPACE_YCBCR601); +} + +/** + * dm_test_output_color_space_bt2020_ycc_rgb_encoding - Test Output color space + * bt2020 ycc with rgb pixel encoding falls back to full range rgb + * @test: The KUnit test context + */ +static void dm_test_output_color_space_bt2020_ycc_rgb_encoding(struct kunit *test) +{ + struct dc_crtc_timing timing = {}; + struct drm_connector_state state = {}; + + timing.pixel_encoding = PIXEL_ENCODING_RGB; + state.colorspace = DRM_MODE_COLORIMETRY_BT2020_YCC; + + KUNIT_EXPECT_EQ(test, (int)amdgpu_dm_get_output_color_space(&timing, &state), + (int)COLOR_SPACE_2020_RGB_FULLRANGE); +} + +/** + * dm_test_output_color_space_bt2020_rgb_ycc_encoding - Test Output color space + * bt2020 rgb with non-rgb pixel encoding falls back to limited ycbcr + * @test: The KUnit test context + */ +static void dm_test_output_color_space_bt2020_rgb_ycc_encoding(struct kunit *test) +{ + struct dc_crtc_timing timing = {}; + struct drm_connector_state state = {}; + + timing.pixel_encoding = PIXEL_ENCODING_YCBCR444; + state.colorspace = DRM_MODE_COLORIMETRY_BT2020_RGB; + + KUNIT_EXPECT_EQ(test, (int)amdgpu_dm_get_output_color_space(&timing, &state), + (int)COLOR_SPACE_2020_YCBCR_LIMITED); +} + /* Tests for amdgpu_dm_convert_dc_color_depth_into_bpc() */ /** @@ -834,6 +930,17 @@ static void dm_test_to_connector_type_dvi_dvid(struct kunit *test) KUNIT_EXPECT_EQ(test, type, DRM_MODE_CONNECTOR_DVID); } +/** + * dm_test_to_connector_type_dual_link_dvid - Test To connector type dual link dvid + * @test: The KUnit test context + */ +static void dm_test_to_connector_type_dual_link_dvid(struct kunit *test) +{ + int type = to_drm_connector_type(SIGNAL_TYPE_DVI_DUAL_LINK, CONNECTOR_ID_DUAL_LINK_DVID); + + KUNIT_EXPECT_EQ(test, type, DRM_MODE_CONNECTOR_DVID); +} + /** * dm_test_to_connector_type_virtual - Test To connector type virtual * @test: The KUnit test context @@ -1124,6 +1231,76 @@ static void dm_test_aspect_ratio_256_135(struct kunit *test) KUNIT_EXPECT_EQ(test, (int)get_aspect_ratio(&mode), (int)ASPECT_RATIO_256_135); } +/* Tests for copy_crtc_timing_for_drm_display_mode() */ + +/** + * dm_test_copy_crtc_timing_copies_all_fields - Test all crtc timing fields copied + * @test: The KUnit test context + */ +static void dm_test_copy_crtc_timing_copies_all_fields(struct kunit *test) +{ + struct drm_display_mode src = {}; + struct drm_display_mode dst = {}; + + src.crtc_hdisplay = 1920; + src.crtc_vdisplay = 1080; + src.crtc_clock = 148500; + src.crtc_hblank_start = 1920; + src.crtc_hblank_end = 2200; + src.crtc_hsync_start = 2008; + src.crtc_hsync_end = 2052; + src.crtc_htotal = 2200; + src.crtc_hskew = 1; + src.crtc_vblank_start = 1080; + src.crtc_vblank_end = 1125; + src.crtc_vsync_start = 1084; + src.crtc_vsync_end = 1089; + src.crtc_vtotal = 1125; + + copy_crtc_timing_for_drm_display_mode(&src, &dst); + + KUNIT_EXPECT_EQ(test, dst.crtc_hdisplay, 1920); + KUNIT_EXPECT_EQ(test, dst.crtc_vdisplay, 1080); + KUNIT_EXPECT_EQ(test, dst.crtc_clock, 148500); + KUNIT_EXPECT_EQ(test, dst.crtc_hblank_start, 1920); + KUNIT_EXPECT_EQ(test, dst.crtc_hblank_end, 2200); + KUNIT_EXPECT_EQ(test, dst.crtc_hsync_start, 2008); + KUNIT_EXPECT_EQ(test, dst.crtc_hsync_end, 2052); + KUNIT_EXPECT_EQ(test, dst.crtc_htotal, 2200); + KUNIT_EXPECT_EQ(test, dst.crtc_hskew, 1); + KUNIT_EXPECT_EQ(test, dst.crtc_vblank_start, 1080); + KUNIT_EXPECT_EQ(test, dst.crtc_vblank_end, 1125); + KUNIT_EXPECT_EQ(test, dst.crtc_vsync_start, 1084); + KUNIT_EXPECT_EQ(test, dst.crtc_vsync_end, 1089); + KUNIT_EXPECT_EQ(test, dst.crtc_vtotal, 1125); +} + +/** + * dm_test_copy_crtc_timing_leaves_non_crtc_fields - Test non-crtc fields untouched + * @test: The KUnit test context + */ +static void dm_test_copy_crtc_timing_leaves_non_crtc_fields(struct kunit *test) +{ + struct drm_display_mode src = {}; + struct drm_display_mode dst = {}; + + src.crtc_hdisplay = 1280; + src.crtc_vdisplay = 720; + + /* Non-crtc geometry on dst must be preserved by the copy */ + dst.hdisplay = 1920; + dst.vdisplay = 1080; + dst.clock = 148500; + + copy_crtc_timing_for_drm_display_mode(&src, &dst); + + KUNIT_EXPECT_EQ(test, dst.crtc_hdisplay, 1280); + KUNIT_EXPECT_EQ(test, dst.crtc_vdisplay, 720); + KUNIT_EXPECT_EQ(test, dst.hdisplay, 1920); + KUNIT_EXPECT_EQ(test, dst.vdisplay, 1080); + KUNIT_EXPECT_EQ(test, dst.clock, 148500); +} + /* Tests for decide_crtc_timing_for_drm_display_mode() */ /** @@ -2372,6 +2549,7 @@ static struct kunit_case amdgpu_dm_connector_tests[] = { KUNIT_CASE(dm_test_adjust_colour_depth_reduces_to_888), KUNIT_CASE(dm_test_adjust_colour_depth_10bpc_passes), KUNIT_CASE(dm_test_adjust_colour_depth_420_halves_clk), + KUNIT_CASE(dm_test_adjust_colour_depth_420_reduces), KUNIT_CASE(dm_test_adjust_colour_depth_reduces_12bpc_to_10bpc), KUNIT_CASE(dm_test_adjust_colour_depth_16bpc_no_fallback), KUNIT_CASE(dm_test_adjust_colour_depth_none_fits), @@ -2388,6 +2566,10 @@ static struct kunit_case amdgpu_dm_connector_tests[] = { KUNIT_CASE(dm_test_output_color_space_oprgb), KUNIT_CASE(dm_test_output_color_space_bt2020_rgb), KUNIT_CASE(dm_test_output_color_space_bt2020_ycc), + KUNIT_CASE(dm_test_output_color_space_default_ycbcr709_y_only), + KUNIT_CASE(dm_test_output_color_space_default_ycbcr601), + KUNIT_CASE(dm_test_output_color_space_bt2020_ycc_rgb_encoding), + KUNIT_CASE(dm_test_output_color_space_bt2020_rgb_ycc_encoding), /* Tests for amdgpu_dm_convert_dc_color_depth_into_bpc */ KUNIT_CASE(dm_test_convert_color_depth_bpc_mappings), KUNIT_CASE(dm_test_convert_color_depth_bpc_unknown), @@ -2412,6 +2594,7 @@ static struct kunit_case amdgpu_dm_connector_tests[] = { KUNIT_CASE(dm_test_to_connector_type_dvi_dvii), KUNIT_CASE(dm_test_to_connector_type_dual_link_dvii), KUNIT_CASE(dm_test_to_connector_type_dvi_dvid), + KUNIT_CASE(dm_test_to_connector_type_dual_link_dvid), KUNIT_CASE(dm_test_to_connector_type_virtual), KUNIT_CASE(dm_test_to_connector_type_unknown), /* is_duplicate_mode */ @@ -2433,6 +2616,9 @@ static struct kunit_case amdgpu_dm_connector_tests[] = { KUNIT_CASE(dm_test_aspect_ratio_16_9), KUNIT_CASE(dm_test_aspect_ratio_64_27), KUNIT_CASE(dm_test_aspect_ratio_256_135), + /* copy_crtc_timing_for_drm_display_mode */ + KUNIT_CASE(dm_test_copy_crtc_timing_copies_all_fields), + KUNIT_CASE(dm_test_copy_crtc_timing_leaves_non_crtc_fields), /* decide_crtc_timing_for_drm_display_mode */ KUNIT_CASE(dm_test_decide_crtc_timing_scale_enabled), KUNIT_CASE(dm_test_decide_crtc_timing_matching_mode), -- 2.55.0
