drm/amd/display: Extract shared KUnit test helpers

Extract common allocation and setup patterns from KUnit test
files into a dedicated helpers module to reduce duplication.

Add tests/amdgpu_dm_kunit_helpers.c with shared helpers:
- dm_kunit_alloc_adev: allocate amdgpu_device via DRM mock
- dm_kunit_alloc_link: allocate zeroed dc_link
- dm_kunit_alloc_link_with_ctx: allocate dc_link with dc_context
- dm_kunit_alloc_dm: allocate display_manager with DC state
- dm_kunit_alloc_stream: allocate dc_stream_state with link
- dm_kunit_add_stream_to_state: wire stream into dc_state
- dm_kunit_alloc_connector: allocate connector wired to device

Update 10 test files to use the shared helpers, removing
duplicated local alloc_test_adev, alloc_test_link,
alloc_test_dm, alloc_test_stream, and add_test_stream
functions.

Add missing MODULE_DESCRIPTION() macro to suppress modpost warning:
WARNING: modpost: missing MODULE_DESCRIPTION() in
amdgpu_dm_kunit_helpers.o

Assisted-by: Copilot:Claude-Opus-4.6
Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: George Zhang <george.zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Alex Hung 2026-06-18 14:22:27 -06:00 committed by Alex Deucher
parent 9bcf6af12b
commit a532f8d7e4
13 changed files with 252 additions and 243 deletions

View File

@ -11,6 +11,7 @@ ccflags-y += -I$(src)/../../../amdgpu
ccflags-y += -I$(src)/../../../amdkfd
ccflags-y += -I$(src)/../../../include
obj-$(CONFIG_DRM_AMD_DC_KUNIT_TEST) += amdgpu_dm_kunit_helpers.o
obj-$(CONFIG_DRM_AMD_DC_KUNIT_TEST) += amdgpu_dm_crc_test.o
obj-$(CONFIG_DRM_AMD_DC_KUNIT_TEST) += amdgpu_dm_hdcp_test.o
obj-$(CONFIG_DRM_AMD_DC_KUNIT_TEST) += amdgpu_dm_audio_test.o

View File

