drm: selftest: convert drm_dp_mst_helper selftest to KUnit
authorMaíra Canal <maira.canal@usp.br>
Fri, 8 Jul 2022 20:30:49 +0000 (17:30 -0300)
committerJavier Martinez Canillas <javierm@redhat.com>
Mon, 11 Jul 2022 12:00:00 +0000 (14:00 +0200)
Considering the current adoption of the KUnit framework, convert the
DRM DP MST helper selftest to the KUnit API.

Co-developed-by: Rubens Gomes Neto <rubens.gomes.neto@usp.br>
Signed-off-by: Rubens Gomes Neto <rubens.gomes.neto@usp.br>
Tested-by: David Gow <davidgow@google.com>
Acked-by: Daniel Latypov <dlatypov@google.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Signed-off-by: Maíra Canal <maira.canal@usp.br>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220708203052.236290-7-maira.canal@usp.br
drivers/gpu/drm/selftests/Makefile
drivers/gpu/drm/selftests/drm_modeset_selftests.h
drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c [deleted file]
drivers/gpu/drm/selftests/test-drm_modeset_common.h
drivers/gpu/drm/tests/Makefile
drivers/gpu/drm/tests/drm_dp_mst_helper_test.c [new file with mode: 0644]

index 9e0ccb482841c59e830939f4077bc708070fde00..1539f55db9a78cd9c19089d3b9837b8535139af5 100644 (file)
@@ -1,6 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0-only
-test-drm_modeset-y := test-drm_modeset_common.o test-drm_framebuffer.o \
-                                       test-drm_dp_mst_helper.o
+test-drm_modeset-y := test-drm_modeset_common.o test-drm_framebuffer.o
 
 obj-$(CONFIG_DRM_DEBUG_SELFTEST) += test-drm_mm.o test-drm_modeset.o \
                                    test-drm_buddy.o
index 22e467f6465a82e446d0085727a8cf37b9f9321e..40a29b8cf386df1caffec012dd3ae6956429ceac 100644 (file)
@@ -7,5 +7,3 @@
  * Tests are executed in order by igt/drm_selftests_helper
  */
 selftest(check_drm_framebuffer_create, igt_check_drm_framebuffer_create)
-selftest(dp_mst_calc_pbn_mode, igt_dp_mst_calc_pbn_mode)
-selftest(dp_mst_sideband_msg_req_decode, igt_dp_mst_sideband_msg_req_decode)
diff --git a/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c b/drivers/gpu/drm/selftests/test-drm_dp_mst_helper.c
deleted file mode 100644 (file)
index 4caa9be..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Test cases for the DRM DP MST helpers
- */
-
-#define PREFIX_STR "[drm_dp_mst_helper]"
-
-#include <linux/random.h>
-
-#include <drm/display/drm_dp_mst_helper.h>
-#include <drm/drm_print.h>
-
-#include "../display/drm_dp_mst_topology_internal.h"
-#include "test-drm_modeset_common.h"
-
-int igt_dp_mst_calc_pbn_mode(void *ignored)
-{
-       int pbn, i;
-       const struct {
-               int rate;
-               int bpp;
-               int expected;
-               bool dsc;
-       } test_params[] = {
-               { 154000, 30, 689, false },
-               { 234000, 30, 1047, false },
-               { 297000, 24, 1063, false },
-               { 332880, 24, 50, true },
-               { 324540, 24, 49, true },
-       };
-
-       for (i = 0; i < ARRAY_SIZE(test_params); i++) {
-               pbn = drm_dp_calc_pbn_mode(test_params[i].rate,
-                                          test_params[i].bpp,
-                                          test_params[i].dsc);
-               FAIL(pbn != test_params[i].expected,
-                    "Expected PBN %d for clock %d bpp %d, got %d\n",
-                    test_params[i].expected, test_params[i].rate,
-                    test_params[i].bpp, pbn);
-       }
-
-       return 0;
-}
-
-static bool
-sideband_msg_req_equal(const struct drm_dp_sideband_msg_req_body *in,
-                      const struct drm_dp_sideband_msg_req_body *out)
-{
-       const struct drm_dp_remote_i2c_read_tx *txin, *txout;
-       int i;
-
-       if (in->req_type != out->req_type)
-               return false;
-
-       switch (in->req_type) {
-       /*
-        * Compare struct members manually for request types which can't be
-        * compared simply using memcmp(). This is because said request types
-        * contain pointers to other allocated structs
-        */
-       case DP_REMOTE_I2C_READ:
-#define IN in->u.i2c_read
-#define OUT out->u.i2c_read
-               if (IN.num_bytes_read != OUT.num_bytes_read ||
-                   IN.num_transactions != OUT.num_transactions ||
-                   IN.port_number != OUT.port_number ||
-                   IN.read_i2c_device_id != OUT.read_i2c_device_id)
-                       return false;
-
-               for (i = 0; i < IN.num_transactions; i++) {
-                       txin = &IN.transactions[i];
-                       txout = &OUT.transactions[i];
-
-                       if (txin->i2c_dev_id != txout->i2c_dev_id ||
-                           txin->no_stop_bit != txout->no_stop_bit ||
-                           txin->num_bytes != txout->num_bytes ||
-                           txin->i2c_transaction_delay !=
-                           txout->i2c_transaction_delay)
-                               return false;
-
-                       if (memcmp(txin->bytes, txout->bytes,
-                                  txin->num_bytes) != 0)
-                               return false;
-               }
-               break;
-#undef IN
-#undef OUT
-
-       case DP_REMOTE_DPCD_WRITE:
-#define IN in->u.dpcd_write
-#define OUT out->u.dpcd_write
-               if (IN.dpcd_address != OUT.dpcd_address ||
-                   IN.num_bytes != OUT.num_bytes ||
-                   IN.port_number != OUT.port_number)
-                       return false;
-
-               return memcmp(IN.bytes, OUT.bytes, IN.num_bytes) == 0;
-#undef IN
-#undef OUT
-
-       case DP_REMOTE_I2C_WRITE:
-#define IN in->u.i2c_write
-#define OUT out->u.i2c_write
-               if (IN.port_number != OUT.port_number ||
-                   IN.write_i2c_device_id != OUT.write_i2c_device_id ||
-                   IN.num_bytes != OUT.num_bytes)
-                       return false;
-
-               return memcmp(IN.bytes, OUT.bytes, IN.num_bytes) == 0;
-#undef IN
-#undef OUT
-
-       default:
-               return memcmp(in, out, sizeof(*in)) == 0;
-       }
-
-       return true;
-}
-
-static bool
-sideband_msg_req_encode_decode(struct drm_dp_sideband_msg_req_body *in)
-{
-       struct drm_dp_sideband_msg_req_body *out;
-       struct drm_printer p = drm_err_printer(PREFIX_STR);
-       struct drm_dp_sideband_msg_tx *txmsg;
-       int i, ret;
-       bool result = true;
-
-       out = kzalloc(sizeof(*out), GFP_KERNEL);
-       if (!out)
-               return false;
-
-       txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
-       if (!txmsg) {
-               kfree(out);
-               return false;
-       }
-
-       drm_dp_encode_sideband_req(in, txmsg);
-       ret = drm_dp_decode_sideband_req(txmsg, out);
-       if (ret < 0) {
-               drm_printf(&p, "Failed to decode sideband request: %d\n",
-                          ret);
-               result = false;
-               goto out;
-       }
-
-       if (!sideband_msg_req_equal(in, out)) {
-               drm_printf(&p, "Encode/decode failed, expected:\n");
-               drm_dp_dump_sideband_msg_req_body(in, 1, &p);
-               drm_printf(&p, "Got:\n");
-               drm_dp_dump_sideband_msg_req_body(out, 1, &p);
-               result = false;
-               goto out;
-       }
-
-       switch (in->req_type) {
-       case DP_REMOTE_DPCD_WRITE:
-               kfree(out->u.dpcd_write.bytes);
-               break;
-       case DP_REMOTE_I2C_READ:
-               for (i = 0; i < out->u.i2c_read.num_transactions; i++)
-                       kfree(out->u.i2c_read.transactions[i].bytes);
-               break;
-       case DP_REMOTE_I2C_WRITE:
-               kfree(out->u.i2c_write.bytes);
-               break;
-       }
-
-       /* Clear everything but the req_type for the input */
-       memset(&in->u, 0, sizeof(in->u));
-
-out:
-       kfree(out);
-       kfree(txmsg);
-       return result;
-}
-
-int igt_dp_mst_sideband_msg_req_decode(void *unused)
-{
-       struct drm_dp_sideband_msg_req_body in = { 0 };
-       u8 data[] = { 0xff, 0x0, 0xdd };
-       int i;
-
-#define DO_TEST() FAIL_ON(!sideband_msg_req_encode_decode(&in))
-
-       in.req_type = DP_ENUM_PATH_RESOURCES;
-       in.u.port_num.port_number = 5;
-       DO_TEST();
-
-       in.req_type = DP_POWER_UP_PHY;
-       in.u.port_num.port_number = 5;
-       DO_TEST();
-
-       in.req_type = DP_POWER_DOWN_PHY;
-       in.u.port_num.port_number = 5;
-       DO_TEST();
-
-       in.req_type = DP_ALLOCATE_PAYLOAD;
-       in.u.allocate_payload.number_sdp_streams = 3;
-       for (i = 0; i < in.u.allocate_payload.number_sdp_streams; i++)
-               in.u.allocate_payload.sdp_stream_sink[i] = i + 1;
-       DO_TEST();
-       in.u.allocate_payload.port_number = 0xf;
-       DO_TEST();
-       in.u.allocate_payload.vcpi = 0x7f;
-       DO_TEST();
-       in.u.allocate_payload.pbn = U16_MAX;
-       DO_TEST();
-
-       in.req_type = DP_QUERY_PAYLOAD;
-       in.u.query_payload.port_number = 0xf;
-       DO_TEST();
-       in.u.query_payload.vcpi = 0x7f;
-       DO_TEST();
-
-       in.req_type = DP_REMOTE_DPCD_READ;
-       in.u.dpcd_read.port_number = 0xf;
-       DO_TEST();
-       in.u.dpcd_read.dpcd_address = 0xfedcb;
-       DO_TEST();
-       in.u.dpcd_read.num_bytes = U8_MAX;
-       DO_TEST();
-
-       in.req_type = DP_REMOTE_DPCD_WRITE;
-       in.u.dpcd_write.port_number = 0xf;
-       DO_TEST();
-       in.u.dpcd_write.dpcd_address = 0xfedcb;
-       DO_TEST();
-       in.u.dpcd_write.num_bytes = ARRAY_SIZE(data);
-       in.u.dpcd_write.bytes = data;
-       DO_TEST();
-
-       in.req_type = DP_REMOTE_I2C_READ;
-       in.u.i2c_read.port_number = 0xf;
-       DO_TEST();
-       in.u.i2c_read.read_i2c_device_id = 0x7f;
-       DO_TEST();
-       in.u.i2c_read.num_transactions = 3;
-       in.u.i2c_read.num_bytes_read = ARRAY_SIZE(data) * 3;
-       for (i = 0; i < in.u.i2c_read.num_transactions; i++) {
-               in.u.i2c_read.transactions[i].bytes = data;
-               in.u.i2c_read.transactions[i].num_bytes = ARRAY_SIZE(data);
-               in.u.i2c_read.transactions[i].i2c_dev_id = 0x7f & ~i;
-               in.u.i2c_read.transactions[i].i2c_transaction_delay = 0xf & ~i;
-       }
-       DO_TEST();
-
-       in.req_type = DP_REMOTE_I2C_WRITE;
-       in.u.i2c_write.port_number = 0xf;
-       DO_TEST();
-       in.u.i2c_write.write_i2c_device_id = 0x7f;
-       DO_TEST();
-       in.u.i2c_write.num_bytes = ARRAY_SIZE(data);
-       in.u.i2c_write.bytes = data;
-       DO_TEST();
-
-       in.req_type = DP_QUERY_STREAM_ENC_STATUS;
-       in.u.enc_status.stream_id = 1;
-       DO_TEST();
-       get_random_bytes(in.u.enc_status.client_id,
-                        sizeof(in.u.enc_status.client_id));
-       DO_TEST();
-       in.u.enc_status.stream_event = 3;
-       DO_TEST();
-       in.u.enc_status.valid_stream_event = 0;
-       DO_TEST();
-       in.u.enc_status.stream_behavior = 3;
-       DO_TEST();
-       in.u.enc_status.valid_stream_behavior = 1;
-       DO_TEST();
-
-#undef DO_TEST
-       return 0;
-}
index 790f3cf31f0d900fc9e6e4a99776ab20f3625081..3feb2fea1a6b5bf908d252eece8eb3de44739457 100644 (file)
@@ -17,7 +17,5 @@
 #define FAIL_ON(x) FAIL((x), "%s", "FAIL_ON(" __stringify(x) ")\n")
 
 int igt_check_drm_framebuffer_create(void *ignored);
-int igt_dp_mst_calc_pbn_mode(void *ignored);
-int igt_dp_mst_sideband_msg_req_decode(void *ignored);
 
 #endif
index 4d44006a4f2376da4469a9dd40fc336bed3a42db..5ffacd3eacf36d3030f7a58bba86327b64546685 100644 (file)
@@ -1,4 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
 
 obj-$(CONFIG_DRM_KUNIT_TEST) += drm_format_helper_test.o drm_damage_helper_test.o \
-       drm_cmdline_parser_test.o drm_rect_test.o drm_format_test.o drm_plane_helper_test.o
+       drm_cmdline_parser_test.o drm_rect_test.o drm_format_test.o drm_plane_helper_test.o \
+       drm_dp_mst_helper_test.o
diff --git a/drivers/gpu/drm/tests/drm_dp_mst_helper_test.c b/drivers/gpu/drm/tests/drm_dp_mst_helper_test.c
new file mode 100644 (file)
index 0000000..1d2fade
--- /dev/null
@@ -0,0 +1,286 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Test cases for the DRM DP MST helpers
+ *
+ * Copyright (c) 2022 Maíra Canal <mairacanal@riseup.net>
+ */
+
+#define PREFIX_STR "[drm_dp_mst_helper]"
+
+#include <kunit/test.h>
+
+#include <linux/random.h>
+
+#include <drm/display/drm_dp_mst_helper.h>
+#include <drm/drm_print.h>
+
+#include "../display/drm_dp_mst_topology_internal.h"
+
+static void igt_dp_mst_calc_pbn_mode(struct kunit *test)
+{
+       int pbn, i;
+       const struct {
+               int rate;
+               int bpp;
+               int expected;
+               bool dsc;
+       } test_params[] = {
+               { 154000, 30, 689, false },
+               { 234000, 30, 1047, false },
+               { 297000, 24, 1063, false },
+               { 332880, 24, 50, true },
+               { 324540, 24, 49, true },
+       };
+
+       for (i = 0; i < ARRAY_SIZE(test_params); i++) {
+               pbn = drm_dp_calc_pbn_mode(test_params[i].rate,
+                                          test_params[i].bpp,
+                                          test_params[i].dsc);
+               KUNIT_EXPECT_EQ_MSG(test, pbn, test_params[i].expected,
+                                   "Expected PBN %d for clock %d bpp %d, got %d\n",
+                    test_params[i].expected, test_params[i].rate,
+                    test_params[i].bpp, pbn);
+       }
+}
+
+static bool
+sideband_msg_req_equal(const struct drm_dp_sideband_msg_req_body *in,
+                      const struct drm_dp_sideband_msg_req_body *out)
+{
+       const struct drm_dp_remote_i2c_read_tx *txin, *txout;
+       int i;
+
+       if (in->req_type != out->req_type)
+               return false;
+
+       switch (in->req_type) {
+       /*
+        * Compare struct members manually for request types which can't be
+        * compared simply using memcmp(). This is because said request types
+        * contain pointers to other allocated structs
+        */
+       case DP_REMOTE_I2C_READ:
+#define IN in->u.i2c_read
+#define OUT out->u.i2c_read
+               if (IN.num_bytes_read != OUT.num_bytes_read ||
+                   IN.num_transactions != OUT.num_transactions ||
+                   IN.port_number != OUT.port_number ||
+                   IN.read_i2c_device_id != OUT.read_i2c_device_id)
+                       return false;
+
+               for (i = 0; i < IN.num_transactions; i++) {
+                       txin = &IN.transactions[i];
+                       txout = &OUT.transactions[i];
+
+                       if (txin->i2c_dev_id != txout->i2c_dev_id ||
+                           txin->no_stop_bit != txout->no_stop_bit ||
+                           txin->num_bytes != txout->num_bytes ||
+                           txin->i2c_transaction_delay !=
+                           txout->i2c_transaction_delay)
+                               return false;
+
+                       if (memcmp(txin->bytes, txout->bytes,
+                                  txin->num_bytes) != 0)
+                               return false;
+               }
+               break;
+#undef IN
+#undef OUT
+
+       case DP_REMOTE_DPCD_WRITE:
+#define IN in->u.dpcd_write
+#define OUT out->u.dpcd_write
+               if (IN.dpcd_address != OUT.dpcd_address ||
+                   IN.num_bytes != OUT.num_bytes ||
+                   IN.port_number != OUT.port_number)
+                       return false;
+
+               return memcmp(IN.bytes, OUT.bytes, IN.num_bytes) == 0;
+#undef IN
+#undef OUT
+
+       case DP_REMOTE_I2C_WRITE:
+#define IN in->u.i2c_write
+#define OUT out->u.i2c_write
+               if (IN.port_number != OUT.port_number ||
+                   IN.write_i2c_device_id != OUT.write_i2c_device_id ||
+                   IN.num_bytes != OUT.num_bytes)
+                       return false;
+
+               return memcmp(IN.bytes, OUT.bytes, IN.num_bytes) == 0;
+#undef IN
+#undef OUT
+
+       default:
+               return memcmp(in, out, sizeof(*in)) == 0;
+       }
+
+       return true;
+}
+
+static bool
+sideband_msg_req_encode_decode(struct drm_dp_sideband_msg_req_body *in)
+{
+       struct drm_dp_sideband_msg_req_body *out;
+       struct drm_printer p = drm_err_printer(PREFIX_STR);
+       struct drm_dp_sideband_msg_tx *txmsg;
+       int i, ret;
+       bool result = true;
+
+       out = kzalloc(sizeof(*out), GFP_KERNEL);
+       if (!out)
+               return false;
+
+       txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
+       if (!txmsg) {
+               kfree(out);
+               return false;
+       }
+
+       drm_dp_encode_sideband_req(in, txmsg);
+       ret = drm_dp_decode_sideband_req(txmsg, out);
+       if (ret < 0) {
+               drm_printf(&p, "Failed to decode sideband request: %d\n",
+                          ret);
+               result = false;
+               goto out;
+       }
+
+       if (!sideband_msg_req_equal(in, out)) {
+               drm_printf(&p, "Encode/decode failed, expected:\n");
+               drm_dp_dump_sideband_msg_req_body(in, 1, &p);
+               drm_printf(&p, "Got:\n");
+               drm_dp_dump_sideband_msg_req_body(out, 1, &p);
+               result = false;
+               goto out;
+       }
+
+       switch (in->req_type) {
+       case DP_REMOTE_DPCD_WRITE:
+               kfree(out->u.dpcd_write.bytes);
+               break;
+       case DP_REMOTE_I2C_READ:
+               for (i = 0; i < out->u.i2c_read.num_transactions; i++)
+                       kfree(out->u.i2c_read.transactions[i].bytes);
+               break;
+       case DP_REMOTE_I2C_WRITE:
+               kfree(out->u.i2c_write.bytes);
+               break;
+       }
+
+       /* Clear everything but the req_type for the input */
+       memset(&in->u, 0, sizeof(in->u));
+
+out:
+       kfree(out);
+       kfree(txmsg);
+       return result;
+}
+
+static void igt_dp_mst_sideband_msg_req_decode(struct kunit *test)
+{
+       struct drm_dp_sideband_msg_req_body in = { 0 };
+       u8 data[] = { 0xff, 0x0, 0xdd };
+       int i;
+
+       in.req_type = DP_ENUM_PATH_RESOURCES;
+       in.u.port_num.port_number = 5;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+
+       in.req_type = DP_POWER_UP_PHY;
+       in.u.port_num.port_number = 5;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+
+       in.req_type = DP_POWER_DOWN_PHY;
+       in.u.port_num.port_number = 5;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+
+       in.req_type = DP_ALLOCATE_PAYLOAD;
+       in.u.allocate_payload.number_sdp_streams = 3;
+       for (i = 0; i < in.u.allocate_payload.number_sdp_streams; i++)
+               in.u.allocate_payload.sdp_stream_sink[i] = i + 1;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.allocate_payload.port_number = 0xf;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.allocate_payload.vcpi = 0x7f;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.allocate_payload.pbn = U16_MAX;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+
+       in.req_type = DP_QUERY_PAYLOAD;
+       in.u.query_payload.port_number = 0xf;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.query_payload.vcpi = 0x7f;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+
+       in.req_type = DP_REMOTE_DPCD_READ;
+       in.u.dpcd_read.port_number = 0xf;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.dpcd_read.dpcd_address = 0xfedcb;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.dpcd_read.num_bytes = U8_MAX;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+
+       in.req_type = DP_REMOTE_DPCD_WRITE;
+       in.u.dpcd_write.port_number = 0xf;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.dpcd_write.dpcd_address = 0xfedcb;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.dpcd_write.num_bytes = ARRAY_SIZE(data);
+       in.u.dpcd_write.bytes = data;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+
+       in.req_type = DP_REMOTE_I2C_READ;
+       in.u.i2c_read.port_number = 0xf;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.i2c_read.read_i2c_device_id = 0x7f;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.i2c_read.num_transactions = 3;
+       in.u.i2c_read.num_bytes_read = ARRAY_SIZE(data) * 3;
+       for (i = 0; i < in.u.i2c_read.num_transactions; i++) {
+               in.u.i2c_read.transactions[i].bytes = data;
+               in.u.i2c_read.transactions[i].num_bytes = ARRAY_SIZE(data);
+               in.u.i2c_read.transactions[i].i2c_dev_id = 0x7f & ~i;
+               in.u.i2c_read.transactions[i].i2c_transaction_delay = 0xf & ~i;
+       }
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+
+       in.req_type = DP_REMOTE_I2C_WRITE;
+       in.u.i2c_write.port_number = 0xf;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.i2c_write.write_i2c_device_id = 0x7f;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.i2c_write.num_bytes = ARRAY_SIZE(data);
+       in.u.i2c_write.bytes = data;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+
+       in.req_type = DP_QUERY_STREAM_ENC_STATUS;
+       in.u.enc_status.stream_id = 1;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       get_random_bytes(in.u.enc_status.client_id,
+                        sizeof(in.u.enc_status.client_id));
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.enc_status.stream_event = 3;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.enc_status.valid_stream_event = 0;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.enc_status.stream_behavior = 3;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+       in.u.enc_status.valid_stream_behavior = 1;
+       KUNIT_EXPECT_TRUE(test, sideband_msg_req_encode_decode(&in));
+}
+
+static struct kunit_case drm_dp_mst_helper_tests[] = {
+       KUNIT_CASE(igt_dp_mst_calc_pbn_mode),
+       KUNIT_CASE(igt_dp_mst_sideband_msg_req_decode),
+       { }
+};
+
+static struct kunit_suite drm_dp_mst_helper_test_suite = {
+       .name = "drm_dp_mst_helper",
+       .test_cases = drm_dp_mst_helper_tests,
+};
+
+kunit_test_suite(drm_dp_mst_helper_test_suite);
+
+MODULE_LICENSE("GPL");