From: Bhawanpreet Lakha <[email protected]> Add KUnit coverage for amdgpu_dm_fbc_init() on the amdgpu_dm_connector tests:
- No FBC present - Non-eDP link - Buffer already allocated Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <[email protected]> Signed-off-by: Bhawanpreet Lakha <[email protected]> Signed-off-by: George Zhang <[email protected]> --- .../display/amdgpu_dm/amdgpu_dm_connector.c | 3 +- .../display/amdgpu_dm/amdgpu_dm_connector.h | 1 + .../tests/amdgpu_dm_connector_test.c | 112 ++++++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c index 4ae58d5c5264..e018cf639909 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c @@ -255,7 +255,7 @@ EXPORT_IF_KUNIT(update_subconnector_property); static int amdgpu_dm_connector_get_modes(struct drm_connector *connector); -static void amdgpu_dm_fbc_init(struct drm_connector *connector) +STATIC_IFN_KUNIT void amdgpu_dm_fbc_init(struct drm_connector *connector) { struct amdgpu_device *adev = drm_to_adev(connector->dev); struct dm_compressor_info *compressor = &adev->dm.compressor; @@ -293,6 +293,7 @@ static void amdgpu_dm_fbc_init(struct drm_connector *connector) } } +EXPORT_IF_KUNIT(amdgpu_dm_fbc_init); int amdgpu_dm_detect_mst_link_for_all_connectors(struct drm_device *dev) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h index 10fe0bf48c02..707308c02820 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.h @@ -148,6 +148,7 @@ int amdgpu_dm_encoder_init(struct drm_device *dev, #if IS_ENABLED(CONFIG_DRM_AMD_DC_KUNIT_TEST) enum drm_mode_subconnector get_subconnector_type(struct dc_link *link); void update_subconnector_property(struct amdgpu_dm_connector *aconnector); +void amdgpu_dm_fbc_init(struct drm_connector *connector); enum display_content_type get_output_content_type(const struct drm_connector_state *connector_state); bool adjust_colour_depth_from_display_info(struct dc_crtc_timing *timing_out, diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c index 782a22e4f074..aa274f5e4b84 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c @@ -2665,6 +2665,113 @@ static void dm_test_update_subconnector_non_dp_noop(struct kunit *test) KUNIT_EXPECT_EQ(test, (int)val, (int)DRM_MODE_SUBCONNECTOR_VGA); } +/* Tests for amdgpu_dm_fbc_init() */ + +/* + * Build an amdgpu_dm_connector wired to a kunit-allocated amdgpu_device so + * that drm_to_adev() and to_amdgpu_dm_connector() resolve correctly, with a + * dc, dc_link and an empty modes list ready for amdgpu_dm_fbc_init(). + */ +struct dm_test_fbc_ctx { + struct amdgpu_device *adev; + struct amdgpu_dm_connector *aconnector; + struct dc *dc; + struct dc_link *link; +}; + +static struct dm_test_fbc_ctx *dm_test_fbc_ctx_alloc(struct kunit *test) +{ + struct dm_test_fbc_ctx *ctx; + + ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, ctx); + + ctx->adev = kunit_kzalloc(test, sizeof(*ctx->adev), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, ctx->adev); + ctx->aconnector = kunit_kzalloc(test, sizeof(*ctx->aconnector), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, ctx->aconnector); + ctx->dc = kunit_kzalloc(test, sizeof(*ctx->dc), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, ctx->dc); + ctx->link = kunit_kzalloc(test, sizeof(*ctx->link), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, ctx->link); + + ctx->aconnector->base.dev = &ctx->adev->ddev; + INIT_LIST_HEAD(&ctx->aconnector->base.modes); + ctx->adev->dm.dc = ctx->dc; + ctx->aconnector->dc_link = ctx->link; + + /* Default to the fully-enabled path so each test only flips one knob */ + ctx->link->connector_signal = SIGNAL_TYPE_EDP; + ctx->dc->fbc_compressor = + (struct compressor *)kunit_kzalloc(test, sizeof(void *), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, ctx->dc->fbc_compressor); + + return ctx; +} + +/** + * dm_test_fbc_init_no_compressor - Test fbc_init is a no-op without a compressor + * @test: The KUnit test context + */ +static void dm_test_fbc_init_no_compressor(struct kunit *test) +{ + struct dm_test_fbc_ctx *ctx = dm_test_fbc_ctx_alloc(test); + + ctx->dc->fbc_compressor = NULL; + + amdgpu_dm_fbc_init(&ctx->aconnector->base); + + KUNIT_EXPECT_NULL(test, ctx->adev->dm.compressor.bo_ptr); +} + +/** + * dm_test_fbc_init_non_edp - Test fbc_init is a no-op for non-eDP links + * @test: The KUnit test context + */ +static void dm_test_fbc_init_non_edp(struct kunit *test) +{ + struct dm_test_fbc_ctx *ctx = dm_test_fbc_ctx_alloc(test); + + ctx->link->connector_signal = SIGNAL_TYPE_DISPLAY_PORT; + + amdgpu_dm_fbc_init(&ctx->aconnector->base); + + KUNIT_EXPECT_NULL(test, ctx->adev->dm.compressor.bo_ptr); +} + +/** + * dm_test_fbc_init_already_allocated - Test fbc_init keeps an existing buffer + * @test: The KUnit test context + */ +static void dm_test_fbc_init_already_allocated(struct kunit *test) +{ + struct dm_test_fbc_ctx *ctx = dm_test_fbc_ctx_alloc(test); + struct amdgpu_bo *existing; + + existing = kunit_kzalloc(test, sizeof(void *), GFP_KERNEL); + KUNIT_ASSERT_NOT_NULL(test, existing); + ctx->adev->dm.compressor.bo_ptr = existing; + + amdgpu_dm_fbc_init(&ctx->aconnector->base); + + /* Buffer already present → left untouched, no reallocation */ + KUNIT_EXPECT_PTR_EQ(test, ctx->adev->dm.compressor.bo_ptr, existing); +} + +/** + * dm_test_fbc_init_no_modes - Test fbc_init skips allocation with no modes + * @test: The KUnit test context + */ +static void dm_test_fbc_init_no_modes(struct kunit *test) +{ + struct dm_test_fbc_ctx *ctx = dm_test_fbc_ctx_alloc(test); + + /* All prerequisites met but the modes list is empty → max_size 0 */ + amdgpu_dm_fbc_init(&ctx->aconnector->base); + + KUNIT_EXPECT_NULL(test, ctx->adev->dm.compressor.bo_ptr); +} + static struct kunit_case amdgpu_dm_connector_tests[] = { /* get_subconnector_type */ KUNIT_CASE(dm_test_subconnector_type_none), @@ -2822,6 +2929,11 @@ static struct kunit_case amdgpu_dm_connector_tests[] = { KUNIT_CASE(dm_test_set_panel_type_did_lcd), KUNIT_CASE(dm_test_set_panel_type_vendor_lum_heuristic), KUNIT_CASE(dm_test_set_panel_type_defaults_to_lcd), + /* amdgpu_dm_fbc_init */ + KUNIT_CASE(dm_test_fbc_init_no_compressor), + KUNIT_CASE(dm_test_fbc_init_non_edp), + KUNIT_CASE(dm_test_fbc_init_already_allocated), + KUNIT_CASE(dm_test_fbc_init_no_modes), {} }; -- 2.55.0