@ -13,6 +13,7 @@
#include "amdgpu_mode.h"
#include "amdgpu_dm.h"
#include "amdgpu_dm_backlight.h"
#include "amdgpu_dm_kunit_test_helpers.h"
#include "amd_shared.h"
#include "dc/inc/hw/panel_cntl.h"
@ -22,16 +23,6 @@ struct dm_backlight_connector_fixture {
struct dc_link *link;
};
static struct amdgpu_display_manager *alloc_test_dm(struct kunit *test)
{
struct amdgpu_display_manager *dm;
dm = kunit_kzalloc(test, sizeof(*dm), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, dm);
return dm;
}
static void setup_test_connector(struct kunit *test,
struct dm_backlight_connector_fixture *fixture,
int bl_idx, enum signal_type signal)
@ -57,7 +48,7 @@ static void setup_test_connector(struct kunit *test,
*/
static void dm_test_backlight_device_index_matches_second(struct kunit *test)
{
struct amdgpu_display_manager *dm = alloc_test_dm(test);
struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test);
struct backlight_device *bd0;
struct backlight_device *bd1;
@ -79,7 +70,7 @@ static void dm_test_backlight_device_index_matches_second(struct kunit *test)
*/
static void dm_test_backlight_device_index_missing_fallback(struct kunit *test)
{
struct amdgpu_display_manager *dm = alloc_test_dm(test);
struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test);
struct backlight_device *known_bd;
struct backlight_device *unknown_bd;
@ -102,7 +93,7 @@ static void dm_test_backlight_device_index_missing_fallback(struct kunit *test)
*/
static void dm_test_backlight_caps_valid_short_circuit(struct kunit *test)
{
struct amdgpu_display_manager *dm = alloc_test_dm(test);
struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test);
struct amdgpu_dm_backlight_caps *caps = &dm->backlight_caps[0];
caps->caps_valid = true;
@ -125,7 +116,7 @@ static void dm_test_backlight_caps_valid_short_circuit(struct kunit *test)
*/
static void dm_test_backlight_caps_aux_support_noop(struct kunit *test)
{
struct amdgpu_display_manager *dm = alloc_test_dm(test);
struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test);
struct amdgpu_dm_backlight_caps *caps = &dm->backlight_caps[0];
caps->caps_valid = false;
@ -146,7 +137,7 @@ static void dm_test_backlight_caps_aux_support_noop(struct kunit *test)
*/
static void dm_test_backlight_caps_non_aux_sets_defaults(struct kunit *test)
{
struct amdgpu_display_manager *dm = alloc_test_dm(test);
struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test);
struct amdgpu_dm_backlight_caps *caps = &dm->backlight_caps[0];
caps->caps_valid = false;

View File

@ -12,6 +12,7 @@
#include "dc.h"
#include "amdgpu.h"
#include "amdgpu_dm_colorop.h"
#include "amdgpu_dm_kunit_test_helpers.h"
/* Tests for amdgpu_dm_supported_degam_tfs */
@ -222,19 +223,11 @@ static void dm_test_initialize_default_pipeline_caps(struct kunit *test,
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);
adev = dm_kunit_alloc_adev(test);
drm = &adev->ddev;
dc = kunit_kzalloc(test, sizeof(*dc), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dc);

View File

@ -15,6 +15,7 @@
#include "amdgpu_mode.h"
#include "amdgpu_dm.h"
#include "amdgpu_dm_crtc.h"
#include "amdgpu_dm_kunit_test_helpers.h"
#include "amdgpu_dm_irq_params.h"
/* Tests for amdgpu_dm_crtc_modeset_required() */
@ -435,23 +436,13 @@ static void dm_test_crtc_set_vupdate_irq_no_otg(struct kunit *test)
{
struct amdgpu_crtc *acrtc;
struct amdgpu_device *adev;
struct drm_device *drm;
struct device *dev;
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);
adev = dm_kunit_alloc_adev(test);
acrtc = kunit_kzalloc(test, sizeof(*acrtc), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, acrtc);
acrtc->base.dev = drm;
acrtc->base.dev = &adev->ddev;
acrtc->otg_inst = -1;
KUNIT_EXPECT_EQ(test, amdgpu_dm_crtc_set_vupdate_irq(&acrtc->base, true), 0);

View File

@ -16,6 +16,7 @@
#include "dm_helpers.h"
#include "ddc_service_types.h"
#include "amdgpu_dm_helpers.h"
#include "amdgpu_dm_kunit_test_helpers.h"
/* Tests for edid_extract_panel_id() */
@ -552,26 +553,14 @@ static void dm_test_mst_start_top_mgr_boot(struct kunit *test)
{
struct amdgpu_dm_connector *aconnector;
struct amdgpu_device *adev;
struct drm_device *drm;
struct device *dev;
struct dc_link *link;
dev = drm_kunit_helper_alloc_device(test);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
adev = dm_kunit_alloc_adev(test);
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);
link = dm_kunit_alloc_link(test);
aconnector = kunit_kzalloc(test, sizeof(*aconnector), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, aconnector);
aconnector->base.dev = drm;
aconnector = dm_kunit_alloc_connector(test, adev, NULL);
link = kunit_kzalloc(test, sizeof(*link), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, link);
link->priv = aconnector;
KUNIT_EXPECT_TRUE(test, dm_helpers_dp_mst_start_top_mgr(NULL, link, true));

View File

@ -13,6 +13,7 @@
#include "amdgpu_mode.h"
#include "amdgpu_dm.h"
#include "amdgpu_dm_irq.h"
#include "amdgpu_dm_kunit_test_helpers.h"
#include "dmub/dmub_srv.h"
static void dm_test_irq_handler(void *arg)
@ -778,17 +779,9 @@ static void dm_test_get_crtc_by_otg_inst_returns_match(struct kunit *test)
struct amdgpu_crtc *acrtc_a, *acrtc_b;
struct amdgpu_device *adev;
struct drm_device *drm;
struct device *dev;
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);
adev = dm_kunit_alloc_adev(test);
drm = &adev->ddev;
acrtc_a = kunit_kzalloc(test, sizeof(*acrtc_a), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, acrtc_a);
@ -819,17 +812,9 @@ static void dm_test_get_crtc_by_otg_inst_returns_null(struct kunit *test)
struct amdgpu_crtc *acrtc;
struct amdgpu_device *adev;
struct drm_device *drm;
struct device *dev;
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);
adev = dm_kunit_alloc_adev(test);
drm = &adev->ddev;
acrtc = kunit_kzalloc(test, sizeof(*acrtc), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, acrtc);
@ -851,18 +836,8 @@ static void dm_test_get_crtc_by_otg_inst_returns_null(struct kunit *test)
static void dm_test_get_crtc_by_otg_inst_empty_list(struct kunit *test)
{
struct amdgpu_device *adev;
struct drm_device *drm;
struct device *dev;
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);
adev = dm_kunit_alloc_adev(test);
KUNIT_EXPECT_NULL(test, amdgpu_dm_get_crtc_by_otg_inst(adev, 0));
}

