From: Alex Hung <[email protected]>

[WHAT]
Add KUnit coverage for amdgpu_dm_initialize_default_pipeline()
using an amdgpu_device-backed DRM mock so drm_to_adev() and
the DC color capability checks are exercised.

Assisted-by: Copilot:GPT-5.5
Reviewed-by: Bhawanpreet Lakha <[email protected]>
Signed-off-by: Alex Hung <[email protected]>
Signed-off-by: George Zhang <[email protected]>
---
 .../amd/display/amdgpu_dm/amdgpu_dm_colorop.c |   1 +
 .../amdgpu_dm/tests/amdgpu_dm_colorop_test.c  | 147 ++++++++++++++++--
 2 files changed, 133 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_colorop.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_colorop.c
index d3ae9b58024b..0301cb333770 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_colorop.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_colorop.c
@@ -224,3 +224,4 @@ int amdgpu_dm_initialize_default_pipeline(struct drm_plane 
*plane, struct drm_pr
 
        return amdgpu_dm_build_default_pipeline(dev, plane, hw_3d_lut, list);
 }
+EXPORT_IF_KUNIT(amdgpu_dm_initialize_default_pipeline);
diff --git 
a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_colorop_test.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_colorop_test.c
index fa270ff28c6a..b28a165b213e 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_colorop_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_colorop_test.c
@@ -9,6 +9,8 @@
 #include <drm/drm_colorop.h>
 #include <drm/drm_kunit_helpers.h>
 
+#include "dc.h"
+#include "amdgpu.h"
 #include "amdgpu_dm_colorop.h"
 
 /* Tests for amdgpu_dm_supported_degam_tfs */
@@ -133,6 +135,30 @@ static void kunit_colorop_pipeline_destroy(void *drm)
        drm_colorop_pipeline_destroy((struct drm_device *)drm);
 }
 
