From: Alex Hung <[email protected]>
[WHAT]
Add a KUnit test for dm_helpers_dmub_set_config_sync() that submits a
SET_CONFIG payload without a DC DMUB service.
The command cannot reach the firmware, so the helper still returns
success while reporting SET_CONFIG_UNKNOWN_ERROR.
Assisted-by: Copilot:Claude-Opus-5
Reviewed-by: Bhawanpreet Lakha <[email protected]>
Signed-off-by: Alex Hung <[email protected]>
Signed-off-by: Ivan Lipski <[email protected]>
---
.../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 1 +
.../amdgpu_dm/tests/amdgpu_dm_helpers_test.c | 48 +++++++++++++++++++
2 files changed, 49 insertions(+)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
index 0344ce5ce816b..7c7783aa40745 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
@@ -1374,6 +1374,7 @@ int dm_helpers_dmub_set_config_sync(struct dc_context *ctx,
return amdgpu_dm_process_dmub_set_config_sync(ctx, link->link_index, payload,
operation_result);
}
+EXPORT_IF_KUNIT(dm_helpers_dmub_set_config_sync);
void dm_set_dcn_clocks(struct dc_context *ctx, struct dc_clocks *clks)
{
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c
index 11a5e8f307354..170e0ee425b23 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_helpers_test.c
@@ -19,6 +19,7 @@
#include "dc_bios_types.h"
#include "dm_helpers.h"
#include "ddc_service_types.h"
+#include "dmub/dmub_srv.h"
#include "dmub_cmd.h"
#include "amdgpu_dm_helpers.h"
#include "amdgpu_dm_kunit_test_helpers.h"
@@ -3997,6 +3998,51 @@ static void dm_test_gpu_mem_alloc_and_free(struct kunit *test)
amdgpu_dm_services_kunit_set_ops(NULL);
}
+/* Tests for dm_helpers_dmub_set_config_sync() */
+
+/**
+ * dm_test_dmub_set_config_sync_unknown_error - Test SET_CONFIG without a DMUB service
+ * @test: The KUnit test context
+ *
+ * The helper only unwraps the link index before forwarding. With no DC DMUB
+ * service the command cannot reach the firmware and is reported as completed
+ * with SET_CONFIG_UNKNOWN_ERROR.
+ */
+static void dm_test_dmub_set_config_sync_unknown_error(struct kunit *test)
+{
+ struct set_config_cmd_payload payload = {0};
+ enum set_config_status result = SET_CONFIG_PENDING;
+ struct dmub_notification *notify;
+ struct amdgpu_device *adev;
+ struct dc_context *dc_ctx;
+ struct dc_context *ctx;
+ struct dc_link *link;
+ struct dc *dc;
+
+ adev = dm_kunit_alloc_adev(test);
+ KUNIT_ASSERT_NOT_NULL(test, adev);
+ ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL);
+ KUNIT_ASSERT_NOT_NULL(test, ctx);
+ dc_ctx = kunit_kzalloc(test, sizeof(*dc_ctx), GFP_KERNEL);
+ KUNIT_ASSERT_NOT_NULL(test, dc_ctx);
+ dc = kunit_kzalloc(test, sizeof(*dc), GFP_KERNEL);
+ KUNIT_ASSERT_NOT_NULL(test, dc);
+ notify = kunit_kzalloc(test, sizeof(*notify), GFP_KERNEL);
+ KUNIT_ASSERT_NOT_NULL(test, notify);
+ link = dm_kunit_alloc_link(test);
+
+ dc->ctx = dc_ctx;
+ dc->links[0] = link;
+ ctx->dc = dc;
+ ctx->driver_context = adev;
+ adev->dm.dmub_notify = notify;
+ mutex_init(&adev->dm.dpia_aux_lock);
+ init_completion(&adev->dm.dmub_aux_transfer_done);
+
+ KUNIT_EXPECT_EQ(test, dm_helpers_dmub_set_config_sync(ctx, link, &payload, &result), 0);
+ KUNIT_EXPECT_EQ(test, (int)result, (int)SET_CONFIG_UNKNOWN_ERROR);
+}
+
static struct kunit_case amdgpu_dm_helpers_test_cases[] = {
/* edid_extract_panel_id */
KUNIT_CASE(dm_test_edid_extract_panel_id_basic),
@@ -4189,6 +4235,8 @@ static struct kunit_case amdgpu_dm_helpers_test_cases[] = {
KUNIT_CASE(dm_test_submit_i2c_over_aux_unimplemented),
/* dm_helpers_allocate_gpu_mem / dm_helpers_free_gpu_mem */
KUNIT_CASE(dm_test_gpu_mem_alloc_and_free),
+ /* dm_helpers_dmub_set_config_sync */
+ KUNIT_CASE(dm_test_dmub_set_config_sync_unknown_error),
{}
};
--
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.