View File

@ -9,20 +9,7 @@
#include "dc.h"
#include "amdgpu_dm_ism.h"
/*
* Helper: allocate and zero-initialise a dc_stream_state for timing tests.
* Only the timing sub-struct is accessed by the functions under test.
*/
static struct dc_stream_state *alloc_test_stream(struct kunit *test)
{
struct dc_stream_state *stream;
stream = kunit_kzalloc(test, sizeof(*stream), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, stream);
return stream;
}
#include "amdgpu_dm_kunit_test_helpers.h"
/*
* Helper: allocate and zero-initialise an ISM instance.
@ -275,7 +262,7 @@ static void dm_test_ism_sso_delay_null_stream(struct kunit *test)
static void dm_test_ism_sso_delay_zero_frames(struct kunit *test)
{
struct amdgpu_dm_ism *ism = alloc_test_ism(test);
struct dc_stream_state *stream = alloc_test_stream(test);
struct dc_stream_state *stream = dm_kunit_alloc_stream(test, NULL);
stream->timing.v_total = 1125;
stream->timing.h_total = 2200;
@ -288,7 +275,7 @@ static void dm_test_ism_sso_delay_zero_frames(struct kunit *test)
static void dm_test_ism_sso_delay_1080p60_3frames(struct kunit *test)
{
struct amdgpu_dm_ism *ism = alloc_test_ism(test);
struct dc_stream_state *stream = alloc_test_stream(test);
struct dc_stream_state *stream = dm_kunit_alloc_stream(test, NULL);
uint64_t expected_one_frame_ns, expected;
/*
@ -311,7 +298,7 @@ static void dm_test_ism_sso_delay_1080p60_3frames(struct kunit *test)
static void dm_test_ism_sso_delay_4k60_1frame(struct kunit *test)
{
struct amdgpu_dm_ism *ism = alloc_test_ism(test);
struct dc_stream_state *stream = alloc_test_stream(test);
struct dc_stream_state *stream = dm_kunit_alloc_stream(test, NULL);
uint64_t expected_one_frame_ns;
/*
@ -347,7 +334,7 @@ static void dm_test_ism_idle_delay_null_stream(struct kunit *test)
static void dm_test_ism_idle_delay_zero_filter_frames(struct kunit *test)
{
struct amdgpu_dm_ism *ism = alloc_test_ism(test);
struct dc_stream_state *stream = alloc_test_stream(test);
struct dc_stream_state *stream = dm_kunit_alloc_stream(test, NULL);
stream->timing.v_total = 1125;
stream->timing.h_total = 2200;
@ -361,7 +348,7 @@ static void dm_test_ism_idle_delay_zero_filter_frames(struct kunit *test)
static void dm_test_ism_idle_delay_zero_entry_count(struct kunit *test)
{
struct amdgpu_dm_ism *ism = alloc_test_ism(test);
struct dc_stream_state *stream = alloc_test_stream(test);
struct dc_stream_state *stream = dm_kunit_alloc_stream(test, NULL);
stream->timing.v_total = 1125;
stream->timing.h_total = 2200;
@ -376,7 +363,7 @@ static void dm_test_ism_idle_delay_zero_entry_count(struct kunit *test)
static void dm_test_ism_idle_delay_zero_delay_frames(struct kunit *test)
{
struct amdgpu_dm_ism *ism = alloc_test_ism(test);
struct dc_stream_state *stream = alloc_test_stream(test);
struct dc_stream_state *stream = dm_kunit_alloc_stream(test, NULL);
stream->timing.v_total = 1125;
stream->timing.h_total = 2200;
@ -392,7 +379,7 @@ static void dm_test_ism_idle_delay_zero_delay_frames(struct kunit *test)
static void dm_test_ism_idle_delay_no_short_idles(struct kunit *test)
{
struct amdgpu_dm_ism *ism = alloc_test_ism(test);
struct dc_stream_state *stream = alloc_test_stream(test);
struct dc_stream_state *stream = dm_kunit_alloc_stream(test, NULL);
uint64_t one_frame_ns;
/*
@ -426,7 +413,7 @@ static void dm_test_ism_idle_delay_no_short_idles(struct kunit *test)
static void dm_test_ism_idle_delay_enough_short_idles(struct kunit *test)
{
struct amdgpu_dm_ism *ism = alloc_test_ism(test);
struct dc_stream_state *stream = alloc_test_stream(test);
struct dc_stream_state *stream = dm_kunit_alloc_stream(test, NULL);
uint64_t one_frame_ns, expected;
/*
@ -461,7 +448,7 @@ static void dm_test_ism_idle_delay_enough_short_idles(struct kunit *test)
static void dm_test_ism_idle_delay_wraps_around_buffer(struct kunit *test)
{
struct amdgpu_dm_ism *ism = alloc_test_ism(test);
struct dc_stream_state *stream = alloc_test_stream(test);
struct dc_stream_state *stream = dm_kunit_alloc_stream(test, NULL);
uint64_t one_frame_ns, expected;
/*
@ -497,7 +484,7 @@ static void dm_test_ism_idle_delay_wraps_around_buffer(struct kunit *test)
static void dm_test_ism_idle_delay_old_history_cutoff(struct kunit *test)
{
struct amdgpu_dm_ism *ism = alloc_test_ism(test);
struct dc_stream_state *stream = alloc_test_stream(test);
struct dc_stream_state *stream = dm_kunit_alloc_stream(test, NULL);
uint64_t one_frame_ns;
/*
@ -545,7 +532,7 @@ static void dm_test_ism_idle_delay_old_history_cutoff(struct kunit *test)
static void dm_test_ism_idle_delay_mixed_durations(struct kunit *test)
{
struct amdgpu_dm_ism *ism = alloc_test_ism(test);
struct dc_stream_state *stream = alloc_test_stream(test);
struct dc_stream_state *stream = dm_kunit_alloc_stream(test, NULL);
uint64_t one_frame_ns;
/*
@ -586,7 +573,7 @@ static void dm_test_ism_idle_delay_mixed_durations(struct kunit *test)
static void dm_test_ism_idle_delay_entry_count_exceeds_history_size(struct kunit *test)
{
struct amdgpu_dm_ism *ism = alloc_test_ism(test);
struct dc_stream_state *stream = alloc_test_stream(test);
struct dc_stream_state *stream = dm_kunit_alloc_stream(test, NULL);
uint64_t one_frame_ns, expected;
/*

View File

@ -0,0 +1,142 @@
// SPDX-License-Identifier: GPL-2.0 OR MIT
/*
* KUnit test helpers for amdgpu_dm tests.
*
* Copyright 2026 Advanced Micro Devices, Inc.
*/
#include <kunit/test.h>
#include <linux/module.h>
#include <drm/drm_kunit_helpers.h>
#include "dc.h"
#include "core_types.h"
#include "amdgpu.h"
#include "amdgpu_mode.h"
#include "amdgpu_dm.h"
#include "amdgpu_dm_kunit_test_helpers.h"
struct amdgpu_device *dm_kunit_alloc_adev(struct kunit *test)
{
struct drm_device *drm;
struct device *dev;
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(struct amdgpu_device),
offsetof(struct amdgpu_device, ddev),
DRIVER_MODESET | DRIVER_ATOMIC);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm);
return drm_to_adev(drm);
}
EXPORT_SYMBOL(dm_kunit_alloc_adev);
struct dc_link *dm_kunit_alloc_link(struct kunit *test)
{
struct dc_link *link;
link = kunit_kzalloc(test, sizeof(*link), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, link);
return link;
}
EXPORT_SYMBOL(dm_kunit_alloc_link);
struct dc_link *dm_kunit_alloc_link_with_ctx(struct kunit *test)
{
struct dc_link *link;
struct dc_context *ctx;
struct dc *dc;
link = dm_kunit_alloc_link(test);
ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, ctx);
dc = kunit_kzalloc(test, sizeof(*dc), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, dc);
link->ctx = ctx;
ctx->dc = dc;
dc->ctx = ctx;
return link;
}
EXPORT_SYMBOL(dm_kunit_alloc_link_with_ctx);
struct amdgpu_display_manager *dm_kunit_alloc_dm(struct kunit *test)
{
struct amdgpu_display_manager *dm;
struct dc *dc;
struct dc_state *state;
dm = kunit_kzalloc(test, sizeof(*dm), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, dm);
dc = kunit_kzalloc(test, sizeof(*dc), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, dc);
state = kunit_kzalloc(test, sizeof(*state), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, state);
dm->dc = dc;
dc->current_state = state;
return dm;
}
EXPORT_SYMBOL(dm_kunit_alloc_dm);
struct dc_stream_state *dm_kunit_alloc_stream(struct kunit *test,
struct dc_link *link)
{
struct dc_stream_state *stream;
stream = kunit_kzalloc(test, sizeof(*stream), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, stream);
stream->link = link;
kref_init(&stream->refcount);
return stream;
}
EXPORT_SYMBOL(dm_kunit_alloc_stream);
void dm_kunit_add_stream_to_state(struct kunit *test, struct dc_state *state,
unsigned int index, struct dc_link *link)
{
struct dc_stream_state *stream;
KUNIT_ASSERT_LT(test, index, (unsigned int)MAX_PIPES);
stream = kunit_kzalloc(test, sizeof(*stream), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, stream);
stream->link = link;
state->streams[index] = stream;
if (state->stream_count <= index)
state->stream_count = index + 1;
}
EXPORT_SYMBOL(dm_kunit_add_stream_to_state);
struct amdgpu_dm_connector *dm_kunit_alloc_connector(struct kunit *test,
struct amdgpu_device *adev,
struct dc_link *link)
{
struct amdgpu_dm_connector *aconnector;
aconnector = kunit_kzalloc(test, sizeof(*aconnector), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, aconnector);
if (adev)
aconnector->base.dev = &adev->ddev;
aconnector->dc_link = link;
return aconnector;
}
EXPORT_SYMBOL(dm_kunit_alloc_connector);
MODULE_LICENSE("Dual MIT/GPL");
MODULE_DESCRIPTION("KUnit test helpers for amdgpu_dm tests");