+static void dm_expect_colorop_pipeline(struct kunit *test, struct drm_device 
*drm,
+                                      const struct drm_prop_enum_list *list,
+                                      const enum drm_colorop_type *expected,
+                                      int expected_count)
+{
+       struct drm_colorop *op, *first = NULL;
+       int i = 0;
+
+       drm_for_each_colorop(op, drm) {
+               if (op->base.id == (uint32_t)list->type) {
+                       first = op;
+                       break;
+               }
+       }
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, first);
+
+       for (op = first; op; op = op->next, i++) {
+               KUNIT_ASSERT_LT(test, i, expected_count);
+               KUNIT_EXPECT_EQ(test, op->type, expected[i]);
+               KUNIT_EXPECT_NOT_NULL(test, op->bypass_property);
+       }
+       KUNIT_EXPECT_EQ(test, i, expected_count);
+}
+
 /**
  * dm_test_initialize_default_pipeline() - Verify 
amdgpu_dm_build_default_pipeline()
  *   produces the expected colorop chain with all ops bypassable.
@@ -154,8 +180,6 @@ static void dm_test_initialize_default_pipeline(struct 
kunit *test)
        struct drm_device *drm;
        struct drm_plane *plane;
        struct drm_prop_enum_list list = {};
-       struct drm_colorop *op, *first = NULL;
-       int i = 0;
        int ret;
 
        dev = drm_kunit_helper_alloc_device(test);
@@ -185,20 +209,110 @@ static void dm_test_initialize_default_pipeline(struct 
kunit *test)
        KUNIT_ASSERT_EQ(test, ret, 0);
        kfree(list.name);
 
-       drm_for_each_colorop(op, drm) {
-               if (op->base.id == (uint32_t)list.type) {
-                       first = op;
-                       break;
-               }
-       }
-       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, first);
+       dm_expect_colorop_pipeline(test, drm, &list, expected, 
ARRAY_SIZE(expected));
+}
 
-       for (op = first; op; op = op->next, i++) {
-               KUNIT_ASSERT_LT(test, i, (int)ARRAY_SIZE(expected));
-               KUNIT_EXPECT_EQ(test, op->type, expected[i]);
-               KUNIT_EXPECT_NOT_NULL(test, op->bypass_property);
-       }
-       KUNIT_EXPECT_EQ(test, i, (int)ARRAY_SIZE(expected));
+static void dm_test_initialize_default_pipeline_caps(struct kunit *test,
+                                            bool dpp_hw_3d_lut,
+                                            bool mpc_preblend,
+                                            const enum drm_colorop_type 
*expected,
+                                            int expected_count)
+{
+       struct drm_prop_enum_list list = {};
+       struct amdgpu_device *adev;
+       struct drm_device *drm;
+       struct drm_plane *plane;
+       struct device *dev;
+       struct dc *dc;
+       int ret;
+
+       dev = drm_kunit_helper_alloc_device(test);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
+
+       drm = __drm_kunit_helper_alloc_drm_device(test, dev,
+                                                  sizeof(*adev),
+                                                  offsetof(struct 
amdgpu_device, ddev),
+                                                  DRIVER_MODESET);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm);
+       adev = drm_to_adev(drm);
+
+       dc = kunit_kzalloc(test, sizeof(*dc), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dc);
+       adev->dm.dc = dc;
+       adev->dm.dc->caps.color.dpp.hw_3d_lut = dpp_hw_3d_lut;
+       adev->dm.dc->caps.color.mpc.preblend = mpc_preblend;
+
+       plane = drm_kunit_helper_create_primary_plane(test, drm,
+                                                      NULL, NULL, NULL, 0, 
NULL);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane);
+
+       kunit_add_action(test, kunit_colorop_pipeline_destroy, drm);
+
+       ret = amdgpu_dm_initialize_default_pipeline(plane, &list);
+       KUNIT_ASSERT_EQ(test, ret, 0);
+       kfree(list.name);
+
+       dm_expect_colorop_pipeline(test, drm, &list, expected, expected_count);
+}
+
+/**
+ * dm_test_initialize_default_pipeline_dpp_3d_lut() - Test DPP 3D LUT cap.
+ * @test: KUnit test context.
+ */
+static void dm_test_initialize_default_pipeline_dpp_3d_lut(struct kunit *test)
+{
+       static const enum drm_colorop_type expected[] = {
+               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,
+       };
+
+       dm_test_initialize_default_pipeline_caps(test, true, false,
+                                                expected, 
ARRAY_SIZE(expected));
+}
+
+/**
+ * dm_test_initialize_default_pipeline_mpc_preblend() - Test MPC preblend cap.
+ * @test: KUnit test context.
+ */
+static void dm_test_initialize_default_pipeline_mpc_preblend(struct kunit 
*test)
+{
+       static const enum drm_colorop_type expected[] = {
+               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,
+       };
+
+       dm_test_initialize_default_pipeline_caps(test, false, true,
+                                                expected, 
ARRAY_SIZE(expected));
+}
+
+/**
+ * dm_test_initialize_default_pipeline_no_3d_lut() - Test no 3D LUT caps.
+ * @test: KUnit test context.
+ */
+static void dm_test_initialize_default_pipeline_no_3d_lut(struct kunit *test)
+{
+       static const enum drm_colorop_type expected[] = {
+               DRM_COLOROP_1D_CURVE,
+               DRM_COLOROP_MULTIPLIER,
+               DRM_COLOROP_CTM_3X4,
+               DRM_COLOROP_1D_CURVE,
+               DRM_COLOROP_1D_LUT,
+       };
+
+       dm_test_initialize_default_pipeline_caps(test, false, false,
+                                                expected, 
ARRAY_SIZE(expected));
 }
 
 static struct kunit_case dm_colorop_test_cases[] = {
@@ -224,6 +338,9 @@ static struct kunit_case dm_colorop_test_cases[] = {
        KUNIT_CASE(dm_test_degam_and_blnd_tfs_match),
        /* amdgpu_dm_initialize_default_pipeline */
        KUNIT_CASE(dm_test_initialize_default_pipeline),
+       KUNIT_CASE(dm_test_initialize_default_pipeline_dpp_3d_lut),
+       KUNIT_CASE(dm_test_initialize_default_pipeline_mpc_preblend),
+       KUNIT_CASE(dm_test_initialize_default_pipeline_no_3d_lut),
        {}
 };
 
-- 
2.53.0

Reply via email to