From: Alex Hung <[email protected]>

[WHAT]
Add KUnit tests for amdgpu_dm_plane_helper_check_state() covering the
small viewport width, small viewport height, bottom-edge clipping and
scaling-caps rejection paths.

Assisted-by: Copilot:Claude-Opus-4.8 GPT-5.5
Reviewed-by: Bhawanpreet Lakha <[email protected]>
Signed-off-by: Alex Hung <[email protected]>
Signed-off-by: George Zhang <[email protected]>
---
 .../amdgpu_dm/tests/amdgpu_dm_plane_test.c    | 188 ++++++++++++++++++
 1 file changed, 188 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_plane_test.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_plane_test.c
index e1841a30fc32..f36c5c139554 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_plane_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_plane_test.c
@@ -2382,6 +2382,190 @@ static void 
dm_test_get_min_max_dc_plane_scaling_fp16(struct kunit *test)
        KUNIT_EXPECT_EQ(test, max_upscale, 2000);
 }
 
+/**
+ * dm_test_helper_check_state_small_viewport_width() - Verify width rejection.
+ * @test: KUnit test context.
+ *
+ * Verify if a viewport width below the minimum pipe-split width is rejected.
+ */
+static void dm_test_helper_check_state_small_viewport_width(struct kunit *test)
+{
+       struct drm_plane *plane;
+       struct drm_plane_state *state;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *new_crtc_state;
+       struct drm_framebuffer *fb;
+
+       plane = kunit_kzalloc(test, sizeof(*plane), GFP_KERNEL);
+       state = kunit_kzalloc(test, sizeof(*state), GFP_KERNEL);
+       crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL);
+       new_crtc_state = kunit_kzalloc(test, sizeof(*new_crtc_state), 
GFP_KERNEL);
+       fb = kunit_kzalloc(test, sizeof(*fb), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, plane);
+       KUNIT_ASSERT_NOT_NULL(test, state);
+       KUNIT_ASSERT_NOT_NULL(test, crtc);
+       KUNIT_ASSERT_NOT_NULL(test, new_crtc_state);
+       KUNIT_ASSERT_NOT_NULL(test, fb);
+
+       plane->type = DRM_PLANE_TYPE_OVERLAY;
+       state->plane = plane;
+       state->fb = fb;
+       state->crtc = crtc;
+       state->crtc_x = 0;
+       state->crtc_y = 0;
+       state->crtc_w = 10;
+       state->crtc_h = 100;
+       new_crtc_state->mode.crtc_hdisplay = 1920;
+       new_crtc_state->mode.crtc_vdisplay = 1080;
+
+       KUNIT_EXPECT_EQ(test,
+                       amdgpu_dm_plane_helper_check_state(state, 
new_crtc_state),
+                       -EINVAL);
+}
+
+/**
+ * dm_test_helper_check_state_small_viewport_height() - Verify height 
rejection.
+ * @test: KUnit test context.
+ *
+ * Verify if a negative-offset viewport with a too-small height is rejected.
+ */
+static void dm_test_helper_check_state_small_viewport_height(struct kunit 
*test)
+{
+       struct drm_plane *plane;
+       struct drm_plane_state *state;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *new_crtc_state;
+       struct drm_framebuffer *fb;
+
+       plane = kunit_kzalloc(test, sizeof(*plane), GFP_KERNEL);
+       state = kunit_kzalloc(test, sizeof(*state), GFP_KERNEL);
+       crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL);
+       new_crtc_state = kunit_kzalloc(test, sizeof(*new_crtc_state), 
GFP_KERNEL);
+       fb = kunit_kzalloc(test, sizeof(*fb), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, plane);
+       KUNIT_ASSERT_NOT_NULL(test, state);
+       KUNIT_ASSERT_NOT_NULL(test, crtc);
+       KUNIT_ASSERT_NOT_NULL(test, new_crtc_state);
+       KUNIT_ASSERT_NOT_NULL(test, fb);
+
+       plane->type = DRM_PLANE_TYPE_OVERLAY;
+       state->plane = plane;
+       state->fb = fb;
+       state->crtc = crtc;
+       state->crtc_x = -2;
+       state->crtc_y = -95;
+       state->crtc_w = 100;
+       state->crtc_h = 100;
+       new_crtc_state->mode.crtc_hdisplay = 1920;
+       new_crtc_state->mode.crtc_vdisplay = 1080;
+
+       KUNIT_EXPECT_EQ(test,
+                       amdgpu_dm_plane_helper_check_state(state, 
new_crtc_state),
+                       -EINVAL);
+}
+
+/**
+ * dm_test_helper_check_state_bottom_clipped_height() - Verify bottom clipping.
+ * @test: KUnit test context.
+ *
+ * Verify if a viewport clipped by the bottom edge to below the minimum height
+ * is rejected.
+ */
+static void dm_test_helper_check_state_bottom_clipped_height(struct kunit 
*test)
+{
+       struct drm_plane *plane;
+       struct drm_plane_state *state;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *new_crtc_state;
+       struct drm_framebuffer *fb;
+
+       plane = kunit_kzalloc(test, sizeof(*plane), GFP_KERNEL);
+       state = kunit_kzalloc(test, sizeof(*state), GFP_KERNEL);
+       crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL);
+       new_crtc_state = kunit_kzalloc(test, sizeof(*new_crtc_state), 
GFP_KERNEL);
+       fb = kunit_kzalloc(test, sizeof(*fb), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, plane);
+       KUNIT_ASSERT_NOT_NULL(test, state);
+       KUNIT_ASSERT_NOT_NULL(test, crtc);
+       KUNIT_ASSERT_NOT_NULL(test, new_crtc_state);
+       KUNIT_ASSERT_NOT_NULL(test, fb);
+
+       plane->type = DRM_PLANE_TYPE_OVERLAY;
+       state->plane = plane;
+       state->fb = fb;
+       state->crtc = crtc;
+       state->crtc_x = 0;
+       state->crtc_y = 95;
+       state->crtc_w = 100;
+       state->crtc_h = 100;
+       new_crtc_state->mode.crtc_hdisplay = 1920;
+       new_crtc_state->mode.crtc_vdisplay = 100;
+
+       KUNIT_EXPECT_EQ(test,
+                       amdgpu_dm_plane_helper_check_state(state, 
new_crtc_state),
+                       -EINVAL);
+}
+
+/**
+ * dm_test_helper_check_state_scaling_caps() - Verify DC scaling caps are 
applied.
+ * @test: KUnit test context.
+ *
+ * Verify if helper_check_state converts DC plane scaling caps to DRM scale
+ * limits and rejects scaling outside those limits.
+ */
+static void dm_test_helper_check_state_scaling_caps(struct kunit *test)
+{
+       struct amdgpu_device *adev;
+       struct dc *dc;
+       struct drm_plane *plane;
+       struct drm_plane_state *state;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *new_crtc_state;
+       struct drm_framebuffer *fb;
+
+       adev = kunit_kzalloc(test, sizeof(*adev), GFP_KERNEL);
+       dc = kunit_kzalloc(test, sizeof(*dc), GFP_KERNEL);
+       plane = kunit_kzalloc(test, sizeof(*plane), GFP_KERNEL);
+       state = kunit_kzalloc(test, sizeof(*state), GFP_KERNEL);
+       crtc = kunit_kzalloc(test, sizeof(*crtc), GFP_KERNEL);
+       new_crtc_state = kunit_kzalloc(test, sizeof(*new_crtc_state), 
GFP_KERNEL);
+       fb = kunit_kzalloc(test, sizeof(*fb), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, adev);
+       KUNIT_ASSERT_NOT_NULL(test, dc);
+       KUNIT_ASSERT_NOT_NULL(test, plane);
+       KUNIT_ASSERT_NOT_NULL(test, state);
+       KUNIT_ASSERT_NOT_NULL(test, crtc);
+       KUNIT_ASSERT_NOT_NULL(test, new_crtc_state);
+       KUNIT_ASSERT_NOT_NULL(test, fb);
+
+       adev->dm.dc = dc;
+       dc->caps.planes[0].max_upscale_factor.argb8888 = 1;
+       dc->caps.planes[0].max_downscale_factor.argb8888 = 1;
+
+       plane->type = DRM_PLANE_TYPE_OVERLAY;
+       plane->dev = &adev->ddev;
+       crtc->dev = &adev->ddev;
+       fb->width = 100;
+       fb->height = 100;
+       fb->format = drm_format_info(DRM_FORMAT_XRGB8888);
+       KUNIT_ASSERT_NOT_NULL(test, fb->format);
+
+       state->plane = plane;
+       state->fb = fb;
+       state->crtc = crtc;
+       state->src_w = 100 << 16;
+       state->src_h = 100 << 16;
+       state->crtc_w = 200;
+       state->crtc_h = 200;
+       new_crtc_state->crtc = crtc;
+       new_crtc_state->mode.crtc_hdisplay = 1920;
+       new_crtc_state->mode.crtc_vdisplay = 1080;
+
+       KUNIT_EXPECT_EQ(test,
+                       amdgpu_dm_plane_helper_check_state(state, 
new_crtc_state),
+                       -ERANGE);
+}
+
 /**
  * dm_test_fill_dc_scaling_info_nv12_dcn1x() - Verify NV12 DCN1x rejection.
  * @test: KUnit test context.
@@ -2602,6 +2786,10 @@ static struct kunit_case amdgpu_dm_plane_test_cases[] = {
        KUNIT_CASE(dm_test_fill_gfx9_plane_attributes_dcc_gfx9_unconstrained),
        /* amdgpu_dm_plane_helper_check_state() */
        KUNIT_CASE(dm_test_helper_check_state_viewport_reject),
+       KUNIT_CASE(dm_test_helper_check_state_small_viewport_width),
+       KUNIT_CASE(dm_test_helper_check_state_small_viewport_height),
+       KUNIT_CASE(dm_test_helper_check_state_bottom_clipped_height),
+       KUNIT_CASE(dm_test_helper_check_state_scaling_caps),
        /* amdgpu_dm_plane_add_modifier() */
        KUNIT_CASE(dm_test_add_modifier_appends_value),
        KUNIT_CASE(dm_test_add_modifier_grows_capacity),
-- 
2.55.0

Reply via email to