View File

@ -0,0 +1,32 @@
/* SPDX-License-Identifier: GPL-2.0 OR MIT */
/*
* KUnit test helpers for amdgpu_dm tests.
*
* Copyright 2026 Advanced Micro Devices, Inc.
*/
#ifndef AMDGPU_DM_KUNIT_TEST_HELPERS_H
#define AMDGPU_DM_KUNIT_TEST_HELPERS_H
#include <kunit/test.h>
struct amdgpu_device;
struct amdgpu_display_manager;
struct amdgpu_dm_connector;
struct dc_link;
struct dc_state;
struct dc_stream_state;
struct amdgpu_device *dm_kunit_alloc_adev(struct kunit *test);
struct dc_link *dm_kunit_alloc_link(struct kunit *test);
struct dc_link *dm_kunit_alloc_link_with_ctx(struct kunit *test);
struct amdgpu_display_manager *dm_kunit_alloc_dm(struct kunit *test);
struct dc_stream_state *dm_kunit_alloc_stream(struct kunit *test,
struct dc_link *link);
void dm_kunit_add_stream_to_state(struct kunit *test, struct dc_state *state,
unsigned int index, struct dc_link *link);
struct amdgpu_dm_connector *dm_kunit_alloc_connector(struct kunit *test,
struct amdgpu_device *adev,
struct dc_link *link);
#endif /* AMDGPU_DM_KUNIT_TEST_HELPERS_H */

