drm/amd/display: share common DM KUnit helpers

Move fixture setup that was duplicated across several amdgpu_dm
KUnit tests into amdgpu_dm_kunit_helpers.c:

- dm_kunit_alloc_dc_with_ctx() allocates a dc and its dc_context.
- dm_kunit_alloc_drm_with_connector_list() allocates a drm_device
  with an initialized connector list.

Update the irq, psr, crtc and backlight tests to use these helpers.

Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Fangzhi Zuo <jerry.zuo@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Alex Hung
2026-07-09 17:36:15 -06:00
committed by Alex Deucher
parent 2c381b75fa
commit d95429c1d4
6 changed files with 53 additions and 78 deletions

View File

@@ -56,14 +56,7 @@ static void setup_test_connector(struct kunit *test,
static void setup_test_dm_ddev(struct kunit *test, struct amdgpu_display_manager *dm)
{
struct drm_device *ddev;
ddev = kunit_kzalloc(test, sizeof(*ddev), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ddev);
INIT_LIST_HEAD(&ddev->mode_config.connector_list);
spin_lock_init(&ddev->mode_config.connector_list_lock);
dm->ddev = ddev;
dm->ddev = dm_kunit_alloc_drm_with_connector_list(test);
}
/* Tests for dm_find_stream_with_link() */

View File

@@ -296,13 +296,9 @@ static void dm_test_crtc_is_headless_null_adev(struct kunit *test)
static void dm_test_crtc_is_headless_no_connectors(struct kunit *test)
{
struct amdgpu_device *adev = kunit_kzalloc(test, sizeof(*adev), GFP_KERNEL);
struct drm_device *dev = kunit_kzalloc(test, sizeof(*dev), GFP_KERNEL);
struct drm_device *dev = dm_kunit_alloc_drm_with_connector_list(test);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, adev);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
INIT_LIST_HEAD(&dev->mode_config.connector_list);
spin_lock_init(&dev->mode_config.connector_list_lock);
adev->dm.ddev = dev;
KUNIT_EXPECT_TRUE(test, amdgpu_dm_is_headless(adev));
@@ -315,15 +311,11 @@ static void dm_test_crtc_is_headless_no_connectors(struct kunit *test)
static void dm_test_crtc_is_headless_writeback_only(struct kunit *test)
{
struct amdgpu_device *adev = kunit_kzalloc(test, sizeof(*adev), GFP_KERNEL);
struct drm_device *dev = kunit_kzalloc(test, sizeof(*dev), GFP_KERNEL);
struct drm_device *dev = dm_kunit_alloc_drm_with_connector_list(test);
struct drm_connector *wb = kunit_kzalloc(test, sizeof(*wb), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, adev);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, wb);
INIT_LIST_HEAD(&dev->mode_config.connector_list);
spin_lock_init(&dev->mode_config.connector_list_lock);
adev->dm.ddev = dev;
dm_test_add_connector(dev, wb, DRM_MODE_CONNECTOR_WRITEBACK,
@@ -339,15 +331,11 @@ static void dm_test_crtc_is_headless_writeback_only(struct kunit *test)
static void dm_test_crtc_is_headless_disconnected_display(struct kunit *test)
{
struct amdgpu_device *adev = kunit_kzalloc(test, sizeof(*adev), GFP_KERNEL);
struct drm_device *dev = kunit_kzalloc(test, sizeof(*dev), GFP_KERNEL);
struct drm_device *dev = dm_kunit_alloc_drm_with_connector_list(test);
struct drm_connector *display = kunit_kzalloc(test, sizeof(*display), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, adev);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, display);
INIT_LIST_HEAD(&dev->mode_config.connector_list);
spin_lock_init(&dev->mode_config.connector_list_lock);
adev->dm.ddev = dev;
dm_test_add_connector(dev, display, DRM_MODE_CONNECTOR_HDMIA,
@@ -363,15 +351,11 @@ static void dm_test_crtc_is_headless_disconnected_display(struct kunit *test)
static void dm_test_crtc_is_headless_connected_display(struct kunit *test)
{
struct amdgpu_device *adev = kunit_kzalloc(test, sizeof(*adev), GFP_KERNEL);
struct drm_device *dev = kunit_kzalloc(test, sizeof(*dev), GFP_KERNEL);
struct drm_device *dev = dm_kunit_alloc_drm_with_connector_list(test);
struct drm_connector *display = kunit_kzalloc(test, sizeof(*display), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, adev);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, display);
INIT_LIST_HEAD(&dev->mode_config.connector_list);
spin_lock_init(&dev->mode_config.connector_list_lock);
adev->dm.ddev = dev;
dm_test_add_connector(dev, display, DRM_MODE_CONNECTOR_HDMIA,
@@ -387,17 +371,13 @@ static void dm_test_crtc_is_headless_connected_display(struct kunit *test)
static void dm_test_crtc_is_headless_mixed_connectors(struct kunit *test)
{
struct amdgpu_device *adev = kunit_kzalloc(test, sizeof(*adev), GFP_KERNEL);
struct drm_device *dev = kunit_kzalloc(test, sizeof(*dev), GFP_KERNEL);
struct drm_device *dev = dm_kunit_alloc_drm_with_connector_list(test);
struct drm_connector *wb = kunit_kzalloc(test, sizeof(*wb), GFP_KERNEL);
struct drm_connector *display = kunit_kzalloc(test, sizeof(*display), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, adev);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, wb);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, display);
INIT_LIST_HEAD(&dev->mode_config.connector_list);
spin_lock_init(&dev->mode_config.connector_list_lock);
adev->dm.ddev = dev;
dm_test_add_connector(dev, wb, DRM_MODE_CONNECTOR_WRITEBACK,

View File

@@ -202,22 +202,6 @@ static void dm_test_dmub_notify_callback(struct amdgpu_device *adev,
dm_test_dmub_notify_count++;
}
static struct dc *dm_test_alloc_dc_with_ctx(struct kunit *test)
{
struct dc_context *ctx;
struct dc *dc;
dc = kunit_kzalloc(test, sizeof(*dc), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dc);
ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx);
dc->ctx = ctx;
ctx->dc = dc;
return dc;
}
static enum dc_irq_source dm_test_to_dal_irq_source_dce110(
struct irq_service *irq_service,
uint32_t src_id,
@@ -299,7 +283,7 @@ static struct dc *dm_test_alloc_dc_with_irq_service(struct kunit *test,
struct dc *dc;
int i;
dc = dm_test_alloc_dc_with_ctx(test);
dc = dm_kunit_alloc_dc_with_ctx(test);
res_pool = kunit_kzalloc(test, sizeof(*res_pool), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, res_pool);
irqs = kunit_kzalloc(test, sizeof(*irqs), GFP_KERNEL);
@@ -3283,7 +3267,7 @@ static void dm_test_register_hpd_handlers_dmub_outbox(struct kunit *test)
adev = dm_kunit_alloc_adev(test);
KUNIT_ASSERT_EQ(test, amdgpu_dm_irq_init(adev), 0);
dc = dm_test_alloc_dc_with_ctx(test);
dc = dm_kunit_alloc_dc_with_ctx(test);
adev->dm.dc = dc;
/* Make dc_is_dmub_outbox_supported() return true. */
@@ -3495,7 +3479,7 @@ static void dm_test_dmub_outbox1_low_irq_empty(struct kunit *test)
struct dc *dc;
adev = dm_kunit_alloc_adev(test);
dc = dm_test_alloc_dc_with_ctx(test);
dc = dm_kunit_alloc_dc_with_ctx(test);
dc_dmub_srv = kunit_kzalloc(test, sizeof(*dc_dmub_srv), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dc_dmub_srv);
dmub = kunit_kzalloc(test, sizeof(*dmub), GFP_KERNEL);
@@ -3529,7 +3513,7 @@ static struct amdgpu_device *dm_test_alloc_adev_outbox_notify(struct kunit *test
struct dc *dc;
adev = dm_kunit_alloc_adev(test);
dc = dm_test_alloc_dc_with_ctx(test);
dc = dm_kunit_alloc_dc_with_ctx(test);
dc_dmub_srv = kunit_kzalloc(test, sizeof(*dc_dmub_srv), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dc_dmub_srv);
dmub = kunit_kzalloc(test, sizeof(*dmub), GFP_KERNEL);
@@ -3635,7 +3619,7 @@ static void dm_test_dce110_register_irq_handlers_rejects_uninitialized_sources(s
struct dc *dc;
adev = dm_kunit_alloc_adev(test);
dc = dm_test_alloc_dc_with_ctx(test);
dc = dm_kunit_alloc_dc_with_ctx(test);
adev->dm.dc = dc;
KUNIT_EXPECT_EQ(test, amdgpu_dm_dce110_register_irq_handlers(adev), -EINVAL);
@@ -3696,7 +3680,7 @@ static void dm_test_dcn10_register_irq_handlers_zero_crtc(struct kunit *test)
adev = dm_kunit_alloc_adev(test);
KUNIT_ASSERT_EQ(test, kunit_add_action_or_reset(test, dm_test_free_irq_sources,
adev), 0);
dc = dm_test_alloc_dc_with_ctx(test);
dc = dm_kunit_alloc_dc_with_ctx(test);
adev->dm.dc = dc;
adev->mode_info.num_hpd = 1;
amdgpu_dm_set_irq_funcs(adev);
@@ -3759,7 +3743,7 @@ static void dm_test_register_outbox_irq_handlers_without_dmub(struct kunit *test
adev = dm_kunit_alloc_adev(test);
KUNIT_ASSERT_EQ(test, kunit_add_action_or_reset(test, dm_test_free_irq_sources,
adev), 0);
dc = dm_test_alloc_dc_with_ctx(test);
dc = dm_kunit_alloc_dc_with_ctx(test);
adev->dm.dc = dc;
amdgpu_dm_set_irq_funcs(adev);
@@ -3899,7 +3883,7 @@ static void dm_test_handle_vmin_vmax_update(struct kunit *test)
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, adev);
mutex_init(&adev->dm.dc_lock);
dc = dm_test_alloc_dc_with_ctx(test);
dc = dm_kunit_alloc_dc_with_ctx(test);
dc->current_state = kunit_kzalloc(test, sizeof(*dc->current_state),
GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dc->current_state);

View File

@@ -45,23 +45,32 @@ struct dc_link *dm_kunit_alloc_link(struct kunit *test)
}
EXPORT_SYMBOL(dm_kunit_alloc_link);
struct dc_link *dm_kunit_alloc_link_with_ctx(struct kunit *test)
struct dc *dm_kunit_alloc_dc_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;
ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, ctx);
dc->ctx = ctx;
ctx->dc = dc;
return dc;
}
EXPORT_SYMBOL(dm_kunit_alloc_dc_with_ctx);
struct dc_link *dm_kunit_alloc_link_with_ctx(struct kunit *test)
{
struct dc_link *link;
struct dc *dc;
link = dm_kunit_alloc_link(test);
dc = dm_kunit_alloc_dc_with_ctx(test);
link->ctx = dc->ctx;
return link;
}
@@ -138,5 +147,19 @@ struct amdgpu_dm_connector *dm_kunit_alloc_connector(struct kunit *test,
}
EXPORT_SYMBOL(dm_kunit_alloc_connector);
struct drm_device *dm_kunit_alloc_drm_with_connector_list(struct kunit *test)
{
struct drm_device *dev;
dev = kunit_kzalloc(test, sizeof(*dev), GFP_KERNEL);
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
INIT_LIST_HEAD(&dev->mode_config.connector_list);
spin_lock_init(&dev->mode_config.connector_list_lock);
return dev;
}
EXPORT_SYMBOL(dm_kunit_alloc_drm_with_connector_list);
MODULE_LICENSE("Dual MIT/GPL");
MODULE_DESCRIPTION("KUnit test helpers for amdgpu_dm tests");

View File

@@ -13,14 +13,18 @@
struct amdgpu_device;
struct amdgpu_display_manager;
struct amdgpu_dm_connector;
struct dc;
struct dc_link;
struct dc_state;
struct dc_stream_state;
struct drm_device;
struct amdgpu_device *dm_kunit_alloc_adev(struct kunit *test);
struct dc *dm_kunit_alloc_dc_with_ctx(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 drm_device *dm_kunit_alloc_drm_with_connector_list(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,

View File

@@ -46,19 +46,10 @@ 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 = dm_kunit_alloc_link(test);
struct dc_context *ctx;
struct dc *dc;
struct dc_link *link = dm_kunit_alloc_link_with_ctx(test);
struct dc_context *ctx = link->ctx;
struct dc *dc = ctx->dc;
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;
dc->caps.dmcub_support = true;
ctx->dce_version = DCN_VERSION_3_1;
link->dpcd_caps.edp_rev = DP_EDP_14;