From: Alex Hung <[email protected]> [WHY] The enabled colorop shaper, 3D LUT, and blend programming paths were uncovered, including the fallback for missing 3D LUT data.
[HOW] Build complete colorop pipelines with valid LUT blobs, verify each enabled stage, and cover the empty 3D LUT fallback. Assisted-by: Copilot:GPT-5.6-Sol Reviewed-by: Bhawanpreet Lakha <[email protected]> Signed-off-by: Alex Hung <[email protected]> Signed-off-by: Fangzhi Zuo <[email protected]> Tested-by: Dan Wheeler <[email protected]> --- .../amdgpu_dm/tests/amdgpu_dm_color_test.c | 206 ++++++++++++++++++ 1 file changed, 206 insertions(+) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_color_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_color_test.c index 11d42ff59dff..8c2f7ab5f8d3 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_color_test.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_color_test.c @@ -2676,6 +2676,208 @@ static void dm_test_update_plane_color_mgmt_colorop_no_3dlut_hw(struct kunit *te KUNIT_EXPECT_FALSE(test, f.dc_plane_state->cm.flags.bits.lut3d_enable); } +/** + * dm_test_update_plane_color_mgmt_colorop_shaper - enabled shaper TF and LUT succeed + * @test: KUnit test context + */ +static void dm_test_update_plane_color_mgmt_colorop_shaper(struct kunit *test) +{ + static const enum drm_colorop_type types[] = { + DRM_COLOROP_1D_CURVE, + DRM_COLOROP_MULTIPLIER, + DRM_COLOROP_CTM_3X4, + DRM_COLOROP_1D_CURVE, + DRM_COLOROP_1D_LUT, + DRM_COLOROP_3D_LUT, + DRM_COLOROP_1D_CURVE, + DRM_COLOROP_1D_LUT, + }; + static const enum drm_colorop_curve_1d_type curves[] = { + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_INV_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + }; + static const bool bypass[] = { + true, true, true, false, false, true, true, true, + }; + struct dm_test_color_update_fixture f = dm_test_color_update_setup(test); + struct drm_colorop_state *shaper_lut_state; + struct drm_plane_state *plane_state = &f.dm_plane_state->base; + struct drm_property_blob *blob; + int ret; + + f.adev->dm.dc->caps.color.dpp.hw_3d_lut = true; + f.dm_plane_state->base.color_pipeline = + dm_test_colorop_pipeline_setup(test, &f, types, curves, bypass, + ARRAY_SIZE(types)); + shaper_lut_state = f.state->colorops[4].new_state; + blob = kunit_kzalloc(test, sizeof(*blob), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, blob); + blob->length = MAX_COLOR_LUT_ENTRIES * sizeof(struct drm_color_lut32); + blob->data = kunit_kzalloc(test, blob->length, GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, blob->data); + shaper_lut_state->data = blob; + + ret = amdgpu_dm_update_plane_color_mgmt(f.crtc_state, plane_state, + f.dc_plane_state); + KUNIT_EXPECT_EQ(test, ret, 0); + KUNIT_EXPECT_TRUE(test, f.dc_plane_state->cm.flags.bits.shaper_enable); + KUNIT_EXPECT_EQ(test, (int)f.dc_plane_state->cm.shaper_func.type, + (int)TF_TYPE_DISTRIBUTED_POINTS); +} + +/** + * dm_test_update_plane_color_mgmt_colorop_3dlut - enabled 3D LUT succeeds + * @test: KUnit test context + */ +static void dm_test_update_plane_color_mgmt_colorop_3dlut(struct kunit *test) +{ + static const enum drm_colorop_type types[] = { + DRM_COLOROP_1D_CURVE, + DRM_COLOROP_MULTIPLIER, + DRM_COLOROP_CTM_3X4, + DRM_COLOROP_1D_CURVE, + DRM_COLOROP_1D_LUT, + DRM_COLOROP_3D_LUT, + DRM_COLOROP_1D_CURVE, + DRM_COLOROP_1D_LUT, + }; + static const enum drm_colorop_curve_1d_type curves[] = { + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_INV_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + }; + static const bool bypass[] = { + true, true, true, true, true, false, true, true, + }; + struct dm_test_color_update_fixture f = dm_test_color_update_setup(test); + struct drm_colorop_state *lut3d_state; + struct drm_plane_state *plane_state = &f.dm_plane_state->base; + struct drm_property_blob *blob; + int ret; + + f.adev->dm.dc->caps.color.dpp.hw_3d_lut = true; + f.dm_plane_state->base.color_pipeline = + dm_test_colorop_pipeline_setup(test, &f, types, curves, bypass, + ARRAY_SIZE(types)); + lut3d_state = f.state->colorops[5].new_state; + blob = kunit_kzalloc(test, sizeof(*blob), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, blob); + blob->length = 5 * sizeof(struct drm_color_lut32); + blob->data = kunit_kzalloc(test, blob->length, GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, blob->data); + lut3d_state->data = blob; + + ret = amdgpu_dm_update_plane_color_mgmt(f.crtc_state, plane_state, + f.dc_plane_state); + KUNIT_EXPECT_EQ(test, ret, 0); + KUNIT_EXPECT_TRUE(test, f.dc_plane_state->cm.flags.bits.lut3d_enable); + KUNIT_EXPECT_EQ(test, (int)f.dc_plane_state->cm.shaper_func.type, + (int)TF_TYPE_DISTRIBUTED_POINTS); + KUNIT_EXPECT_EQ(test, (int)f.dc_plane_state->cm.shaper_func.tf, + (int)TRANSFER_FUNCTION_LINEAR); +} + +/** + * dm_test_update_plane_color_mgmt_colorop_3dlut_no_data - empty 3D LUT falls back + * @test: KUnit test context + */ +static void dm_test_update_plane_color_mgmt_colorop_3dlut_no_data(struct kunit *test) +{ + static const enum drm_colorop_type types[] = { + DRM_COLOROP_1D_CURVE, + DRM_COLOROP_MULTIPLIER, + DRM_COLOROP_CTM_3X4, + DRM_COLOROP_1D_CURVE, + DRM_COLOROP_1D_LUT, + DRM_COLOROP_3D_LUT, + DRM_COLOROP_1D_CURVE, + DRM_COLOROP_1D_LUT, + }; + static const enum drm_colorop_curve_1d_type curves[] = { + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_INV_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + }; + static const bool bypass[] = { + true, true, true, true, true, false, true, true, + }; + struct dm_test_color_update_fixture f = dm_test_color_update_setup(test); + struct drm_plane_state *plane_state = &f.dm_plane_state->base; + int ret; + + f.adev->dm.dc->caps.color.dpp.hw_3d_lut = true; + f.dm_plane_state->base.color_pipeline = + dm_test_colorop_pipeline_setup(test, &f, types, curves, bypass, + ARRAY_SIZE(types)); + + ret = amdgpu_dm_update_plane_color_mgmt(f.crtc_state, plane_state, + f.dc_plane_state); + KUNIT_EXPECT_EQ(test, ret, 0); + KUNIT_EXPECT_FALSE(test, f.dc_plane_state->cm.flags.bits.lut3d_enable); +} + +/** + * dm_test_update_plane_color_mgmt_colorop_blend - enabled blend TF and LUT succeed + * @test: KUnit test context + */ +static void dm_test_update_plane_color_mgmt_colorop_blend(struct kunit *test) +{ + static const enum drm_colorop_type types[] = { + DRM_COLOROP_1D_CURVE, + DRM_COLOROP_MULTIPLIER, + DRM_COLOROP_CTM_3X4, + DRM_COLOROP_1D_CURVE, + DRM_COLOROP_1D_LUT, + }; + static const enum drm_colorop_curve_1d_type curves[] = { + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + DRM_COLOROP_1D_CURVE_SRGB_EOTF, + }; + static const bool bypass[] = { true, true, true, false, false }; + struct dm_test_color_update_fixture f = dm_test_color_update_setup(test); + struct drm_colorop_state *blend_lut_state; + struct drm_plane_state *plane_state = &f.dm_plane_state->base; + struct drm_property_blob *blob; + int ret; + + f.dm_plane_state->base.color_pipeline = + dm_test_colorop_pipeline_setup(test, &f, types, curves, bypass, + ARRAY_SIZE(types)); + blend_lut_state = f.state->colorops[4].new_state; + blob = kunit_kzalloc(test, sizeof(*blob), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, blob); + blob->length = MAX_COLOR_LUT_ENTRIES * sizeof(struct drm_color_lut32); + blob->data = kunit_kzalloc(test, blob->length, GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, blob->data); + blend_lut_state->data = blob; + + ret = amdgpu_dm_update_plane_color_mgmt(f.crtc_state, plane_state, + f.dc_plane_state); + KUNIT_EXPECT_EQ(test, ret, 0); + KUNIT_EXPECT_TRUE(test, f.dc_plane_state->cm.flags.bits.blend_enable); + KUNIT_EXPECT_EQ(test, (int)f.dc_plane_state->cm.blend_func.type, + (int)TF_TYPE_DISTRIBUTED_POINTS); +} + static struct kunit_case dm_color_test_cases[] = { /* amdgpu_dm_fixpt_from_s3132 */ KUNIT_CASE(dm_test_fixpt_from_s3132_zero), @@ -2819,6 +3021,10 @@ static struct kunit_case dm_color_test_cases[] = { KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_missing_3x4), KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_truncated), KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_no_3dlut_hw), + KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_shaper), + KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_3dlut), + KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_3dlut_no_data), + KUNIT_CASE(dm_test_update_plane_color_mgmt_colorop_blend), {} }; -- 2.53.0
