From: "Naladala, Ramanaidu" <Ramanaidu.naladala@intel.com>
To: <igt-dev@lists.freedesktop.org>
Subject: Re: [PATCH i-g-t v9 31/49] tests/unigraf: Add basic unigraf tests
Date: Wed, 25 Mar 2026 00:55:40 +0530 [thread overview]
Message-ID: <9a265197-b657-4e5b-a9e6-049d66fc6f74@intel.com> (raw)
In-Reply-To: <20260316-unigraf-integration-v9-31-a01dffc3b0cb@bootlin.com>
[-- Attachment #1: Type: text/plain, Size: 10435 bytes --]
Hi Louis,
On 3/16/2026 9:47 PM, Louis Chauvet wrote:
> Adds two tests to validate unigraf communication.
>
> unigraf-connect checks if the device is connected and if the EDID is
> properly applied.
>
> ungiraf-reconnect checks if the device can be connected/reconnected
> using SST and MST configurations.
>
> Signed-off-by: Louis Chauvet<louis.chauvet@bootlin.com>
> ---
> tests/meson.build | 4 +
> tests/unigraf/meson.build | 12 +++
> tests/unigraf/unigraf_connectivity.c | 138 +++++++++++++++++++++++++++++++++++
> 3 files changed, 154 insertions(+)
>
> diff --git a/tests/meson.build b/tests/meson.build
> index cecb4a8ae34a..4d3399d0eff4 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -475,6 +475,10 @@ foreach prog : intel_progs
> endif
> endforeach
>
> +if libtsi.found()
> + subdir('unigraf')
> +endif
> +
> if chamelium.found()
> foreach prog : chamelium_progs
> testexe = executable(prog,
> diff --git a/tests/unigraf/meson.build b/tests/unigraf/meson.build
> new file mode 100644
> index 000000000000..4ef8c32151e4
> --- /dev/null
> +++ b/tests/unigraf/meson.build
> @@ -0,0 +1,12 @@
> +unigraf_progs = [
> + 'unigraf_connectivity',
> +]
> +
> +foreach prog : unigraf_progs
> + test_executables += executable(prog, prog + '.c',
> + dependencies : test_deps,
> + install_dir : unigrafdir,
> + install_rpath : unigraf_rpathdir,
> + install : true)
> + test_list += join_paths('unigraf', prog)
> +endforeach
> diff --git a/tests/unigraf/unigraf_connectivity.c b/tests/unigraf/unigraf_connectivity.c
> new file mode 100644
> index 000000000000..b35149a4de9a
> --- /dev/null
> +++ b/tests/unigraf/unigraf_connectivity.c
> @@ -0,0 +1,138 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2026 Google
> + *
> + * Authors:
> + * Louis Chauvet<louis.chauvet@bootlin.com>
> + */
> +
> +#include <stdint.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <xf86drmMode.h>
> +
> +#include "drmtest.h"
> +#include "igt_aux.h"
> +#include "igt_core.h"
> +#include "igt_kms.h"
> +#include "unigraf/unigraf.h"
> +
> +/**
> + * TEST: unigraf connectivity
> + * Category: Core
> + * Description: Testing connectivity with a unigraf device
> + *
> + * SUBTEST: unigraf-connect-edid
> + * Description: Verify that the unigraf device is properly connected to the DUT
> + * and that the correct EDID is detected and read.
> + *
> + * SUBTEST: unigraf-connect-mst
> + * Description: Ensure that the DUT can correctly detect and handle the unigraf device
> + * when it is configured to operate in MST mode.
> + */
> +
> +IGT_TEST_DESCRIPTION("Test basic unigraf connectivity");
> +int igt_main()
> +{
> + int drm_fd;
> +
> + igt_fixture() {
> + drm_fd = drm_open_driver_master(DRIVER_ANY);
> + }
> +
> + igt_describe("Make sure that the unigraf device is connected to the DUT and EDID is properly detected");
> + igt_subtest("unigraf-connect-edid") {
> + drmModePropertyBlobPtr edid_blob = NULL;
> + struct igt_display display;
> + uint64_t edid_blob_id;
> + igt_output_t *output;
> + uint32_t unigraf_edid_len;
> + void *unigraf_edid;
> + bool found = false;
> +
> + /*
> + * Sleep are required to allow hardware to configure/detect the current
> + * configuration
> + */
> + unigraf_require_device(drm_fd);
I think delays side need to check again. If i ran subtest alone observed
new connector timeouts.
Starting subtest: unigraf-connect-mst
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:(nil): Initialize
unigraf...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:(nil): No
connector name configured, will autodetect.
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:(nil): MST usage
not configured, using SST.
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:(nil): Detected
unigraf device 0: UCD-500 [2607C673]
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Successfully opened the unigraf device 0.
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Role 0: DisplayPort Source and Sink
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Role 1: DisplayPort Source and USB-C, DP Alt Mode Sink
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Role 2: DisplayPort Sink and USB-C, DP Alt Mode Source
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Role 3: USB-C, DP Alt Mode Source and Sink
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Input 0: USB-C RX
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_FORCE_HOT_PLUG_STATE_W=0...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_DPRX_LINK_FLAGS=86...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_FORCE_HOT_PLUG_STATE_W=1...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_DPRX_LINK_FLAGS=86...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_FORCE_HOT_PLUG_STATE_W=0...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_FORCE_HOT_PLUG_STATE_W=1...
*(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
No newly connected connector, assuming that the unigraf is not connected.*
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_DPRX_HPD_FORCE=12...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_DPRX_MST_SINK_COUNT=1...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value read: TSI_DPRX_MST_SINK_COUNT=1
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_DPRX_LINK_FLAGS=86...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Write EDID for stream 3...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_EDID_SELECT_STREAM=3...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Writing 2048 bytes to 0x1100
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Write EDID for stream 2...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_EDID_SELECT_STREAM=2...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Writing 2048 bytes to 0x1100
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Write EDID for stream 1...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_EDID_SELECT_STREAM=1...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Writing 2048 bytes to 0x1100
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Write EDID for stream 0...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_EDID_SELECT_STREAM=0...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Writing 2048 bytes to 0x1100
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_FORCE_HOT_PLUG_STATE_W=1...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_DPRX_MAX_LANES=4...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_DPRX_MAX_LINK_RATE=30...
(unigraf_connectivity:7675) unigraf/unigraf-DEBUG: TSI:0x630f991906c0:
Value write: TSI_DPRX_LINK_FLAGS=86...
Test requirement not met in function unigraf_require_device, file
../lib/unigraf/unigraf.c:534:
Test requirement: unigraf_open_device(drm_fd)
> + unigraf_hpd_deassert();
> + sleep(igt_default_display_detect_timeout());
> + unigraf_set_sst();
> + unigraf_hpd_assert();
> + sleep(igt_default_display_detect_timeout());
> + igt_display_require(&display, drm_fd);
> + sleep(igt_default_display_detect_timeout());
> +
> + unigraf_edid = unigraf_read_edid(0, &unigraf_edid_len);
> +
> + for_each_connected_output(&display, output) {
> + if (output->config.connector->connector_type ==
> + DRM_MODE_CONNECTOR_DisplayPort) {
> + igt_assert(kmstest_get_property(drm_fd,
> + output->config.connector->connector_id,
> + DRM_MODE_OBJECT_CONNECTOR, "EDID",
> + NULL, &edid_blob_id, NULL));
> + edid_blob = drmModeGetPropertyBlob(drm_fd, edid_blob_id);
> + if (!edid_blob)
> + continue;
> +
> + if (!memcmp(unigraf_edid, edid_blob->data,
> + min(edid_blob->length, unigraf_edid_len)))
> + found = true;
> +
> + drmModeFreePropertyBlob(edid_blob);
> +
> + if (found)
> + break;
> + }
> + }
> + igt_assert_f(found, "No output with the correct EDID was found\n");
> +
> + free(unigraf_edid);
> + }
> +
> + igt_describe("Make sure that the unigraf device can be used as a MST device");
> + igt_subtest("unigraf-connect-mst") {
> + int newly_connected_count, already_connected_count, diff_len;
> + uint32_t *newly_connected = NULL, *already_connected = NULL, *diff = NULL;
> + int max_count;
> +
> + unigraf_require_device(drm_fd);
> + max_count = unigraf_get_mst_stream_max_count();
> +
> + unigraf_hpd_deassert();
> +
> + already_connected_count = igt_get_connected_connectors(drm_fd, &already_connected);
> +
> + igt_debug("Already connected count: %d\n", already_connected_count);
> +
> + // i = 0 is SST so we need to process max_count + 1 streams
> + for (int i = 0; i <= max_count; i++) {
> + unigraf_hpd_deassert();
> + // Let the hardware detect the new state
> + sleep(igt_default_display_detect_timeout());
> +
> + unigraf_set_mst_stream_count(max(i, 1));
> + if (!i)
> + unigraf_set_sst();
> + else
> + unigraf_set_mst();
> +
> + unigraf_hpd_assert();
> + // Let the hardware detect the new state
> + sleep(igt_default_display_detect_timeout());
> +
> + newly_connected_count = kms_wait_for_new_connectors(&newly_connected,
> + already_connected,
> + already_connected_count,
> + drm_fd);
> +
> + diff_len = get_array_diff(newly_connected, newly_connected_count,
> + already_connected, already_connected_count, &diff);
> +
> + igt_assert_f(diff_len == max(i, 1),
> + "Invalid connected connector count, expected %d found %d\n",
> + max(i, 1), diff_len);
> + }
> + }
> +}
>
[-- Attachment #2: Type: text/html, Size: 11586 bytes --]
next prev parent reply other threads:[~2026-03-24 19:25 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-16 16:17 [PATCH i-g-t v9 00/49] Unigraf integration Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 01/49] lib/igt_kms: Add a detect timeout value Louis Chauvet
2026-03-16 18:50 ` Kamil Konieczny
2026-03-16 16:17 ` [PATCH i-g-t v9 02/49] lib/igt_kms: Add helper to wait for a specific status on a connector Louis Chauvet
2026-03-24 10:22 ` Kamil Konieczny
2026-03-16 16:17 ` [PATCH i-g-t v9 03/49] lib/igt_kms: Add function to list connected connectors Louis Chauvet
2026-03-24 10:34 ` Kamil Konieczny
2026-03-24 13:56 ` Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 04/49] lib/igt_kms: Add helper to obtain a connector by its name or MST path Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 05/49] lib/igt_kms: Add helper to wait for new connectors Louis Chauvet
2026-03-17 14:56 ` Kory Maincent
2026-03-23 14:40 ` Louis Chauvet
2026-03-24 10:11 ` Kamil Konieczny
2026-03-16 16:17 ` [PATCH i-g-t v9 06/49] lib/tests: Add tests for array manipulations Louis Chauvet
2026-03-17 15:00 ` Kory Maincent
2026-03-16 16:17 ` [PATCH i-g-t v9 07/49] lib/igt_kms: Add helper to get a pipe from a connector Louis Chauvet
2026-03-24 7:58 ` Jani Nikula
2026-03-24 10:02 ` Kamil Konieczny
2026-03-16 16:17 ` [PATCH i-g-t v9 08/49] lib/igt_kms: Expose dump_connector_attrs Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 09/49] lib/igt_kms: Expose reset_connectors_at_exit Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 10/49] lib/igt_kms: Expose connector_attr_set and igt_connector_attr_set Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 11/49] lib/igt_debugfs: Move debugfs helpers to the proper location Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 12/49] lib/igt_debugfs: Add const when make sense Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 13/49] lib/igt_amd: " Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 14/49] lib/igt_kms: " Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 15/49] lib/monitor_edids: Add helper functions for using monitor_edid objects Louis Chauvet
2026-03-17 15:09 ` Kory Maincent
2026-03-24 10:15 ` Kamil Konieczny
2026-03-24 14:09 ` Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 16/49] lib/monitor_edids: Add helper to get an EDID by its name Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 17/49] lib/monitor_edids: Add helper to print all available EDID names Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 18/49] lib/unigraf: Add used defines for TSI_Types Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 19/49] lib/unigraf: Add TSI.h Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 20/49] lib/unigraf: Initial Unigraf support Louis Chauvet
2026-03-24 8:19 ` Naladala, Ramanaidu
2026-03-24 9:37 ` Louis Chauvet
2026-03-26 9:59 ` Louis Chauvet
2026-03-24 9:58 ` Kamil Konieczny
2026-03-16 16:17 ` [PATCH i-g-t v9 21/49] lib/igt_kms: Automatically connect unigraf on display require Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 22/49] lib/unigraf: Introduce device configuration Louis Chauvet
2026-03-17 15:16 ` Kory Maincent
2026-03-16 16:17 ` [PATCH i-g-t v9 23/49] lib/unigraf: Introduce role configuration Louis Chauvet
2026-03-17 15:19 ` Kory Maincent
2026-03-16 16:17 ` [PATCH i-g-t v9 24/49] lib/unigraf: Introduce input configuration Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 25/49] lib/unigraf: Add reset function Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 26/49] lib/unigraf: Add unigraf assert and deassert helpers Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 27/49] lib/unigraf: Add plug/unplug helpers Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 28/49] lib/unigraf: Allows sst/mst configuration Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 29/49] lib/unigraf: Add helpers to read and write edid Louis Chauvet
2026-03-17 15:32 ` Kory Maincent
2026-03-23 14:46 ` Louis Chauvet
2026-03-23 16:26 ` Kamil Konieczny
2026-03-23 17:34 ` Louis Chauvet
2026-03-24 9:35 ` Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 30/49] lib/unigraf: Add connector and EDID configuration Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 31/49] tests/unigraf: Add basic unigraf tests Louis Chauvet
2026-03-17 15:46 ` Kory Maincent
2026-03-23 14:49 ` Louis Chauvet
2026-03-24 19:25 ` Naladala, Ramanaidu [this message]
2026-03-16 16:17 ` [PATCH i-g-t v9 32/49] lib/unigraf: Add unigraf CRC capture Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 33/49] lib/unigraf: Add configuration for CRC usage Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 34/49] lib/unigraf: add unigraf_get_connector_by_stream Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 35/49] lib/unigraf: Add helper to check timings received by unigraf Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 36/49] lib/igt_pipe_crc: Add unigraf crc calculation Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 37/49] lib/i915/dp: Move DP-related function for i915 to proper folder Louis Chauvet
2026-03-16 16:17 ` [PATCH i-g-t v9 38/49] lib/i915/dp: Rename functions to avoid confusion Louis Chauvet
2026-03-16 16:18 ` [PATCH i-g-t v9 39/49] lib/i915/dp: Add helper to get maximum supported rate Louis Chauvet
2026-03-16 16:18 ` [PATCH i-g-t v9 40/49] lib/i915/dp: Properly check sscanf results Louis Chauvet
2026-03-16 16:18 ` [PATCH i-g-t v9 41/49] lib/i915/dp: Use igt_output_name instead of private field Louis Chauvet
2026-03-16 16:18 ` [PATCH i-g-t v9 42/49] lib/igt_dp: Create generic helpers for DP information Louis Chauvet
2026-03-17 15:55 ` Kory Maincent
2026-03-23 14:52 ` Louis Chauvet
2026-03-16 16:18 ` [PATCH i-g-t v9 43/49] lib/igt_kms: Add asserts to avoid null pointer dereference Louis Chauvet
2026-03-16 16:18 ` [PATCH i-g-t v9 44/49] lib/igt_kms: Add helper to get a CRTC from an output Louis Chauvet
2026-03-17 15:56 ` Kory Maincent
2026-03-16 16:18 ` [PATCH i-g-t v9 45/49] lib/unigraf: Add lane count configuration Louis Chauvet
2026-03-16 16:18 ` [PATCH i-g-t v9 46/49] docs/unigraf: Add unigraf documentation Louis Chauvet
2026-03-17 15:58 ` Kory Maincent
2026-03-24 8:07 ` Naladala, Ramanaidu
2026-03-16 16:18 ` [PATCH i-g-t v9 47/49] lib/unigraf: Add helpers to set maximum link rate Louis Chauvet
2026-03-16 16:18 ` [PATCH i-g-t v9 48/49] lib/unigraf: Add helpers to get the current LT status Louis Chauvet
2026-03-16 16:18 ` [PATCH i-g-t v9 49/49] tests/unigraf/unigraf_lt: Add test for link training Louis Chauvet
2026-03-17 12:02 ` ✗ Fi.CI.BUILD: failure for Unigraf integration (rev8) Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9a265197-b657-4e5b-a9e6-049d66fc6f74@intel.com \
--to=ramanaidu.naladala@intel.com \
--cc=igt-dev@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.