View File

@ -20,6 +20,7 @@
#include "amdgpu_mode.h"
#include "amdgpu_dm.h"
#include "amdgpu_dm_mst_types.h"
#include "amdgpu_dm_kunit_test_helpers.h"
#include "inc/link_service.h"
/*
@ -914,18 +915,10 @@ static void dm_mst_test_create_fake_mst_encoders(struct kunit *test)
{
struct amdgpu_device *adev;
struct drm_device *drm;
struct device *dev;
int i;
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 | DRIVER_ATOMIC);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm);
adev = drm_to_adev(drm);
adev = dm_kunit_alloc_adev(test);
drm = &adev->ddev;
adev->dm.display_indexes_num = 3;
adev->mode_info.num_crtc = 3;

View File

@ -12,79 +12,17 @@
#include "amdgpu_mode.h"
#include "amdgpu_dm.h"
#include "amdgpu_dm_psr.h"
#include "amdgpu_dm_kunit_test_helpers.h"
#include "power_helpers.h"
/*
* Helper: allocate and zero-initialise a dc_link sufficient for
* amdgpu_dm_psr_fill_caps() testing. The function only accesses
* embedded members (dpcd_caps, psr_settings) so no pointer fields
* need to be wired up.
*/
static struct dc_link *alloc_test_link(struct kunit *test)
{
struct dc_link *link;
link = kunit_kzalloc(test, sizeof(*link), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, link);
return link;
}
/*
* Helper: allocate and wire the minimal DM/DC state needed for
* amdgpu_dm_psr_is_active_allowed() testing.
*/
static struct amdgpu_display_manager *alloc_test_dm(struct kunit *test)
{
struct amdgpu_display_manager *dm;
struct dc *dc;
struct dc_state *state;
dm = kunit_kzalloc(test, sizeof(*dm), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, dm);
dc = kunit_kzalloc(test, sizeof(*dc), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, dc);
state = kunit_kzalloc(test, sizeof(*state), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, state);
dm->dc = dc;
dc->current_state = state;
return dm;
}
static void add_test_stream(struct kunit *test, struct dc_state *state,
unsigned int index, struct dc_link *link)
{
struct dc_stream_state *stream;
KUNIT_ASSERT_LT(test, index, (unsigned int)MAX_PIPES);
stream = kunit_kzalloc(test, sizeof(*stream), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, stream);
stream->link = link;
state->streams[index] = stream;
if (state->stream_count <= index)
state->stream_count = index + 1;
}
static struct dc_stream_state *alloc_test_psr_stream(struct kunit *test)
{
struct dc_stream_state *stream;
struct dc_link *link;
stream = kunit_kzalloc(test, sizeof(*stream), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, stream);
link = alloc_test_link(test);
link = dm_kunit_alloc_link(test);
link->psr_settings.psr_feature_enabled = true;
stream->link = link;
kref_init(&stream->refcount);
return stream;
return dm_kunit_alloc_stream(test, link);
}
static struct core_power *create_test_power_module(struct kunit *test,
@ -108,7 +46,7 @@ static struct core_power *create_test_power_module(struct kunit *test,
static struct dc_link *alloc_test_psrsu_link(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct dc_context *ctx;
struct dc *dc;
@ -359,7 +297,7 @@ static void dm_test_set_psr_caps_no_dpcd_psr(struct kunit *test)
static void dm_test_set_psr_caps_edp1_disabled(struct kunit *test)
{
struct dc_link *link = alloc_test_psr_caps_link(test);
struct dc_link *edp0 = alloc_test_link(test);
struct dc_link *edp0 = dm_kunit_alloc_link(test);
struct amdgpu_dm_connector *aconnector = alloc_test_aconnector(test);
struct dc *dc = link->ctx->dc;
@ -393,7 +331,7 @@ static void dm_test_set_psr_caps_success_psr1(struct kunit *test)
static void dm_test_psr_fill_caps_version_1(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct psr_caps caps;
memset(&caps, 0, sizeof(caps));
@ -406,7 +344,7 @@ static void dm_test_psr_fill_caps_version_1(struct kunit *test)
static void dm_test_psr_fill_caps_version_su1(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct psr_caps caps;
memset(&caps, 0, sizeof(caps));
@ -419,7 +357,7 @@ static void dm_test_psr_fill_caps_version_su1(struct kunit *test)
static void dm_test_psr_fill_caps_version_unsupported(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct psr_caps caps;
memset(&caps, 0, sizeof(caps));
@ -438,7 +376,7 @@ static void dm_test_psr_fill_caps_version_unsupported(struct kunit *test)
static void dm_test_psr_fill_caps_setup_time_zero(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct psr_caps caps;
memset(&caps, 0, sizeof(caps));
@ -452,7 +390,7 @@ static void dm_test_psr_fill_caps_setup_time_zero(struct kunit *test)
static void dm_test_psr_fill_caps_setup_time_mid(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct psr_caps caps;
memset(&caps, 0, sizeof(caps));
@ -466,7 +404,7 @@ static void dm_test_psr_fill_caps_setup_time_mid(struct kunit *test)
static void dm_test_psr_fill_caps_setup_time_max(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct psr_caps caps;
memset(&caps, 0, sizeof(caps));
@ -482,7 +420,7 @@ static void dm_test_psr_fill_caps_setup_time_max(struct kunit *test)
static void dm_test_psr_fill_caps_link_training_required(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct psr_caps caps;
memset(&caps, 0, sizeof(caps));
@ -495,7 +433,7 @@ static void dm_test_psr_fill_caps_link_training_required(struct kunit *test)
static void dm_test_psr_fill_caps_link_training_not_required(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct psr_caps caps;
memset(&caps, 0, sizeof(caps));
@ -510,7 +448,7 @@ static void dm_test_psr_fill_caps_link_training_not_required(struct kunit *test)
static void dm_test_psr_fill_caps_dpcd_fields(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct psr_caps caps;
memset(&caps, 0, sizeof(caps));
@ -536,7 +474,7 @@ static void dm_test_psr_fill_caps_dpcd_fields(struct kunit *test)
static void dm_test_psr_fill_caps_dpcd_fields_unset(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct psr_caps caps;
memset(&caps, 0xFF, sizeof(caps));
@ -557,7 +495,7 @@ static void dm_test_psr_fill_caps_dpcd_fields_unset(struct kunit *test)
static void dm_test_psr_fill_caps_rate_control_always_zero(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct psr_caps caps;
/* Pre-fill caps with non-zero to verify overwrite */
@ -570,7 +508,7 @@ static void dm_test_psr_fill_caps_rate_control_always_zero(struct kunit *test)
static void dm_test_psr_fill_caps_power_opts_z10_always_set(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct psr_caps caps;
memset(&caps, 0, sizeof(caps));
@ -588,7 +526,7 @@ static void dm_test_psr_fill_caps_power_opts_z10_always_set(struct kunit *test)
static void dm_test_psr_fill_caps_power_opts_smu_opt_set(struct kunit *test)
{
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
struct psr_caps caps;
unsigned int old_feature_mask;
@ -647,7 +585,7 @@ static void dm_test_psr_set_event_psr_not_enabled(struct kunit *test)
*/
static void dm_test_psr_set_event_get_event_fails(struct kunit *test)
{
struct amdgpu_display_manager *dm = alloc_test_dm(test);
struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test);
struct dc_stream_state *stream = alloc_test_psr_stream(test);
dm->power_module = NULL;
@ -661,7 +599,7 @@ static void dm_test_psr_set_event_get_event_fails(struct kunit *test)
*/
static void dm_test_psr_set_event_already_set(struct kunit *test)
{
struct amdgpu_display_manager *dm = alloc_test_dm(test);
struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test);
struct dc_stream_state *stream = alloc_test_psr_stream(test);
struct psr_caps caps = {0};
struct core_power *core_power;
@ -682,7 +620,7 @@ static void dm_test_psr_set_event_already_set(struct kunit *test)
*/
static void dm_test_psr_set_event_updates_event(struct kunit *test)
{
struct amdgpu_display_manager *dm = alloc_test_dm(test);
struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test);
struct dc_stream_state *stream = alloc_test_psr_stream(test);
struct psr_caps caps = {0};
struct core_power *core_power;
@ -706,7 +644,7 @@ static void dm_test_psr_set_event_updates_event(struct kunit *test)
*/
static void dm_test_psr_is_active_allowed_no_streams(struct kunit *test)
{
struct amdgpu_display_manager *dm = alloc_test_dm(test);
struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test);
KUNIT_EXPECT_FALSE(test, amdgpu_dm_psr_is_active_allowed(dm));
}
@ -717,10 +655,10 @@ static void dm_test_psr_is_active_allowed_no_streams(struct kunit *test)
*/
static void dm_test_psr_is_active_allowed_null_link(struct kunit *test)
{
struct amdgpu_display_manager *dm = alloc_test_dm(test);
struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test);
struct dc_state *state = dm->dc->current_state;
add_test_stream(test, state, 0, NULL);
dm_kunit_add_stream_to_state(test, state, 0, NULL);
KUNIT_EXPECT_FALSE(test, amdgpu_dm_psr_is_active_allowed(dm));
}
@ -732,11 +670,11 @@ static void dm_test_psr_is_active_allowed_null_link(struct kunit *test)
*/
static void dm_test_psr_is_active_allowed_requires_enabled_and_allowed(struct kunit *test)
{
struct amdgpu_display_manager *dm = alloc_test_dm(test);
struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test);
struct dc_state *state = dm->dc->current_state;
struct dc_link *link = alloc_test_link(test);
struct dc_link *link = dm_kunit_alloc_link(test);
add_test_stream(test, state, 0, link);
dm_kunit_add_stream_to_state(test, state, 0, link);
link->psr_settings.psr_allow_active = true;
KUNIT_EXPECT_FALSE(test, amdgpu_dm_psr_is_active_allowed(dm));
@ -752,17 +690,17 @@ static void dm_test_psr_is_active_allowed_requires_enabled_and_allowed(struct ku
*/
static void dm_test_psr_is_active_allowed_any_stream(struct kunit *test)
{
struct amdgpu_display_manager *dm = alloc_test_dm(test);
struct amdgpu_display_manager *dm = dm_kunit_alloc_dm(test);
struct dc_state *state = dm->dc->current_state;
struct dc_link *disabled_link = alloc_test_link(test);
struct dc_link *allowed_link = alloc_test_link(test);
struct dc_link *disabled_link = dm_kunit_alloc_link(test);
struct dc_link *allowed_link = dm_kunit_alloc_link(test);
disabled_link->psr_settings.psr_allow_active = true;
allowed_link->psr_settings.psr_feature_enabled = true;
allowed_link->psr_settings.psr_allow_active = true;
add_test_stream(test, state, 0, disabled_link);
add_test_stream(test, state, 1, allowed_link);
dm_kunit_add_stream_to_state(test, state, 0, disabled_link);
dm_kunit_add_stream_to_state(test, state, 1, allowed_link);
KUNIT_EXPECT_TRUE(test, amdgpu_dm_psr_is_active_allowed(dm));
}

View File

@ -12,6 +12,7 @@
#include "amdgpu_mode.h"
#include "amdgpu_dm.h"
#include "amdgpu_dm_replay.h"
#include "amdgpu_dm_kunit_test_helpers.h"
#include "modules/power/power_helpers.h"
#include "dmub/dmub_srv.h"
@ -35,8 +36,9 @@ static struct replay_test_ctx *alloc_replay_ctx(struct kunit *test)
ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, ctx);
ctx->link = kunit_kzalloc(test, sizeof(*ctx->link), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, ctx->link);
ctx->link = dm_kunit_alloc_link_with_ctx(test);
ctx->dc_ctx = ctx->link->ctx;
ctx->dc = ctx->dc_ctx->dc;
ctx->aconnector = kunit_kzalloc(test, sizeof(*ctx->aconnector), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, ctx->aconnector);
@ -44,21 +46,10 @@ static struct replay_test_ctx *alloc_replay_ctx(struct kunit *test)
ctx->dm_state = kunit_kzalloc(test, sizeof(*ctx->dm_state), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, ctx->dm_state);
ctx->dc = kunit_kzalloc(test, sizeof(*ctx->dc), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, ctx->dc);
ctx->dc_ctx = kunit_kzalloc(test, sizeof(*ctx->dc_ctx), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, ctx->dc_ctx);
ctx->stream = kunit_kzalloc(test, sizeof(*ctx->stream), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, ctx->stream);
ctx->stream = dm_kunit_alloc_stream(test, ctx->link);
/* Wire connector state so to_dm_connector_state() works */
ctx->aconnector->base.state = &ctx->dm_state->base;
ctx->link->ctx = ctx->dc_ctx;
ctx->dc_ctx->dc = ctx->dc;
ctx->dc->ctx = ctx->dc_ctx;
ctx->stream->link = ctx->link;
return ctx;
}

View File

@ -20,6 +20,7 @@
#include "amdgpu.h"
#include "amdgpu_dm.h"
#include "amdgpu_dm_wb.h"
#include "amdgpu_dm_kunit_test_helpers.h"
/* Helper functions */
@ -71,22 +72,7 @@ static struct drm_connector_state *alloc_test_conn_state(struct kunit *test,
return conn_state;
}
static struct amdgpu_device *alloc_test_adev(struct kunit *test)
{
struct drm_device *drm;
struct device *dev;
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(struct amdgpu_device),
offsetof(struct amdgpu_device, ddev),
DRIVER_MODESET | DRIVER_ATOMIC);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm);
return drm_to_adev(drm);
}
/* Tests for amdgpu_dm_wb_encoder_atomic_check */
@ -350,7 +336,7 @@ static void dm_test_wb_connector_init_success(struct kunit *test)
struct dc *dc;
int ret;
adev = alloc_test_adev(test);
adev = dm_kunit_alloc_adev(test);
adev->mode_info.num_crtc = 1;
dm = &adev->dm;
dm->adev = adev;