From: Alex Hung <[email protected]>

[WHAT]
Add nine KUnit tests for dm_check_cursor_fb() with a cursor framebuffer
fixture, covering the supported linear case, size, cropping and pitch
rejections, tiling handling across ASIC generations, and modifier-based
tiling skips.

Assisted-by: Copilot:GPT-5.6-Sol
Reviewed-by: Bhawanpreet Lakha <[email protected]>
Signed-off-by: Alex Hung <[email protected]>
Signed-off-by: Tom Chung <[email protected]>
---
 .../amd/display/amdgpu_dm/amdgpu_dm_cursor.c  |   7 +-
 .../amd/display/amdgpu_dm/amdgpu_dm_cursor.h  |   3 +
 .../amdgpu_dm/tests/amdgpu_dm_cursor_test.c   | 196 ++++++++++++++++++
 3 files changed, 203 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_cursor.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_cursor.c
index ab50d58896ab..953ad34918af 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_cursor.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_cursor.c
@@ -41,9 +41,9 @@
 #include "amdgpu_dm_cursor.h"
 #include "dm_helpers.h"
 
-static int dm_check_cursor_fb(struct amdgpu_crtc *new_acrtc,
-                             struct drm_plane_state *new_plane_state,
-                             struct drm_framebuffer *fb)
+STATIC_IFN_KUNIT int dm_check_cursor_fb(struct amdgpu_crtc *new_acrtc,
+                                      struct drm_plane_state *new_plane_state,
+                                      struct drm_framebuffer *fb)
 {
        struct amdgpu_device *adev = drm_to_adev(new_acrtc->base.dev);
        struct amdgpu_framebuffer *afb = to_amdgpu_framebuffer(fb);
@@ -109,6 +109,7 @@ static int dm_check_cursor_fb(struct amdgpu_crtc *new_acrtc,
 
        return 0;
 }
+EXPORT_IF_KUNIT(dm_check_cursor_fb);
 
 /*
  * Helper function for checking the cursor in native mode
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_cursor.h 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_cursor.h
index 5f619e4474aa..8879888745eb 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_cursor.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_cursor.h
@@ -43,6 +43,9 @@ int amdgpu_dm_crtc_get_cursor_mode(struct amdgpu_device *adev,
                                   enum amdgpu_dm_cursor_mode *cursor_mode);
 
 #if IS_ENABLED(CONFIG_DRM_AMD_DC_KUNIT_TEST)
+int dm_check_cursor_fb(struct amdgpu_crtc *new_acrtc,
+                      struct drm_plane_state *new_plane_state,
+                      struct drm_framebuffer *fb);
 void dm_get_oriented_plane_size(struct drm_plane_state *plane_state,
                                int *src_w, int *src_h);
 void dm_get_plane_scale(struct drm_plane_state *plane_state,
diff --git 
a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_cursor_test.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_cursor_test.c
index 3da76794ece9..f2ac94805777 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_cursor_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_cursor_test.c
@@ -9,6 +9,8 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_blend.h>
 #include <drm/drm_crtc.h>
+#include <drm/drm_fourcc.h>
+#include <drm/drm_framebuffer.h>
 #include <drm/drm_plane.h>
 
 #include "dc.h"
@@ -16,6 +18,190 @@
 #include "amdgpu_mode.h"
 #include "amdgpu_dm.h"
 #include "amdgpu_dm_cursor.h"
+#include "amdgpu_dm_kunit_test_helpers.h"
+
+struct dm_cursor_fb_fixture {
+       struct amdgpu_device *adev;
+       struct amdgpu_crtc *acrtc;
+       struct amdgpu_framebuffer *afb;
+       struct drm_plane_state *plane_state;
+};
+
+static struct dm_cursor_fb_fixture dm_test_alloc_cursor_fb_fixture(struct 
kunit *test)
+{
+       struct dm_cursor_fb_fixture fixture = { 0 };
+
+       fixture.adev = dm_kunit_alloc_adev(test);
+       fixture.acrtc = kunit_kzalloc(test, sizeof(*fixture.acrtc), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, fixture.acrtc);
+       fixture.afb = kunit_kzalloc(test, sizeof(*fixture.afb), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, fixture.afb);
+       fixture.plane_state = kunit_kzalloc(test, sizeof(*fixture.plane_state), 
GFP_KERNEL);
+       KUNIT_ASSERT_NOT_NULL(test, fixture.plane_state);
+
+       fixture.acrtc->base.dev = &fixture.adev->ddev;
+       fixture.acrtc->max_cursor_width = 256;
+       fixture.acrtc->max_cursor_height = 256;
+       fixture.afb->base.width = 64;
+       fixture.afb->base.height = 64;
+       fixture.afb->base.pitches[0] = 64 * 4;
+       fixture.afb->base.format = drm_format_info(DRM_FORMAT_ARGB8888);
+       fixture.plane_state->fb = &fixture.afb->base;
+       fixture.plane_state->src_w = 64 << 16;
+       fixture.plane_state->src_h = 64 << 16;
+
+       return fixture;
+}
+
+/* Tests for dm_check_cursor_fb() */
+
+/**
+ * dm_test_check_cursor_fb_valid_linear - Test a supported linear cursor 
framebuffer
+ * @test: The KUnit test context
+ */
+static void dm_test_check_cursor_fb_valid_linear(struct kunit *test)
+{
+       struct dm_cursor_fb_fixture fixture = 
dm_test_alloc_cursor_fb_fixture(test);
+
+       fixture.adev->family = AMDGPU_FAMILY_AI;
+
+       KUNIT_EXPECT_EQ(test,
+                       dm_check_cursor_fb(fixture.acrtc, fixture.plane_state, 
&fixture.afb->base),
+                       0);
+}
+
+/**
+ * dm_test_check_cursor_fb_rejects_size - Test an oversized cursor framebuffer
+ * @test: The KUnit test context
+ */
+static void dm_test_check_cursor_fb_rejects_size(struct kunit *test)
+{
+       struct dm_cursor_fb_fixture fixture = 
dm_test_alloc_cursor_fb_fixture(test);
+
+       fixture.afb->base.width = fixture.acrtc->max_cursor_width + 1;
+
+       KUNIT_EXPECT_EQ(test,
+                       dm_check_cursor_fb(fixture.acrtc, fixture.plane_state, 
&fixture.afb->base),
+                       -EINVAL);
+}
+
+/**
+ * dm_test_check_cursor_fb_rejects_cropping - Test cursor framebuffer cropping 
rejection
+ * @test: The KUnit test context
+ */
+static void dm_test_check_cursor_fb_rejects_cropping(struct kunit *test)
+{
+       struct dm_cursor_fb_fixture fixture = 
dm_test_alloc_cursor_fb_fixture(test);
+
+       fixture.plane_state->src_w = 32 << 16;
+
+       KUNIT_EXPECT_EQ(test,
+                       dm_check_cursor_fb(fixture.acrtc, fixture.plane_state, 
&fixture.afb->base),
+                       -EINVAL);
+}
+
+/**
+ * dm_test_check_cursor_fb_rejects_pitch - Test unsupported cursor framebuffer 
pitch
+ * @test: The KUnit test context
+ */
+static void dm_test_check_cursor_fb_rejects_pitch(struct kunit *test)
+{
+       struct dm_cursor_fb_fixture fixture = 
dm_test_alloc_cursor_fb_fixture(test);
+
+       fixture.afb->base.pitches[0] = 96 * 4;
+
+       KUNIT_EXPECT_EQ(test,
+                       dm_check_cursor_fb(fixture.acrtc, fixture.plane_state, 
&fixture.afb->base),
+                       -EINVAL);
+}
+
+/**
+ * dm_test_check_cursor_fb_rejects_unsupported_pitch - Test matching 
unsupported pitch
+ * @test: The KUnit test context
+ */
+static void dm_test_check_cursor_fb_rejects_unsupported_pitch(struct kunit 
*test)
+{
+       struct dm_cursor_fb_fixture fixture = 
dm_test_alloc_cursor_fb_fixture(test);
+
+       fixture.afb->base.width = 32;
+       fixture.afb->base.pitches[0] = 32 * 4;
+       fixture.plane_state->src_w = 32 << 16;
+
+       KUNIT_EXPECT_EQ(test,
+                       dm_check_cursor_fb(fixture.acrtc, fixture.plane_state, 
&fixture.afb->base),
+                       -EINVAL);
+}
+
+/**
+ * dm_test_check_cursor_fb_rejects_tiling - Test tiled cursor framebuffer 
rejection
+ * @test: The KUnit test context
+ */
+static void dm_test_check_cursor_fb_rejects_tiling(struct kunit *test)
+{
+       struct dm_cursor_fb_fixture fixture = 
dm_test_alloc_cursor_fb_fixture(test);
+
+       fixture.adev->family = AMDGPU_FAMILY_AI;
+       fixture.afb->tiling_flags = AMDGPU_TILING_SET(SWIZZLE_MODE, 1);
+
+       KUNIT_EXPECT_EQ(test,
+                       dm_check_cursor_fb(fixture.acrtc, fixture.plane_state, 
&fixture.afb->base),
+                       -EINVAL);
+}
+
+/**
+ * dm_test_check_cursor_fb_gfx12_tiling - Test GFX12 cursor tiling decoding
+ * @test: The KUnit test context
+ */
+static void dm_test_check_cursor_fb_gfx12_tiling(struct kunit *test)
+{
+       struct dm_cursor_fb_fixture fixture = 
dm_test_alloc_cursor_fb_fixture(test);
+
+       fixture.adev->family = AMDGPU_FAMILY_GC_12_0_0;
+       KUNIT_EXPECT_EQ(test,
+                       dm_check_cursor_fb(fixture.acrtc, fixture.plane_state, 
&fixture.afb->base),
+                       0);
+
+       fixture.afb->tiling_flags = AMDGPU_TILING_SET(GFX12_SWIZZLE_MODE, 1);
+       KUNIT_EXPECT_EQ(test,
+                       dm_check_cursor_fb(fixture.acrtc, fixture.plane_state, 
&fixture.afb->base),
+                       -EINVAL);
+}
+
+/**
+ * dm_test_check_cursor_fb_pre_ai_tiling - Test legacy cursor tiling decoding
+ * @test: The KUnit test context
+ */
+static void dm_test_check_cursor_fb_pre_ai_tiling(struct kunit *test)
+{
+       struct dm_cursor_fb_fixture fixture = 
dm_test_alloc_cursor_fb_fixture(test);
+
+       fixture.adev->family = AMDGPU_FAMILY_CZ;
+       KUNIT_EXPECT_EQ(test,
+                       dm_check_cursor_fb(fixture.acrtc, fixture.plane_state, 
&fixture.afb->base),
+                       0);
+
+       fixture.afb->tiling_flags = AMDGPU_TILING_SET(ARRAY_MODE, 
DC_ARRAY_1D_TILED_THIN1);
+       KUNIT_EXPECT_EQ(test,
+                       dm_check_cursor_fb(fixture.acrtc, fixture.plane_state, 
&fixture.afb->base),
+                       -EINVAL);
+}
+
+/**
+ * dm_test_check_cursor_fb_modifier_skips_tiling - Test modifier validation 
stays in DRM core
+ * @test: The KUnit test context
+ */
+static void dm_test_check_cursor_fb_modifier_skips_tiling(struct kunit *test)
+{
+       struct dm_cursor_fb_fixture fixture = 
dm_test_alloc_cursor_fb_fixture(test);
+
+       fixture.adev->family = AMDGPU_FAMILY_AI;
+       fixture.afb->base.flags = DRM_MODE_FB_MODIFIERS;
+       fixture.afb->tiling_flags = AMDGPU_TILING_SET(SWIZZLE_MODE, 1);
+
+       KUNIT_EXPECT_EQ(test,
+                       dm_check_cursor_fb(fixture.acrtc, fixture.plane_state, 
&fixture.afb->base),
+                       0);
+}
 
 /* Tests for amdgpu_dm_should_update_native_cursor() */
 
@@ -240,6 +426,16 @@ static void dm_test_get_plane_scale_zero_src_width(struct 
kunit *test)
 }
 
 static struct kunit_case amdgpu_dm_cursor_tests[] = {
+       /* dm_check_cursor_fb */
+       KUNIT_CASE(dm_test_check_cursor_fb_valid_linear),
+       KUNIT_CASE(dm_test_check_cursor_fb_rejects_size),
+       KUNIT_CASE(dm_test_check_cursor_fb_rejects_cropping),
+       KUNIT_CASE(dm_test_check_cursor_fb_rejects_pitch),
+       KUNIT_CASE(dm_test_check_cursor_fb_rejects_unsupported_pitch),
+       KUNIT_CASE(dm_test_check_cursor_fb_rejects_tiling),
+       KUNIT_CASE(dm_test_check_cursor_fb_gfx12_tiling),
+       KUNIT_CASE(dm_test_check_cursor_fb_pre_ai_tiling),
+       KUNIT_CASE(dm_test_check_cursor_fb_modifier_skips_tiling),
        /* amdgpu_dm_should_update_native_cursor */
        KUNIT_CASE(dm_test_should_update_native_cursor_without_crtc),
        KUNIT_CASE(dm_test_should_update_native_cursor_disable_native),
-- 
2.43.0

Reply via email to