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

Reply via email to