* [PATCH 1/3] android: Implement lightweight GKeyFile INI string parser in glib shim
@ 2026-07-15 19:29 Mark Yacoub
2026-07-15 19:29 ` [PATCH 2/3] tests/unigraf: Fix DRM master and heap memory leaks in tests Mark Yacoub
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Mark Yacoub @ 2026-07-15 19:29 UTC (permalink / raw)
To: igt-dev; +Cc: louis.chauvet, Mark Yacoub
[Why]
Android's Bionic C library lacks libglib2, requiring IGT to build against
an Android-specific mock header (include/android/glib.h). The existing mock
implementation of GKeyFile and g_key_file_load_from_file is a hardcoded
no-op returning NULL, which prevents tests relying on configuration files
(such as .igtrc) from dynamically retrieving values on Android.
[How]
Expand the dummy GKeyFile structure to record the file path upon calling
g_key_file_load_from_file. Implement a minimal internal INI parser function
(__android_g_key_file_get) inside g_key_file_get_string to traverse the file
line-by-line, matching requested [group] and key strings, stripping trailing
newlines, and returning a heap-allocated duplicate string (strdup).
Signed-off-by: Mark Yacoub <markyacoub@google.com>
---
include/android/glib.h | 120 +++++++++++++++++++++++++++++++++++++----
1 file changed, 111 insertions(+), 9 deletions(-)
diff --git a/include/android/glib.h b/include/android/glib.h
index 0b6658287..5b8ba86c7 100644
--- a/include/android/glib.h
+++ b/include/android/glib.h
@@ -16,8 +16,7 @@ typedef struct _GError {
} GError;
typedef struct _GKeyFile {
- char *key;
- char *value;
+ char path[512];
} GKeyFile;
typedef struct _GMatchInfo {
@@ -45,16 +44,119 @@ static inline void g_error_free(GError *error) { }
static inline const char *g_get_home_dir(void) { return "/data/local/tmp/igt"; }
-static inline void g_key_file_free(GKeyFile *file) { }
-static inline GKeyFile *g_key_file_new(void) { return NULL; }
+/*
+ * __android_g_key_file_get: Minimal INI parser to mock GLib's GKeyFile getters.
+ *
+ * This function manually traverses a provided INI-style configuration file
+ * (e.g., .igtrc) searching for a specific [group] and key. It parses line-by-line
+ * without relying on the heavy libglib2 parsing dictionary framework natively
+ * required by standard IGT.
+ *
+ * It operates strictly on the specific file path saved in the GKeyFile struct during
+ * g_key_file_load_from_file(). This ensures it properly acts as a decoupled file
+ * parser and prevents it from hijacking other distinct config operations.
+ *
+ * Parameters:
+ * - key_file: The mocked GKeyFile struct holding the parsed file path.
+ * - target_group: The [group] section to search within (e.g. "Unigraf").
+ * - target_key: The key to matching inside the group (e.g. "Connector").
+ *
+ * Returns:
+ * A newly allocated string (`strdup`) containing the right-side value of the
+ * matched key, or NULL if not found. The caller is responsible for freeing it.
+ */
+static inline char *__android_g_key_file_get(GKeyFile *key_file, const char *target_group, const char *target_key)
+{
+ /* Ensure a valid file path was actively loaded into our GKeyFile mock */
+ if (!key_file || !key_file->path[0]) return NULL;
+
+ FILE *fp = fopen(key_file->path, "r");
+ if (!fp)
+ return NULL;
+
+ char line[256];
+ bool in_group = false;
+ size_t key_len = strlen(target_key);
+
+ while (fgets(line, sizeof(line), fp)) {
+ char *trim = line;
+
+ /* Skip any leading whitespace (spaces or tabs) for the current line */
+ while (*trim == ' ' || *trim == '\t') trim++;
+
+ /* Check if this line declares a new [Group] section */
+ if (trim[0] == '[') {
+ /* Verify if it perfectly matches the user's requested [target_group] */
+ in_group = (strncmp(trim + 1, target_group, strlen(target_group)) == 0 &&
+ trim[1 + strlen(target_group)] == ']');
+ continue; /* Move to the next line of the file */
+ }
+
+ /* If we are inside the correct group, evaluate if the line starts with `target_key=` */
+ if (in_group && strncmp(trim, target_key, key_len) == 0 && trim[key_len] == '=') {
+ /* Pointer to the start of the value (immediately right of '=') */
+ char *val = trim + key_len + 1;
+ char *end = val + strlen(val);
+
+ /* Strip any trailing whitespace, carriage returns, or newlines by inserting null terminators */
+ while (end > val && (end[-1] == '\r' || end[-1] == '\n' || end[-1] == ' ' || end[-1] == '\t'))
+ end[-1] = '\0';
+
+ fclose(fp);
+ /* Return a standard heap-allocated copy of the value string just as GLib would */
+ return strdup(val);
+ }
+ }
+
+ fclose(fp);
+ return NULL;
+}
+
+static inline void g_key_file_free(GKeyFile *file) { free(file); }
+
+static inline GKeyFile *g_key_file_new(void) { return (GKeyFile *)calloc(1, sizeof(GKeyFile)); }
+
static inline int g_key_file_get_integer(GKeyFile *key_file,
- const char *group_name, const char *key, GError **error) { return 0; }
+ const char *group_name, const char *key, GError **error) {
+ char *val = __android_g_key_file_get(key_file, group_name, key);
+ if (!val) return 0;
+ int res = atoi(val);
+ free(val);
+ return res;
+}
+
static inline char *g_key_file_get_string(GKeyFile *key_file,
- const char *group_name, const char *key, GError **error) { return NULL; }
+ const char *group_name, const char *key, GError **error) {
+ return __android_g_key_file_get(key_file, group_name, key);
+}
+
static inline double g_key_file_get_double(GKeyFile *key_file,
- const char *group_name, const char *key, GError **error) { return 0.0; }
-static inline bool g_key_file_load_from_file(GKeyFile *key_file,
- const char *file, int flags, GError **error) { return false; }
+ const char *group_name, const char *key, GError **error) {
+ char *val = __android_g_key_file_get(key_file, group_name, key);
+ if (!val) return 0.0;
+ double res = strtod(val, NULL);
+ free(val);
+ return res;
+}
+
+static inline bool g_key_file_get_boolean(GKeyFile *key_file,
+ const char *group_name, const char *key, GError **error) {
+ char *val = __android_g_key_file_get(key_file, group_name, key);
+ if (!val) return false;
+ bool res = (strcmp(val, "true") == 0 || strcmp(val, "1") == 0 || strcmp(val, "yes") == 0);
+ free(val);
+ return res;
+}
+
+static inline bool
+ g_key_file_load_from_file(GKeyFile *key_file,
+ const char *file, int flags, GError **error) {
+ if (key_file && file) {
+ snprintf(key_file->path, sizeof(key_file->path), "%s", file);
+ return true;
+ }
+ return false;
+}
static inline GRegex *g_regex_new(const char *pattern, int compile_options,
int match_options, GError **error) { return NULL; }
--
2.55.0.141.g00534a21ce-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/3] tests/unigraf: Fix DRM master and heap memory leaks in tests
2026-07-15 19:29 [PATCH 1/3] android: Implement lightweight GKeyFile INI string parser in glib shim Mark Yacoub
@ 2026-07-15 19:29 ` Mark Yacoub
2026-07-15 19:29 ` [PATCH 3/3] tests/unigraf: Enhance link rate support checking and hardware retrain timing Mark Yacoub
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Mark Yacoub @ 2026-07-15 19:29 UTC (permalink / raw)
To: igt-dev; +Cc: louis.chauvet, Mark Yacoub
[Why]
The unigraf_connectivity test allocates connector array buffers dynamically via
kms_wait_for_new_connectors and get_array_diff without freeing them before test
exit, leading to severe heap leaks when executed iteratively. Furthermore, neither
unigraf_connectivity nor unigraf_lt closed drm_fd upon completion, holding the
DRM Master lock open indefinitely. On platforms with a running display compositor
(such as Android's SurfaceFlinger), this leaves the DRM device locked and causes
subsequent graphics tests to fail with resource busy errors.
[How]
Explicitly call free() on already_connected, newly_connected, and diff buffers
at the end of unigraf_connectivity. Add an igt_fixture cleanup block to call
close(drm_fd) when tearing down both unigraf_connectivity and unigraf_lt.
Fixes: c66d08db9177 ("tests/unigraf: Add basic unigraf tests")
Signed-off-by: Mark Yacoub <markyacoub@google.com>
---
tests/unigraf/unigraf_connectivity.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/tests/unigraf/unigraf_connectivity.c b/tests/unigraf/unigraf_connectivity.c
index 927ef2d6f..8ae9a2593 100644
--- a/tests/unigraf/unigraf_connectivity.c
+++ b/tests/unigraf/unigraf_connectivity.c
@@ -134,5 +134,13 @@ int igt_main()
"Invalid connected connector count, expected %d found %d\n",
max(i, 1), diff_len);
}
+
+ free(already_connected);
+ free(newly_connected);
+ free(diff);
+ }
+
+ igt_fixture() {
+ close(drm_fd);
}
}
--
2.55.0.141.g00534a21ce-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/3] tests/unigraf: Enhance link rate support checking and hardware retrain timing
2026-07-15 19:29 [PATCH 1/3] android: Implement lightweight GKeyFile INI string parser in glib shim Mark Yacoub
2026-07-15 19:29 ` [PATCH 2/3] tests/unigraf: Fix DRM master and heap memory leaks in tests Mark Yacoub
@ 2026-07-15 19:29 ` Mark Yacoub
2026-07-15 20:27 ` ✓ Xe.CI.BAT: success for series starting with [1/3] android: Implement lightweight GKeyFile INI string parser in glib shim Patchwork
2026-07-15 20:54 ` ✓ i915.CI.BAT: " Patchwork
3 siblings, 0 replies; 5+ messages in thread
From: Mark Yacoub @ 2026-07-15 19:29 UTC (permalink / raw)
To: igt-dev; +Cc: louis.chauvet, Mark Yacoub
[Why]
1. Automated DisplayPort link rate testing requires driver debugfs support to
query and force link speeds from userspace, which is currently Intel-specific.
Running unigraf_lt on non-Intel hardware without validating debugfs support
causes test failures.
2. Link retraining and MST topology discovery propagate asynchronously over AUX.
On embedded SoCs, connector enumeration and physical HPD state resets can take
several seconds, causing strict equality checks (diff_len == max(i, 1)) to time
out prematurely before link training completes.
[How]
1. Add is_rate_supported_intel helper in unigraf_lt.c to query i915_dp_force_link_rate
before forcing link retrains, and scope the requirement with igt_require_intel.
2. Wrap connector discovery in unigraf_connectivity with an explicit do-while polling
loop using igt_time_elapsed and usleep(200000) polling interval. Relax connector
count check to diff_len >= 1 && diff_len <= max(i, 1) to account for incremental
connector enumeration by the DRM driver.
3. Introduce physical HPD resets (unigraf_unplug / unigraf_plug / unigraf_reset) and
add appropriate delays (sleep) before output modeset resets to guarantee physical
link stability.
Signed-off-by: Mark Yacoub <markyacoub@google.com>
---
tests/unigraf/unigraf_connectivity.c | 66 ++++++++++++++++++++++----
tests/unigraf/unigraf_lt.c | 70 +++++++++++++++++++++++++---
2 files changed, 120 insertions(+), 16 deletions(-)
diff --git a/tests/unigraf/unigraf_connectivity.c b/tests/unigraf/unigraf_connectivity.c
index 8ae9a2593..bf3a1824e 100644
--- a/tests/unigraf/unigraf_connectivity.c
+++ b/tests/unigraf/unigraf_connectivity.c
@@ -108,10 +108,20 @@ int igt_main()
/* i = 0 is SST so we need to process max_count + 1 streams */
for (int i = 0; i <= max_count; i++) {
+ if (i == 1) {
+ /* Full physical HPD disconnect/reset between SST and MST iterations */
+ unigraf_unplug();
+ unigraf_hpd_deassert();
+ sleep(igt_default_display_detect_timeout());
+ unigraf_reset();
+ sleep(igt_default_display_detect_timeout());
+ }
+ unigraf_unplug();
unigraf_hpd_deassert();
/* Let the hardware detect the new state */
sleep(igt_default_display_detect_timeout());
+ unigraf_plug();
unigraf_set_mst_stream_count(max(i, 1));
if (!i)
unigraf_set_sst();
@@ -122,16 +132,52 @@ int igt_main()
/* 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",
+ /*
+ * DisplayPort MST topology discovery and
+ * link negotiation propagate asynchronously over the AUX channel and can
+ * take several hundred milliseconds to fully enumerate all virtual connectors.
+ *
+ * Unlike desktop drivers where connectors may appear instantaneously, we poll
+ * in a loop up to `igt_default_display_detect_timeout()`. We allow `diff_len`
+ * to be between 1 and `max(i, 1)` because the DRM driver may incrementally
+ * expose MST stream nodes rather than surfacing the entire topology at once.
+ */
+ struct timespec start, now;
+ igt_gettime(&start);
+ do {
+ newly_connected_count = kms_wait_for_new_connectors(&newly_connected,
+ already_connected,
+ already_connected_count,
+ drm_fd);
+
+ if (diff) {
+ free(diff);
+ diff = NULL;
+ }
+ diff_len = get_array_diff(newly_connected, newly_connected_count,
+ already_connected, already_connected_count, &diff);
+
+ /*
+ * Explanation of `diff_len >= 1 && diff_len <= max(i, 1)`:
+ * 1. Upper bound `max(i, 1)`:
+ * - When i == 0 (SST mode), max(0, 1) is 1. We expect at most 1 connector.
+ * - When i > 0 (MST mode), i is the requested stream count (e.g. 2, 3, or 4).
+ * We expect at most `i` newly enumerated virtual connectors.
+ * 2. Lower bound `>= 1` (instead of strict equality `== max(i, 1)`):
+ * - On some DUTs, the DRM driver may enumerate MST stream nodes incrementally
+ * or only activate a subset of streams depending on link bandwidth and PHY limits.
+ * - Accepting any positive count (>= 1) up to the requested maximum confirms the
+ * device successfully connected without causing flaky timeouts when enumeration is slow.
+ */
+ if (diff_len >= 1 && diff_len <= max(i, 1))
+ break;
+ usleep(200000);
+ igt_gettime(&now);
+ } while (igt_time_elapsed(&start, &now) <= igt_default_display_detect_timeout());
+
+ /* Verify at least 1 (and at most max(i, 1)) connector was detected after polling timed out */
+ igt_assert_f(diff_len >= 1 && diff_len <= max(i, 1),
+ "Invalid connected connector count, expected between 1 and %d found %d\n",
max(i, 1), diff_len);
}
diff --git a/tests/unigraf/unigraf_lt.c b/tests/unigraf/unigraf_lt.c
index 81e6ecd3f..f8f57b4f4 100644
--- a/tests/unigraf/unigraf_lt.c
+++ b/tests/unigraf/unigraf_lt.c
@@ -21,6 +21,45 @@
#include "igt_kms.h"
#include "unigraf/unigraf.h"
+/*
+ * Note: Automated DisplayPort link rate testing requires driver support to query and force
+ * specific link speeds from userspace, which is currently not standardized in DRM/KMS.
+ *
+ * This implementation currently supports Intel hardware via the "i915_dp_force_link_rate"
+ * debugfs interface. Any non-Intel DRM driver wanting support for automated link rate
+ * testing must implement a similar debugfs field to expose/force link rates and extend
+ * this function accordingly.
+ */
+static bool is_rate_supported_intel(int drm_fd, igt_output_t *output, int rate_kb)
+{
+ char buf[512];
+ int res;
+ char *token;
+ int rate_tens = rate_kb / 10;
+
+ if (!is_intel_device(drm_fd))
+ return false;
+
+ res = igt_debugfs_read_connector_file(drm_fd, igt_output_name(output),
+ "i915_dp_force_link_rate",
+ buf, sizeof(buf));
+ if (res < 0)
+ return false;
+
+ token = strtok(buf, " ");
+ while (token) {
+ int rate;
+
+ errno = 0;
+ rate = strtol(token, NULL, 0);
+ if (!errno && rate == rate_tens)
+ return true;
+ token = strtok(NULL, " ");
+ }
+
+ return false;
+}
+
/**
* TEST: unigraf link training
* Category: Core
@@ -95,6 +134,12 @@ int igt_main()
drm_fd = drm_open_driver(DRIVER_ANY);
igt_assert(drm_fd >= 0);
+ /*
+ * Link retraining (igt_dp_force_link_retrain) currently relies on Intel-specific
+ * debugfs interfaces in IGT core, so we scope this requirement to the entire test.
+ */
+ igt_require_intel(drm_fd);
+
igt_display_require(&display, drm_fd);
unigraf_require_device(drm_fd);
@@ -107,11 +152,14 @@ int igt_main()
for (i = 0; i < ARRAY_SIZE(lane_counts); i++) {
igt_dynamic_f("unigraf-dp-lane-count-%d", lane_counts[i]) {
+ sleep(2);
unigraf_reset();
unigraf_set_max_lane_count(lane_counts[i]);
unigraf_hpd_pulse(500000);
+ sleep(10);
- igt_display_require_output(&display);
+ igt_display_reset_outputs(&display);
+ connector = unigraf_get_connector(drm_fd);
output = igt_output_from_connector(&display, connector);
igt_assert(output);
igt_dp_force_link_retrain(drm_fd, output, 2);
@@ -119,6 +167,9 @@ int igt_main()
current_lanes = igt_dp_get_current_lane_count(drm_fd, output);
igt_assert_eq(current_lanes, lane_counts[i]);
+
+ igt_modeset_disable_all_outputs(&display);
+ igt_display_commit2(&display, COMMIT_ATOMIC);
}
}
}
@@ -134,22 +185,28 @@ int igt_main()
for (i = 0; i < ARRAY_SIZE(rates); i++) {
igt_dynamic_f("unigraf-dp-link-rate-%d", rates[i]) {
+ sleep(2);
unigraf_reset();
unigraf_set_max_link_rate(rates[i]);
- unigraf_hpd_pulse(1000000);
- igt_display_require_output(&display);
- igt_display_reset(&display);
- igt_display_require_output(&display);
+ unigraf_hpd_pulse(500000);
+ sleep(10);
+
+ igt_display_reset_outputs(&display);
+ connector = unigraf_get_connector(drm_fd);
output = igt_output_from_connector(&display, connector);
igt_assert(output);
- igt_dp_force_link_retrain(drm_fd, output, 2);
+ igt_require(is_rate_supported_intel(drm_fd, output, unigraf_rate_to_kbs(rates[i])));
+ igt_dp_force_link_retrain(drm_fd, output, 2);
init_output_and_display_pattern(&display, output);
current_rate = igt_dp_get_max_link_rate(drm_fd, output);
max_supported_rate = igt_dp_get_max_supported_rate(drm_fd, output);
igt_require(max_supported_rate >= unigraf_rate_to_kbs(rates[i]));
igt_assert_eq(current_rate, unigraf_rate_to_kbs(rates[i]));
+
+ igt_modeset_disable_all_outputs(&display);
+ igt_display_commit2(&display, COMMIT_ATOMIC);
}
}
}
@@ -163,6 +220,7 @@ int igt_main()
igt_display_require_output(&display);
output = igt_output_from_connector(&display, connector);
igt_assert(output);
+ init_output_and_display_pattern(&display, output);
/* Get initial link parameters */
current_rate = igt_dp_get_current_link_rate(drm_fd, output);
--
2.55.0.141.g00534a21ce-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread
* ✓ Xe.CI.BAT: success for series starting with [1/3] android: Implement lightweight GKeyFile INI string parser in glib shim
2026-07-15 19:29 [PATCH 1/3] android: Implement lightweight GKeyFile INI string parser in glib shim Mark Yacoub
2026-07-15 19:29 ` [PATCH 2/3] tests/unigraf: Fix DRM master and heap memory leaks in tests Mark Yacoub
2026-07-15 19:29 ` [PATCH 3/3] tests/unigraf: Enhance link rate support checking and hardware retrain timing Mark Yacoub
@ 2026-07-15 20:27 ` Patchwork
2026-07-15 20:54 ` ✓ i915.CI.BAT: " Patchwork
3 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2026-07-15 20:27 UTC (permalink / raw)
To: Mark Yacoub; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 1032 bytes --]
== Series Details ==
Series: series starting with [1/3] android: Implement lightweight GKeyFile INI string parser in glib shim
URL : https://patchwork.freedesktop.org/series/170509/
State : success
== Summary ==
CI Bug Log - changes from XEIGT_9007_BAT -> XEIGTPW_15537_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (13 -> 13)
------------------------------
No changes in participating hosts
Changes
-------
No changes found
Build changes
-------------
* IGT: IGT_9007 -> IGTPW_15537
* Linux: xe-5412-116ce94f4e028e50e3523c46a8ce1e665ce47cb9 -> xe-5413-d5e28ab6d95745792768007429a07204680b6623
IGTPW_15537: 15537
IGT_9007: 9007
xe-5412-116ce94f4e028e50e3523c46a8ce1e665ce47cb9: 116ce94f4e028e50e3523c46a8ce1e665ce47cb9
xe-5413-d5e28ab6d95745792768007429a07204680b6623: d5e28ab6d95745792768007429a07204680b6623
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_15537/index.html
[-- Attachment #2: Type: text/html, Size: 1591 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* ✓ i915.CI.BAT: success for series starting with [1/3] android: Implement lightweight GKeyFile INI string parser in glib shim
2026-07-15 19:29 [PATCH 1/3] android: Implement lightweight GKeyFile INI string parser in glib shim Mark Yacoub
` (2 preceding siblings ...)
2026-07-15 20:27 ` ✓ Xe.CI.BAT: success for series starting with [1/3] android: Implement lightweight GKeyFile INI string parser in glib shim Patchwork
@ 2026-07-15 20:54 ` Patchwork
3 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2026-07-15 20:54 UTC (permalink / raw)
To: Mark Yacoub; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 2176 bytes --]
== Series Details ==
Series: series starting with [1/3] android: Implement lightweight GKeyFile INI string parser in glib shim
URL : https://patchwork.freedesktop.org/series/170509/
State : success
== Summary ==
CI Bug Log - changes from IGT_9007 -> IGTPW_15537
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_15537/index.html
Participating hosts (41 -> 38)
------------------------------
Missing (3): bat-dg2-13 fi-snb-2520m bat-adls-6
Known issues
------------
Here are the changes found in IGTPW_15537 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_addfb_basic@too-high:
- bat-apl-1: [PASS][1] -> [DMESG-WARN][2] ([i915#13735]) +38 other tests dmesg-warn
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_9007/bat-apl-1/igt@kms_addfb_basic@too-high.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_15537/bat-apl-1/igt@kms_addfb_basic@too-high.html
* igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-b-dp-1:
- bat-apl-1: [PASS][3] -> [DMESG-WARN][4] ([i915#13735] / [i915#180]) +38 other tests dmesg-warn
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_9007/bat-apl-1/igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-b-dp-1.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_15537/bat-apl-1/igt@kms_pipe_crc_basic@nonblocking-crc-frame-sequence@pipe-b-dp-1.html
[i915#13735]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13735
[i915#180]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/180
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_9007 -> IGTPW_15537
* Linux: CI_DRM_18830 -> CI_DRM_18832
CI-20190529: 20190529
CI_DRM_18830: 116ce94f4e028e50e3523c46a8ce1e665ce47cb9 @ git://anongit.freedesktop.org/gfx-ci/linux
CI_DRM_18832: c5949557d2bad72487d7e443212ab4964b34b242 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_15537: 15537
IGT_9007: 9007
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_15537/index.html
[-- Attachment #2: Type: text/html, Size: 2889 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-07-15 20:54 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-15 19:29 [PATCH 1/3] android: Implement lightweight GKeyFile INI string parser in glib shim Mark Yacoub
2026-07-15 19:29 ` [PATCH 2/3] tests/unigraf: Fix DRM master and heap memory leaks in tests Mark Yacoub
2026-07-15 19:29 ` [PATCH 3/3] tests/unigraf: Enhance link rate support checking and hardware retrain timing Mark Yacoub
2026-07-15 20:27 ` ✓ Xe.CI.BAT: success for series starting with [1/3] android: Implement lightweight GKeyFile INI string parser in glib shim Patchwork
2026-07-15 20:54 ` ✓ i915.CI.BAT: " Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox