Skip to contentSkip to conversation

tests/kms_chamelium: add pulse test

PATCH Superseded Simon Ser 3 participants 26 messages May 24, 2019 – May 27, 2019 Library code

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore

Simon Ser

author
#0 lore raw

v2 cover tests/kms_chamelium: add pulse test

The series performs a refactoring of the current audio test to be able to introduce a new one.

The new test checks both the amplitude and the channel alignment.

The series has been reposted because:

- CI failed to test my changes, for some reason
- A new patch has been added

Simon Ser (9):
tests/kms_chamelium: refactor audio test tests/kms_chamelium: introduce audio_state_receive tests/kms_chamelium: rename do_test_display_audio and
test_audio_configuration
tests/kms_chamelium: explain why 8-channel tests aren't performed lib/igt_audio: introduce audio_convert_to tests/kms_chamelium: add name parameter to audio_state_start lib/igt_audio: make audio_extract_channel_s32_le support a NULL dst tests/kms_chamelium: add pulse audio test tests/kms_chamelium: add audio channel alignment test

 lib/igt_audio.c       |  98 ++++----
 lib/igt_audio.h       |  12 +-
 tests/kms_chamelium.c | 561 ++++++++++++++++++++++++++++++------------
 3 files changed, 459 insertions(+), 212 deletions(-)

--
2.21.0

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

author
#1 lore raw

PATCH v2 1/9 tests/kms_chamelium: refactor audio test

Instead of shaving everything into do_test_display_audio, extract the logic to initialize, start, stop, finish an audio test in helper functions. The struct audio_state now carries all audio-related state.

This will allow to easily add more audio tests that don't use sine waves (via audio_signal). This is necessary for future delay and amplitude tests.

---
 tests/kms_chamelium.c | 336 ++++++++++++++++++++++++------------------
 1 file changed, 195 insertions(+), 141 deletions(-)
tests/kms_chamelium.c +195 -141
index 8da6ec20759e..1a0a02ca2890 100644
@@ -812,17 +812,179 @@ static const snd_pcm_format_t test_formats[] = {
 static const size_t test_formats_count = sizeof(test_formats) / sizeof(test_formats[0]);
 
 struct audio_state {
+	struct alsa *alsa;
+	struct chamelium *chamelium;
+	struct chamelium_port *port;
+	struct chamelium_stream *stream;
+
+	/* The capture format is only available after capture has started. */
+	struct {
+		snd_pcm_format_t format;
+		int channels;
+		int rate;
+	} playback, capture;
+
 	struct audio_signal *signal;
-	snd_pcm_format_t format;
+	int channel_mapping[8];
+
+	int dump_fd;
+	char *dump_path;
+
+	pthread_t thread;
 	atomic_bool run;
 };
 
+static void audio_state_init(struct audio_state *state, data_t *data,
+			     struct alsa *alsa, struct chamelium_port *port,
+			     snd_pcm_format_t format, int channels, int rate)
+{
+	memset(state, 0, sizeof(*state));
+	state->dump_fd = -1;
+
+	state->alsa = alsa;
+	state->chamelium = data->chamelium;
+	state->port = port;
+
+	state->playback.format = format;
+	state->playback.channels = channels;
+	state->playback.rate = rate;
+
+	alsa_configure_output(alsa, format, channels, rate);
+
+	state->stream = chamelium_stream_init();
+	igt_assert(state->stream);
+}
+
+static void audio_state_fini(struct audio_state *state)
+{
+	chamelium_stream_deinit(state->stream);
+}
+
+static void *run_audio_thread(void *data)
+{
+	struct alsa *alsa = data;
+
+	alsa_run(alsa, -1);
+	return NULL;
+}
+
+static void audio_state_start(struct audio_state *state)
+{
+	int ret;
+	bool ok;
+	size_t i, j;
+	enum chamelium_stream_realtime_mode stream_mode;
+	char dump_suffix[64];
+
+	igt_debug("Starting test with playback format %s, sampling rate %d Hz "
+		  "and %d channels\n",
+		  snd_pcm_format_name(state->playback.format),
+		  state->playback.rate, state->playback.channels);
+
+	chamelium_start_capturing_audio(state->chamelium, state->port, false);
+
+	stream_mode = CHAMELIUM_STREAM_REALTIME_STOP_WHEN_OVERFLOW;
+	ok = chamelium_stream_dump_realtime_audio(state->stream, stream_mode);
+	igt_assert(ok);
+
+	/* Start playing audio */
+	state->run = true;
+	ret = pthread_create(&state->thread, NULL,
+			     run_audio_thread, state->alsa);
+	igt_assert(ret == 0);
+
+	/* The Chamelium device only supports this PCM format. */
+	state->capture.format = SND_PCM_FORMAT_S32_LE;
+
+	/* Only after we've started playing audio, we can retrieve the capture
+	 * format used by the Chamelium device. */
+	chamelium_get_audio_format(state->chamelium, state->port,
+				   &state->capture.rate,
+				   &state->capture.channels);
+	if (state->capture.rate == 0) {
+		igt_debug("Audio receiver doesn't indicate the capture "
+			 "sampling rate, assuming it's %d Hz\n",
+			 state->playback.rate);
+		state->capture.rate = state->playback.rate;
+	}
+
+	chamelium_get_audio_channel_mapping(state->chamelium, state->port,
+					    state->channel_mapping);
+	/* Make sure we can capture all channels we send. */
+	for (i = 0; i < state->playback.channels; i++) {
+		ok = false;
+		for (j = 0; j < state->capture.channels; j++) {
+			if (state->channel_mapping[j] == i) {
+				ok = true;
+				break;
+			}
+		}
+		igt_assert(ok);
+	}
+
+	if (igt_frame_dump_is_enabled()) {
+		snprintf(dump_suffix, sizeof(dump_suffix),
+			 "capture-%s-%dch-%dHz",
+			 snd_pcm_format_name(state->playback.format),
+			 state->playback.channels, state->playback.rate);
+
+		state->dump_fd = audio_create_wav_file_s32_le(dump_suffix,
+							      state->capture.rate,
+							      state->capture.channels,
+							      &state->dump_path);
+		igt_assert(state->dump_fd >= 0);
+	}
+}
+
+static void audio_state_stop(struct audio_state *state, bool success)
+{
+	bool ok;
+	int ret;
+	struct chamelium_audio_file *audio_file;
+
+	igt_debug("Stopping audio playback\n");
+	state->run = false;
+	ret = pthread_join(state->thread, NULL);
+	igt_assert(ret == 0);
+
+	ok = chamelium_stream_stop_realtime_audio(state->stream);
+	igt_assert(ok);
+
+	audio_file = chamelium_stop_capturing_audio(state->chamelium,
+						    state->port);
+	if (audio_file) {
+		igt_debug("Audio file saved on the Chamelium in %s\n",
+			  audio_file->path);
+		chamelium_destroy_audio_file(audio_file);
+	}
+
+	if (state->dump_fd >= 0) {
+		close(state->dump_fd);
+		state->dump_fd = -1;
+
+		if (success) {
+			/* Test succeeded, no need to keep the captured data */
+			unlink(state->dump_path);
+		} else
+			igt_debug("Saved captured audio data to %s\n",
+				  state->dump_path);
+		free(state->dump_path);
+		state->dump_path = NULL;
+	}
+
+	igt_debug("Audio test result for format %s, sampling rate %d Hz and "
+		  "%d channels: %s\n",
+		  snd_pcm_format_name(state->playback.format),
+		  state->playback.rate, state->playback.channels,
+		  success ? "ALL GREEN" : "FAILED");
+}
+
 static int
 audio_output_callback(void *data, void *buffer, int samples)
 {
 	struct audio_state *state = data;
 
-	switch (state->format) {
+	switch (state->playback.format) {
 	case SND_PCM_FORMAT_S16_LE:
 		audio_signal_fill_s16_le(state->signal, buffer, samples);
 		break;
@@ -839,55 +1001,19 @@ audio_output_callback(void *data, void *buffer, int samples)
 	return state->run ? 0 : -1;
 }
 
-static void *
-run_audio_thread(void *data)
+static bool do_test_display_audio(struct audio_state *state)
 {
-	struct alsa *alsa = data;
-
-	alsa_run(alsa, -1);
-	return NULL;
-}
-
-static bool
-do_test_display_audio(data_t *data, struct chamelium_port *port,
-		      struct alsa *alsa, snd_pcm_format_t playback_format,
-		      int playback_channels, int playback_rate)
-{
-	int ret, capture_rate, capture_channels, msec, freq, step;
-	struct chamelium_audio_file *audio_file;
-	struct chamelium_stream *stream;
-	enum chamelium_stream_realtime_mode stream_mode;
-	struct audio_signal *signal;
+	int msec, freq, step;
 	int32_t *recv, *buf;
 	double *channel;
 	size_t i, j, streak, page_count;
 	size_t recv_len, buf_len, buf_cap, buf_size, channel_len;
 	bool ok, success;
-	char dump_suffix[64];
-	char *dump_path = NULL;
-	int dump_fd = -1;
-	pthread_t thread;
-	struct audio_state state = {};
-	int channel_mapping[8], capture_chan;
-
-	igt_debug("Testing with playback format %s, sampling rate %d Hz and "
-		  "%d channels\n",
-		  snd_pcm_format_name(playback_format),
-		  playback_rate, playback_channels);
-	alsa_configure_output(alsa, playback_format,
-			      playback_channels, playback_rate);
+	int capture_chan;
 
-	chamelium_start_capturing_audio(data->chamelium, port, false);
-
-	stream = chamelium_stream_init();
-	igt_assert(stream);
-
-	stream_mode = CHAMELIUM_STREAM_REALTIME_STOP_WHEN_OVERFLOW;
-	ok = chamelium_stream_dump_realtime_audio(stream, stream_mode);
-	igt_assert(ok);
-
-	signal = audio_signal_init(playback_channels, playback_rate);
-	igt_assert(signal);
+	state->signal = audio_signal_init(state->playback.channels,
+					  state->playback.rate);
+	igt_assert(state->signal);
 
 	/* We'll choose different frequencies per channel to make sure they are
 	 * independent from each other. To do so, we'll add a different offset
@@ -900,62 +1026,21 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 	 * later on. We cannot retrieve the capture rate before starting
 	 * playing audio, so we don't really have the choice.
 	 */
-	step = 2 * playback_rate / CAPTURE_SAMPLES;
+	step = 2 * state->playback.rate / CAPTURE_SAMPLES;
 	for (i = 0; i < test_frequencies_count; i++) {
-		for (j = 0; j < playback_channels; j++) {
+		for (j = 0; j < state->playback.channels; j++) {
 			freq = test_frequencies[i] + j * step;
-			audio_signal_add_frequency(signal, freq, j);
+			audio_signal_add_frequency(state->signal, freq, j);
 		}
 	}
-	audio_signal_synthesize(signal);
+	audio_signal_synthesize(state->signal);
 
-	state.signal = signal;
-	state.format = playback_format;
-	state.run = true;
-	alsa_register_output_callback(alsa, audio_output_callback, &state,
+	alsa_register_output_callback(state->alsa, audio_output_callback, state,
 				      PLAYBACK_SAMPLES);
 
-	/* Start playing audio */
-	ret = pthread_create(&thread, NULL, run_audio_thread, alsa);
-	igt_assert(ret == 0);
+	audio_state_start(state);
 
-	/* Only after we've started playing audio, we can retrieve the capture
-	 * format used by the Chamelium device. */
-	chamelium_get_audio_format(data->chamelium, port,
-				   &capture_rate, &capture_channels);
-	if (capture_rate == 0) {
-		igt_debug("Audio receiver doesn't indicate the capture "
-			 "sampling rate, assuming it's %d Hz\n", playback_rate);
-		capture_rate = playback_rate;
-	} else
-		igt_assert(capture_rate == playback_rate);
-
-	chamelium_get_audio_channel_mapping(data->chamelium, port,
-					    channel_mapping);
-	/* Make sure we can capture all channels we send. */
-	for (i = 0; i < playback_channels; i++) {
-		ok = false;
-		for (j = 0; j < capture_channels; j++) {
-			if (channel_mapping[j] == i) {
-				ok = true;
-				break;
-			}
-		}
-		igt_assert(ok);
-	}
-
-	if (igt_frame_dump_is_enabled()) {
-		snprintf(dump_suffix, sizeof(dump_suffix),
-			 "capture-%s-%dch-%dHz",
-			 snd_pcm_format_name(playback_format),
-			 playback_channels, playback_rate);
-
-		dump_fd = audio_create_wav_file_s32_le(dump_suffix,
-						       capture_rate,
-						       capture_channels,
-						       &dump_path);
-		igt_assert(dump_fd >= 0);
-	}
+	igt_assert(state->capture.rate == state->playback.rate);
 
 	/* Needs to be a multiple of 128, because that's the number of samples
 	 * we get per channel each time we receive an audio page from the
@@ -970,7 +1055,7 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 	channel_len = CAPTURE_SAMPLES;
 	channel = malloc(sizeof(double) * channel_len);
 
-	buf_cap = capture_channels * channel_len;
+	buf_cap = state->capture.channels * channel_len;
 	buf = malloc(sizeof(int32_t) * buf_cap);
 	buf_len = 0;
 
@@ -982,7 +1067,7 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 	msec = 0;
 	i = 0;
 	while (!success && msec < AUDIO_TIMEOUT) {
-		ok = chamelium_stream_receive_realtime_audio(stream,
+		ok = chamelium_stream_receive_realtime_audio(state->stream,
 							     &page_count,
 							     &recv, &recv_len);
 		igt_assert(ok);
@@ -994,26 +1079,27 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 			continue;
 		igt_assert(buf_len == buf_cap);
 
-		if (dump_fd >= 0) {
+		if (state->dump_fd >= 0) {
 			buf_size = buf_len * sizeof(int32_t);
-			igt_assert(write(dump_fd, buf, buf_size) == buf_size);
+			igt_assert(write(state->dump_fd, buf, buf_size) == buf_size);
 		}
 
-		msec = i * channel_len / (double) capture_rate * 1000;
+		msec = i * channel_len / (double) state->capture.rate * 1000;
 		igt_debug("Detecting audio signal, t=%d msec\n", msec);
 
-		for (j = 0; j < playback_channels; j++) {
-			capture_chan = channel_mapping[j];
+		for (j = 0; j < state->playback.channels; j++) {
+			capture_chan = state->channel_mapping[j];
 			igt_assert(capture_chan >= 0);
 			igt_debug("Processing channel %zu (captured as "
 				  "channel %d)\n", j, capture_chan);
 
 			audio_extract_channel_s32_le(channel, channel_len,
 						     buf, buf_len,
-						     capture_channels,
+						     state->capture.channels,
 						     capture_chan);
 
-			if (audio_signal_detect(signal, capture_rate, j,
+			if (audio_signal_detect(state->signal,
+						state->capture.rate, j,
 						channel, channel_len))
 				streak++;
 			else
@@ -1023,49 +1109,15 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 		buf_len = 0;
 		i++;
 
-		success = streak == MIN_STREAK * playback_channels;
+		success = streak == MIN_STREAK * state->playback.channels;
 	}
 
-	igt_debug("Stopping audio playback\n");
-	state.run = false;
-	ret = pthread_join(thread, NULL);
-	igt_assert(ret == 0);
-
-	alsa_close_output(alsa);
-
-	igt_debug("Audio test result for format %s, sampling rate %d Hz and "
-		  "%d channels: %s\n",
-		  snd_pcm_format_name(playback_format),
-		  playback_rate, playback_channels,
-		  success ? "ALL GREEN" : "FAILED");
-
-	if (dump_fd >= 0) {
-		close(dump_fd);
-		if (success) {
-			/* Test succeeded, no need to keep the captured data */
-			unlink(dump_path);
-		} else
-			igt_debug("Saved captured audio data to %s\n", dump_path);
-		free(dump_path);
-	}
+	audio_state_stop(state, success);
 
 	free(recv);
 	free(buf);
 	free(channel);
-
-	ok = chamelium_stream_stop_realtime_audio(stream);
-	igt_assert(ok);
-
-	audio_file = chamelium_stop_capturing_audio(data->chamelium,
-						    port);
-	if (audio_file) {
-		igt_debug("Audio file saved on the Chamelium in %s\n",
-			  audio_file->path);
-		chamelium_destroy_audio_file(audio_file);
-	}
-
-	audio_signal_fini(signal);
-	chamelium_stream_deinit(stream);
+	audio_signal_fini(state->signal);
 
 	return success;
 }
@@ -1112,6 +1164,7 @@ test_display_audio(data_t *data, struct chamelium_port *port,
 	int fb_id, i, j;
 	int channels, sampling_rate;
 	snd_pcm_format_t format;
+	struct audio_state state;
 
 	igt_require(alsa_has_exclusive_access());
 
@@ -1161,9 +1214,10 @@ test_display_audio(data_t *data, struct chamelium_port *port,
 
 			run = true;
 
-			success &= do_test_display_audio(data, port, alsa,
-							 format, channels,
-							 sampling_rate);
+			audio_state_init(&state, data, alsa, port,
+					 format, channels, sampling_rate);
+			success &= do_test_display_audio(&state);
+			audio_state_fini(&state);
 
 			alsa_close_output(alsa);
 		}
Signature · 6 lines
2.21.0

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
Reviewed-by on v2 1/9
#2 lore raw

Re: [igt-dev] [PATCH i-g-t v2 1/9] tests/kms_chamelium: refactor audio test

Quoted 1 line · Simon Ser

Instead of shaving everything into do_test_display_audio, extract the logic to

shoving :)

Quoted 99 lines

initialize, start, stop, finish an audio test in helper functions. The struct audio_state now carries all audio-related state.

This will allow to easily add more audio tests that don't use sine waves (via audio_signal). This is necessary for future delay and amplitude tests.

---
 tests/kms_chamelium.c | 336 ++++++++++++++++++++++++------------------
 1 file changed, 195 insertions(+), 141 deletions(-)
tests/kms_chamelium.c +75 -1
index 8da6ec20759e..1a0a02ca2890 100644
@@ -812,17 +812,179 @@ static const snd_pcm_format_t test_formats[] = {
 static const size_t test_formats_count = sizeof(test_formats) / sizeof(test_formats[0]);
 
 struct audio_state {
+	struct alsa *alsa;
+	struct chamelium *chamelium;
+	struct chamelium_port *port;
+	struct chamelium_stream *stream;
+
+	/* The capture format is only available after capture has started. */
+	struct {
+		snd_pcm_format_t format;
+		int channels;
+		int rate;
+	} playback, capture;
+
 	struct audio_signal *signal;
-	snd_pcm_format_t format;
+	int channel_mapping[8];
+
+	int dump_fd;
+	char *dump_path;
+
+	pthread_t thread;
 	atomic_bool run;
 };
 
+static void audio_state_init(struct audio_state *state, data_t *data,
+			     struct alsa *alsa, struct chamelium_port *port,
+			     snd_pcm_format_t format, int channels, int rate)
+{
+	memset(state, 0, sizeof(*state));
+	state->dump_fd = -1;
+
+	state->alsa = alsa;
+	state->chamelium = data->chamelium;
+	state->port = port;
+
+	state->playback.format = format;
+	state->playback.channels = channels;
+	state->playback.rate = rate;
+
+	alsa_configure_output(alsa, format, channels, rate);
+
+	state->stream = chamelium_stream_init();
+	igt_assert(state->stream);
+}
+
+static void audio_state_fini(struct audio_state *state)
+{
+	chamelium_stream_deinit(state->stream);
+}
+
+static void *run_audio_thread(void *data)
+{
+	struct alsa *alsa = data;
+
+	alsa_run(alsa, -1);
+	return NULL;
+}
+
+static void audio_state_start(struct audio_state *state)
+{
+	int ret;
+	bool ok;
+	size_t i, j;
+	enum chamelium_stream_realtime_mode stream_mode;
+	char dump_suffix[64];
+
+	igt_debug("Starting test with playback format %s, sampling rate %d Hz "
+		  "and %d channels\n",
+		  snd_pcm_format_name(state->playback.format),
+		  state->playback.rate, state->playback.channels);
+
+	chamelium_start_capturing_audio(state->chamelium, state->port, false);
+
+	stream_mode = CHAMELIUM_STREAM_REALTIME_STOP_WHEN_OVERFLOW;
+	ok = chamelium_stream_dump_realtime_audio(state->stream, stream_mode);
+	igt_assert(ok);
+
+	/* Start playing audio */
+	state->run = true;
+	ret = pthread_create(&state->thread, NULL,
+			     run_audio_thread, state->alsa);

tests/kms_chamelium.c static const snd_pcm_format_t test_formats[] = { · line 903

Quoted 10 lines
tests/kms_chamelium.c +10 -0
+	igt_assert(ret == 0);
+
+	/* The Chamelium device only supports this PCM format. */
+	state->capture.format = SND_PCM_FORMAT_S32_LE;
+
+	/* Only after we've started playing audio, we can retrieve the capture
+	 * format used by the Chamelium device. */
+	chamelium_get_audio_format(state->chamelium, state->port,
+				   &state->capture.rate,
+				   &state->capture.channels);

Is this a blocking call? If not, we have a race condition here...

Quoted 10 lines
tests/kms_chamelium.c +10 -0
+	if (state->capture.rate == 0) {
+		igt_debug("Audio receiver doesn't indicate the capture "
+			 "sampling rate, assuming it's %d Hz\n",
+			 state->playback.rate);
+		state->capture.rate = state->playback.rate;
+	}
+
+	chamelium_get_audio_channel_mapping(state->chamelium, state->port,
+					    state->channel_mapping);
+	/* Make sure we can capture all channels we send. */

tests/kms_chamelium.c static const snd_pcm_format_t test_formats[] = { · line 923

Quoted 10 lines
tests/kms_chamelium.c +10 -0
+	for (i = 0; i < state->playback.channels; i++) {
+		ok = false;
+		for (j = 0; j < state->capture.channels; j++) {
+			if (state->channel_mapping[j] == i) {
+				ok = true;
+				break;
+			}
+		}
+		igt_assert(ok);
+	}

Nice check!

tests/kms_chamelium.c static const snd_pcm_format_t test_formats[] = { · line 925

Quoted 2 lines
tests/kms_chamelium.c +2 -0
+
+	if (igt_frame_dump_is_enabled()) {

Maybe you should rename this function, now that it is also used to dump sound. How about igt_resource_dumping_is_enabled()? This does not have to happen in this patch though.

This is a good patch:

Martin

Quoted 317 lines
tests/kms_chamelium.c +84 -137
+		snprintf(dump_suffix, sizeof(dump_suffix),
+			 "capture-%s-%dch-%dHz",
+			 snd_pcm_format_name(state->playback.format),
+			 state->playback.channels, state->playback.rate);
+
+		state->dump_fd = audio_create_wav_file_s32_le(dump_suffix,
+							      state->capture.rate,
+							      state->capture.channels,
+							      &state->dump_path);
+		igt_assert(state->dump_fd >= 0);
+	}
+}
+
+static void audio_state_stop(struct audio_state *state, bool success)
+{
+	bool ok;
+	int ret;
+	struct chamelium_audio_file *audio_file;
+
+	igt_debug("Stopping audio playback\n");
+	state->run = false;
+	ret = pthread_join(state->thread, NULL);
+	igt_assert(ret == 0);
+
+	ok = chamelium_stream_stop_realtime_audio(state->stream);
+	igt_assert(ok);
+
+	audio_file = chamelium_stop_capturing_audio(state->chamelium,
+						    state->port);
+	if (audio_file) {
+		igt_debug("Audio file saved on the Chamelium in %s\n",
+			  audio_file->path);
+		chamelium_destroy_audio_file(audio_file);
+	}
+
+	if (state->dump_fd >= 0) {
+		close(state->dump_fd);
+		state->dump_fd = -1;
+
+		if (success) {
+			/* Test succeeded, no need to keep the captured data */
+			unlink(state->dump_path);
+		} else
+			igt_debug("Saved captured audio data to %s\n",
+				  state->dump_path);
+		free(state->dump_path);
+		state->dump_path = NULL;
+	}
+
+	igt_debug("Audio test result for format %s, sampling rate %d Hz and "
+		  "%d channels: %s\n",
+		  snd_pcm_format_name(state->playback.format),
+		  state->playback.rate, state->playback.channels,
+		  success ? "ALL GREEN" : "FAILED");
+}
+
 static int
 audio_output_callback(void *data, void *buffer, int samples)
 {
 	struct audio_state *state = data;
 
-	switch (state->format) {
+	switch (state->playback.format) {
 	case SND_PCM_FORMAT_S16_LE:
 		audio_signal_fill_s16_le(state->signal, buffer, samples);
 		break;
@@ -839,55 +1001,19 @@ audio_output_callback(void *data, void *buffer, int samples)
 	return state->run ? 0 : -1;
 }
 
-static void *
-run_audio_thread(void *data)
+static bool do_test_display_audio(struct audio_state *state)
 {
-	struct alsa *alsa = data;
-
-	alsa_run(alsa, -1);
-	return NULL;
-}
-
-static bool
-do_test_display_audio(data_t *data, struct chamelium_port *port,
-		      struct alsa *alsa, snd_pcm_format_t playback_format,
-		      int playback_channels, int playback_rate)
-{
-	int ret, capture_rate, capture_channels, msec, freq, step;
-	struct chamelium_audio_file *audio_file;
-	struct chamelium_stream *stream;
-	enum chamelium_stream_realtime_mode stream_mode;
-	struct audio_signal *signal;
+	int msec, freq, step;
 	int32_t *recv, *buf;
 	double *channel;
 	size_t i, j, streak, page_count;
 	size_t recv_len, buf_len, buf_cap, buf_size, channel_len;
 	bool ok, success;
-	char dump_suffix[64];
-	char *dump_path = NULL;
-	int dump_fd = -1;
-	pthread_t thread;
-	struct audio_state state = {};
-	int channel_mapping[8], capture_chan;
-
-	igt_debug("Testing with playback format %s, sampling rate %d Hz and "
-		  "%d channels\n",
-		  snd_pcm_format_name(playback_format),
-		  playback_rate, playback_channels);
-	alsa_configure_output(alsa, playback_format,
-			      playback_channels, playback_rate);
+	int capture_chan;
 
-	chamelium_start_capturing_audio(data->chamelium, port, false);
-
-	stream = chamelium_stream_init();
-	igt_assert(stream);
-
-	stream_mode = CHAMELIUM_STREAM_REALTIME_STOP_WHEN_OVERFLOW;
-	ok = chamelium_stream_dump_realtime_audio(stream, stream_mode);
-	igt_assert(ok);
-
-	signal = audio_signal_init(playback_channels, playback_rate);
-	igt_assert(signal);
+	state->signal = audio_signal_init(state->playback.channels,
+					  state->playback.rate);
+	igt_assert(state->signal);
 
 	/* We'll choose different frequencies per channel to make sure they are
 	 * independent from each other. To do so, we'll add a different offset
@@ -900,62 +1026,21 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 	 * later on. We cannot retrieve the capture rate before starting
 	 * playing audio, so we don't really have the choice.
 	 */
-	step = 2 * playback_rate / CAPTURE_SAMPLES;
+	step = 2 * state->playback.rate / CAPTURE_SAMPLES;
 	for (i = 0; i < test_frequencies_count; i++) {
-		for (j = 0; j < playback_channels; j++) {
+		for (j = 0; j < state->playback.channels; j++) {
 			freq = test_frequencies[i] + j * step;
-			audio_signal_add_frequency(signal, freq, j);
+			audio_signal_add_frequency(state->signal, freq, j);
 		}
 	}
-	audio_signal_synthesize(signal);
+	audio_signal_synthesize(state->signal);
 
-	state.signal = signal;
-	state.format = playback_format;
-	state.run = true;
-	alsa_register_output_callback(alsa, audio_output_callback, &state,
+	alsa_register_output_callback(state->alsa, audio_output_callback, state,
 				      PLAYBACK_SAMPLES);
 
-	/* Start playing audio */
-	ret = pthread_create(&thread, NULL, run_audio_thread, alsa);
-	igt_assert(ret == 0);
+	audio_state_start(state);
 
-	/* Only after we've started playing audio, we can retrieve the capture
-	 * format used by the Chamelium device. */
-	chamelium_get_audio_format(data->chamelium, port,
-				   &capture_rate, &capture_channels);
-	if (capture_rate == 0) {
-		igt_debug("Audio receiver doesn't indicate the capture "
-			 "sampling rate, assuming it's %d Hz\n", playback_rate);
-		capture_rate = playback_rate;
-	} else
-		igt_assert(capture_rate == playback_rate);
-
-	chamelium_get_audio_channel_mapping(data->chamelium, port,
-					    channel_mapping);
-	/* Make sure we can capture all channels we send. */
-	for (i = 0; i < playback_channels; i++) {
-		ok = false;
-		for (j = 0; j < capture_channels; j++) {
-			if (channel_mapping[j] == i) {
-				ok = true;
-				break;
-			}
-		}
-		igt_assert(ok);
-	}
-
-	if (igt_frame_dump_is_enabled()) {
-		snprintf(dump_suffix, sizeof(dump_suffix),
-			 "capture-%s-%dch-%dHz",
-			 snd_pcm_format_name(playback_format),
-			 playback_channels, playback_rate);
-
-		dump_fd = audio_create_wav_file_s32_le(dump_suffix,
-						       capture_rate,
-						       capture_channels,
-						       &dump_path);
-		igt_assert(dump_fd >= 0);
-	}
+	igt_assert(state->capture.rate == state->playback.rate);
 
 	/* Needs to be a multiple of 128, because that's the number of samples
 	 * we get per channel each time we receive an audio page from the
@@ -970,7 +1055,7 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 	channel_len = CAPTURE_SAMPLES;
 	channel = malloc(sizeof(double) * channel_len);
 
-	buf_cap = capture_channels * channel_len;
+	buf_cap = state->capture.channels * channel_len;
 	buf = malloc(sizeof(int32_t) * buf_cap);
 	buf_len = 0;
 
@@ -982,7 +1067,7 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 	msec = 0;
 	i = 0;
 	while (!success && msec < AUDIO_TIMEOUT) {
-		ok = chamelium_stream_receive_realtime_audio(stream,
+		ok = chamelium_stream_receive_realtime_audio(state->stream,
 							     &page_count,
 							     &recv, &recv_len);
 		igt_assert(ok);
@@ -994,26 +1079,27 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 			continue;
 		igt_assert(buf_len == buf_cap);
 
-		if (dump_fd >= 0) {
+		if (state->dump_fd >= 0) {
 			buf_size = buf_len * sizeof(int32_t);
-			igt_assert(write(dump_fd, buf, buf_size) == buf_size);
+			igt_assert(write(state->dump_fd, buf, buf_size) == buf_size);
 		}
 
-		msec = i * channel_len / (double) capture_rate * 1000;
+		msec = i * channel_len / (double) state->capture.rate * 1000;
 		igt_debug("Detecting audio signal, t=%d msec\n", msec);
 
-		for (j = 0; j < playback_channels; j++) {
-			capture_chan = channel_mapping[j];
+		for (j = 0; j < state->playback.channels; j++) {
+			capture_chan = state->channel_mapping[j];
 			igt_assert(capture_chan >= 0);
 			igt_debug("Processing channel %zu (captured as "
 				  "channel %d)\n", j, capture_chan);
 
 			audio_extract_channel_s32_le(channel, channel_len,
 						     buf, buf_len,
-						     capture_channels,
+						     state->capture.channels,
 						     capture_chan);
 
-			if (audio_signal_detect(signal, capture_rate, j,
+			if (audio_signal_detect(state->signal,
+						state->capture.rate, j,
 						channel, channel_len))
 				streak++;
 			else
@@ -1023,49 +1109,15 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 		buf_len = 0;
 		i++;
 
-		success = streak == MIN_STREAK * playback_channels;
+		success = streak == MIN_STREAK * state->playback.channels;
 	}
 
-	igt_debug("Stopping audio playback\n");
-	state.run = false;
-	ret = pthread_join(thread, NULL);
-	igt_assert(ret == 0);
-
-	alsa_close_output(alsa);
-
-	igt_debug("Audio test result for format %s, sampling rate %d Hz and "
-		  "%d channels: %s\n",
-		  snd_pcm_format_name(playback_format),
-		  playback_rate, playback_channels,
-		  success ? "ALL GREEN" : "FAILED");
-
-	if (dump_fd >= 0) {
-		close(dump_fd);
-		if (success) {
-			/* Test succeeded, no need to keep the captured data */
-			unlink(dump_path);
-		} else
-			igt_debug("Saved captured audio data to %s\n", dump_path);
-		free(dump_path);
-	}
+	audio_state_stop(state, success);
 
 	free(recv);
 	free(buf);
 	free(channel);
-
-	ok = chamelium_stream_stop_realtime_audio(stream);
-	igt_assert(ok);
-
-	audio_file = chamelium_stop_capturing_audio(data->chamelium,
-						    port);
-	if (audio_file) {
-		igt_debug("Audio file saved on the Chamelium in %s\n",
-			  audio_file->path);
-		chamelium_destroy_audio_file(audio_file);
-	}
-
-	audio_signal_fini(signal);
-	chamelium_stream_deinit(stream);
+	audio_signal_fini(state->signal);
 
 	return success;
 }
@@ -1112,6 +1164,7 @@ test_display_audio(data_t *data, struct chamelium_port *port,
 	int fb_id, i, j;
 	int channels, sampling_rate;
 	snd_pcm_format_t format;
+	struct audio_state state;
 
 	igt_require(alsa_has_exclusive_access());
 
@@ -1161,9 +1214,10 @@ test_display_audio(data_t *data, struct chamelium_port *port,
 
 			run = true;
 

tests/kms_chamelium.c test_display_audio(data_t *data, struct chamelium_port *port, · line 1223

Quoted 10 lines
tests/kms_chamelium.c +4 -3
-			success &= do_test_display_audio(data, port, alsa,
-							 format, channels,
-							 sampling_rate);
+			audio_state_init(&state, data, alsa, port,
+					 format, channels, sampling_rate);
+			success &= do_test_display_audio(&state);
+			audio_state_fini(&state);
 
 			alsa_close_output(alsa);
 		}

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

author
#3 lore raw

Re: [igt-dev] [PATCH i-g-t v2 1/9] tests/kms_chamelium: refactor audio test

Quoted 4 lines · Martin Peres
Quoted 1 line · Simon Ser

Instead of shaving everything into do_test_display_audio, extract the logic to

shoving :)

Derp

Quoted 103 lines
Quoted 103 lines

initialize, start, stop, finish an audio test in helper functions. The struct audio_state now carries all audio-related state.

This will allow to easily add more audio tests that don't use sine waves (via audio_signal). This is necessary for future delay and amplitude tests.

---
 tests/kms_chamelium.c | 336 ++++++++++++++++++++++++------------------
 1 file changed, 195 insertions(+), 141 deletions(-)
tests/kms_chamelium.c +79 -1
index 8da6ec20759e..1a0a02ca2890 100644
@@ -812,17 +812,179 @@ static const snd_pcm_format_t test_formats[] = {
 static const size_t test_formats_count = sizeof(test_formats) / sizeof(test_formats[0]);
 
 struct audio_state {
+	struct alsa *alsa;
+	struct chamelium *chamelium;
+	struct chamelium_port *port;
+	struct chamelium_stream *stream;
+
+	/* The capture format is only available after capture has started. */
+	struct {
+		snd_pcm_format_t format;
+		int channels;
+		int rate;
+	} playback, capture;
+
 	struct audio_signal *signal;
-	snd_pcm_format_t format;
+	int channel_mapping[8];
+
+	int dump_fd;
+	char *dump_path;
+
+	pthread_t thread;
 	atomic_bool run;
 };
 
+static void audio_state_init(struct audio_state *state, data_t *data,
+			     struct alsa *alsa, struct chamelium_port *port,
+			     snd_pcm_format_t format, int channels, int rate)
+{
+	memset(state, 0, sizeof(*state));
+	state->dump_fd = -1;
+
+	state->alsa = alsa;
+	state->chamelium = data->chamelium;
+	state->port = port;
+
+	state->playback.format = format;
+	state->playback.channels = channels;
+	state->playback.rate = rate;
+
+	alsa_configure_output(alsa, format, channels, rate);
+
+	state->stream = chamelium_stream_init();
+	igt_assert(state->stream);
+}
+
+static void audio_state_fini(struct audio_state *state)
+{
+	chamelium_stream_deinit(state->stream);
+}
+
+static void *run_audio_thread(void *data)
+{
+	struct alsa *alsa = data;
+
+	alsa_run(alsa, -1);
+	return NULL;
+}
+
+static void audio_state_start(struct audio_state *state)
+{
+	int ret;
+	bool ok;
+	size_t i, j;
+	enum chamelium_stream_realtime_mode stream_mode;
+	char dump_suffix[64];
+
+	igt_debug("Starting test with playback format %s, sampling rate %d Hz "
+		  "and %d channels\n",
+		  snd_pcm_format_name(state->playback.format),
+		  state->playback.rate, state->playback.channels);
+
+	chamelium_start_capturing_audio(state->chamelium, state->port, false);
+
+	stream_mode = CHAMELIUM_STREAM_REALTIME_STOP_WHEN_OVERFLOW;
+	ok = chamelium_stream_dump_realtime_audio(state->stream, stream_mode);
+	igt_assert(ok);
+
+	/* Start playing audio */
+	state->run = true;
+	ret = pthread_create(&state->thread, NULL,
+			     run_audio_thread, state->alsa);
+	igt_assert(ret == 0);
+
+	/* The Chamelium device only supports this PCM format. */
+	state->capture.format = SND_PCM_FORMAT_S32_LE;
Quoted 8 lines

tests/kms_chamelium.c static const snd_pcm_format_t test_formats[] = { · line 903

Quoted 6 lines
tests/kms_chamelium.c +6 -0
+
+	/* Only after we've started playing audio, we can retrieve the capture
+	 * format used by the Chamelium device. */
+	chamelium_get_audio_format(state->chamelium, state->port,
+				   &state->capture.rate,
+				   &state->capture.channels);

Is this a blocking call? If not, we have a race condition here...

Yeah, all Chameleon calls are blocking. This particular one also blocks until some audio is received on the Chamelium side.

Quoted 23 lines
Quoted 10 lines
tests/kms_chamelium.c +10 -0
+	if (state->capture.rate == 0) {
+		igt_debug("Audio receiver doesn't indicate the capture "
+			 "sampling rate, assuming it's %d Hz\n",
+			 state->playback.rate);
+		state->capture.rate = state->playback.rate;
+	}
+
+	chamelium_get_audio_channel_mapping(state->chamelium, state->port,
+					    state->channel_mapping);
+	/* Make sure we can capture all channels we send. */

tests/kms_chamelium.c static const snd_pcm_format_t test_formats[] = { · line 923

Quoted 10 lines
tests/kms_chamelium.c +10 -0
+	for (i = 0; i < state->playback.channels; i++) {
+		ok = false;
+		for (j = 0; j < state->capture.channels; j++) {
+			if (state->channel_mapping[j] == i) {
+				ok = true;
+				break;
+			}
+		}
+		igt_assert(ok);
+	}

Nice check!

Quoted 6 lines

tests/kms_chamelium.c static const snd_pcm_format_t test_formats[] = { · line 925

Quoted 2 lines
tests/kms_chamelium.c +2 -0
+
+	if (igt_frame_dump_is_enabled()) {

Maybe you should rename this function, now that it is also used to dump sound. How about igt_resource_dumping_is_enabled()? This does not have to happen in this patch though.

Yeah, this makes sense. But then we also need to rename the config option in .igtrc. Is that a concern? Do we need to keep support for the legacy configuration option?

Quoted 329 lines

This is a good patch:

Martin

Quoted 324 lines
tests/kms_chamelium.c +88 -140
+		snprintf(dump_suffix, sizeof(dump_suffix),
+			 "capture-%s-%dch-%dHz",
+			 snd_pcm_format_name(state->playback.format),
+			 state->playback.channels, state->playback.rate);
+
+		state->dump_fd = audio_create_wav_file_s32_le(dump_suffix,
+							      state->capture.rate,
+							      state->capture.channels,
+							      &state->dump_path);
+		igt_assert(state->dump_fd >= 0);
+	}
+}
+
+static void audio_state_stop(struct audio_state *state, bool success)
+{
+	bool ok;
+	int ret;
+	struct chamelium_audio_file *audio_file;
+
+	igt_debug("Stopping audio playback\n");
+	state->run = false;
+	ret = pthread_join(state->thread, NULL);
+	igt_assert(ret == 0);
+
+	ok = chamelium_stream_stop_realtime_audio(state->stream);
+	igt_assert(ok);
+
+	audio_file = chamelium_stop_capturing_audio(state->chamelium,
+						    state->port);
+	if (audio_file) {
+		igt_debug("Audio file saved on the Chamelium in %s\n",
+			  audio_file->path);
+		chamelium_destroy_audio_file(audio_file);
+	}
+
+	if (state->dump_fd >= 0) {
+		close(state->dump_fd);
+		state->dump_fd = -1;
+
+		if (success) {
+			/* Test succeeded, no need to keep the captured data */
+			unlink(state->dump_path);
+		} else
+			igt_debug("Saved captured audio data to %s\n",
+				  state->dump_path);
+		free(state->dump_path);
+		state->dump_path = NULL;
+	}
+
+	igt_debug("Audio test result for format %s, sampling rate %d Hz and "
+		  "%d channels: %s\n",
+		  snd_pcm_format_name(state->playback.format),
+		  state->playback.rate, state->playback.channels,
+		  success ? "ALL GREEN" : "FAILED");
+}
+
 static int
 audio_output_callback(void *data, void *buffer, int samples)
 {
 	struct audio_state *state = data;
 
-	switch (state->format) {
+	switch (state->playback.format) {
 	case SND_PCM_FORMAT_S16_LE:
 		audio_signal_fill_s16_le(state->signal, buffer, samples);
 		break;
@@ -839,55 +1001,19 @@ audio_output_callback(void *data, void *buffer, int samples)
 	return state->run ? 0 : -1;
 }
 
-static void *
-run_audio_thread(void *data)
+static bool do_test_display_audio(struct audio_state *state)
 {
-	struct alsa *alsa = data;
-
-	alsa_run(alsa, -1);
-	return NULL;
-}
-
-static bool
-do_test_display_audio(data_t *data, struct chamelium_port *port,
-		      struct alsa *alsa, snd_pcm_format_t playback_format,
-		      int playback_channels, int playback_rate)
-{
-	int ret, capture_rate, capture_channels, msec, freq, step;
-	struct chamelium_audio_file *audio_file;
-	struct chamelium_stream *stream;
-	enum chamelium_stream_realtime_mode stream_mode;
-	struct audio_signal *signal;
+	int msec, freq, step;
 	int32_t *recv, *buf;
 	double *channel;
 	size_t i, j, streak, page_count;
 	size_t recv_len, buf_len, buf_cap, buf_size, channel_len;
 	bool ok, success;
-	char dump_suffix[64];
-	char *dump_path = NULL;
-	int dump_fd = -1;
-	pthread_t thread;
-	struct audio_state state = {};
-	int channel_mapping[8], capture_chan;
-
-	igt_debug("Testing with playback format %s, sampling rate %d Hz and "
-		  "%d channels\n",
-		  snd_pcm_format_name(playback_format),
-		  playback_rate, playback_channels);
-	alsa_configure_output(alsa, playback_format,
-			      playback_channels, playback_rate);
+	int capture_chan;
 
-	chamelium_start_capturing_audio(data->chamelium, port, false);
-
-	stream = chamelium_stream_init();
-	igt_assert(stream);
-
-	stream_mode = CHAMELIUM_STREAM_REALTIME_STOP_WHEN_OVERFLOW;
-	ok = chamelium_stream_dump_realtime_audio(stream, stream_mode);
-	igt_assert(ok);
-
-	signal = audio_signal_init(playback_channels, playback_rate);
-	igt_assert(signal);
+	state->signal = audio_signal_init(state->playback.channels,
+					  state->playback.rate);
+	igt_assert(state->signal);
 
 	/* We'll choose different frequencies per channel to make sure they are
 	 * independent from each other. To do so, we'll add a different offset
@@ -900,62 +1026,21 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 	 * later on. We cannot retrieve the capture rate before starting
 	 * playing audio, so we don't really have the choice.
 	 */
-	step = 2 * playback_rate / CAPTURE_SAMPLES;
+	step = 2 * state->playback.rate / CAPTURE_SAMPLES;
 	for (i = 0; i < test_frequencies_count; i++) {
-		for (j = 0; j < playback_channels; j++) {
+		for (j = 0; j < state->playback.channels; j++) {
 			freq = test_frequencies[i] + j * step;
-			audio_signal_add_frequency(signal, freq, j);
+			audio_signal_add_frequency(state->signal, freq, j);
 		}
 	}
-	audio_signal_synthesize(signal);
+	audio_signal_synthesize(state->signal);
 
-	state.signal = signal;
-	state.format = playback_format;
-	state.run = true;
-	alsa_register_output_callback(alsa, audio_output_callback, &state,
+	alsa_register_output_callback(state->alsa, audio_output_callback, state,
 				      PLAYBACK_SAMPLES);
 
-	/* Start playing audio */
-	ret = pthread_create(&thread, NULL, run_audio_thread, alsa);
-	igt_assert(ret == 0);
+	audio_state_start(state);
 
-	/* Only after we've started playing audio, we can retrieve the capture
-	 * format used by the Chamelium device. */
-	chamelium_get_audio_format(data->chamelium, port,
-				   &capture_rate, &capture_channels);
-	if (capture_rate == 0) {
-		igt_debug("Audio receiver doesn't indicate the capture "
-			 "sampling rate, assuming it's %d Hz\n", playback_rate);
-		capture_rate = playback_rate;
-	} else
-		igt_assert(capture_rate == playback_rate);
-
-	chamelium_get_audio_channel_mapping(data->chamelium, port,
-					    channel_mapping);
-	/* Make sure we can capture all channels we send. */
-	for (i = 0; i < playback_channels; i++) {
-		ok = false;
-		for (j = 0; j < capture_channels; j++) {
-			if (channel_mapping[j] == i) {
-				ok = true;
-				break;
-			}
-		}
-		igt_assert(ok);
-	}
-
-	if (igt_frame_dump_is_enabled()) {
-		snprintf(dump_suffix, sizeof(dump_suffix),
-			 "capture-%s-%dch-%dHz",
-			 snd_pcm_format_name(playback_format),
-			 playback_channels, playback_rate);
-
-		dump_fd = audio_create_wav_file_s32_le(dump_suffix,
-						       capture_rate,
-						       capture_channels,
-						       &dump_path);
-		igt_assert(dump_fd >= 0);
-	}
+	igt_assert(state->capture.rate == state->playback.rate);
 
 	/* Needs to be a multiple of 128, because that's the number of samples
 	 * we get per channel each time we receive an audio page from the
@@ -970,7 +1055,7 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 	channel_len = CAPTURE_SAMPLES;
 	channel = malloc(sizeof(double) * channel_len);
 
-	buf_cap = capture_channels * channel_len;
+	buf_cap = state->capture.channels * channel_len;
 	buf = malloc(sizeof(int32_t) * buf_cap);
 	buf_len = 0;
 
@@ -982,7 +1067,7 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 	msec = 0;
 	i = 0;
 	while (!success && msec < AUDIO_TIMEOUT) {
-		ok = chamelium_stream_receive_realtime_audio(stream,
+		ok = chamelium_stream_receive_realtime_audio(state->stream,
 							     &page_count,
 							     &recv, &recv_len);
 		igt_assert(ok);
@@ -994,26 +1079,27 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 			continue;
 		igt_assert(buf_len == buf_cap);
 
-		if (dump_fd >= 0) {
+		if (state->dump_fd >= 0) {
 			buf_size = buf_len * sizeof(int32_t);
-			igt_assert(write(dump_fd, buf, buf_size) == buf_size);
+			igt_assert(write(state->dump_fd, buf, buf_size) == buf_size);
 		}
 
-		msec = i * channel_len / (double) capture_rate * 1000;
+		msec = i * channel_len / (double) state->capture.rate * 1000;
 		igt_debug("Detecting audio signal, t=%d msec\n", msec);
 
-		for (j = 0; j < playback_channels; j++) {
-			capture_chan = channel_mapping[j];
+		for (j = 0; j < state->playback.channels; j++) {
+			capture_chan = state->channel_mapping[j];
 			igt_assert(capture_chan >= 0);
 			igt_debug("Processing channel %zu (captured as "
 				  "channel %d)\n", j, capture_chan);
 
 			audio_extract_channel_s32_le(channel, channel_len,
 						     buf, buf_len,
-						     capture_channels,
+						     state->capture.channels,
 						     capture_chan);
 
-			if (audio_signal_detect(signal, capture_rate, j,
+			if (audio_signal_detect(state->signal,
+						state->capture.rate, j,
 						channel, channel_len))
 				streak++;
 			else
@@ -1023,49 +1109,15 @@ do_test_display_audio(data_t *data, struct chamelium_port *port,
 		buf_len = 0;
 		i++;
 
-		success = streak == MIN_STREAK * playback_channels;
+		success = streak == MIN_STREAK * state->playback.channels;
 	}
 
-	igt_debug("Stopping audio playback\n");
-	state.run = false;
-	ret = pthread_join(thread, NULL);
-	igt_assert(ret == 0);
-
-	alsa_close_output(alsa);
-
-	igt_debug("Audio test result for format %s, sampling rate %d Hz and "
-		  "%d channels: %s\n",
-		  snd_pcm_format_name(playback_format),
-		  playback_rate, playback_channels,
-		  success ? "ALL GREEN" : "FAILED");
-
-	if (dump_fd >= 0) {
-		close(dump_fd);
-		if (success) {
-			/* Test succeeded, no need to keep the captured data */
-			unlink(dump_path);
-		} else
-			igt_debug("Saved captured audio data to %s\n", dump_path);
-		free(dump_path);
-	}
+	audio_state_stop(state, success);
 
 	free(recv);
 	free(buf);
 	free(channel);
-
-	ok = chamelium_stream_stop_realtime_audio(stream);
-	igt_assert(ok);
-
-	audio_file = chamelium_stop_capturing_audio(data->chamelium,
-						    port);
-	if (audio_file) {
-		igt_debug("Audio file saved on the Chamelium in %s\n",
-			  audio_file->path);
-		chamelium_destroy_audio_file(audio_file);
-	}
-
-	audio_signal_fini(signal);
-	chamelium_stream_deinit(stream);
+	audio_signal_fini(state->signal);
 
 	return success;
 }
@@ -1112,6 +1164,7 @@ test_display_audio(data_t *data, struct chamelium_port *port,
 	int fb_id, i, j;
 	int channels, sampling_rate;
 	snd_pcm_format_t format;
+	struct audio_state state;
 
 	igt_require(alsa_has_exclusive_access());
 
@@ -1161,9 +1214,10 @@ test_display_audio(data_t *data, struct chamelium_port *port,
 
 			run = true;
 
-			success &= do_test_display_audio(data, port, alsa,
-							 format, channels,
-							 sampling_rate);
+			audio_state_init(&state, data, alsa, port,
+					 format, channels, sampling_rate);
+			success &= do_test_display_audio(&state);
+			audio_state_fini(&state);
 
Quoted 3 lines

tests/kms_chamelium.c test_display_audio(data_t *data, struct chamelium_port *port, · line 1223

Quoted 3 lines
tests/kms_chamelium.c +0 -0
 			alsa_close_output(alsa);
 		}

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

author
#4 lore raw

PATCH v2 2/9 tests/kms_chamelium: introduce audio_state_receive

In reply to Simon Ser

This extracts the logic receiving audio pages in do_test_display_audio into a new audio_state_receive function. The function takes care of updating the current msec counter and dumping the received data in a file.

---
 tests/kms_chamelium.c | 55 ++++++++++++++++++++++++++++---------------
 1 file changed, 36 insertions(+), 19 deletions(-)
tests/kms_chamelium.c +36 -19
index 1a0a02ca2890..6fdb9d68fcf2 100644
@@ -827,6 +827,9 @@ struct audio_state {
 	struct audio_signal *signal;
 	int channel_mapping[8];
 
+	size_t recv_pages;
+	int msec;
+
 	int dump_fd;
 	char *dump_path;
 
@@ -876,6 +879,9 @@ static void audio_state_start(struct audio_state *state)
 	enum chamelium_stream_realtime_mode stream_mode;
 	char dump_suffix[64];
 
+	state->recv_pages = 0;
+	state->msec = 0;
+
 	igt_debug("Starting test with playback format %s, sampling rate %d Hz "
 		  "and %d channels\n",
 		  snd_pcm_format_name(state->playback.format),
@@ -936,6 +942,29 @@ static void audio_state_start(struct audio_state *state)
 	}
 }
 
+static void audio_state_receive(struct audio_state *state,
+				int32_t **recv, size_t *recv_len)
+{
+	bool ok;
+	size_t page_count;
+	size_t recv_size;
+
+	ok = chamelium_stream_receive_realtime_audio(state->stream,
+						     &page_count,
+						     recv, recv_len);
+	igt_assert(ok);
+
+	state->msec = state->recv_pages * *recv_len
+		      / (double) state->capture.channels
+		      / (double) state->capture.rate * 1000;
+	state->recv_pages++;
+
+	if (state->dump_fd >= 0) {
+		recv_size = *recv_len * sizeof(int32_t);
+		igt_assert(write(state->dump_fd, *recv, recv_size) == recv_size);
+	}
+}
+
 static void audio_state_stop(struct audio_state *state, bool success)
 {
 	bool ok;
@@ -1003,12 +1032,12 @@ audio_output_callback(void *data, void *buffer, int samples)
 
 static bool do_test_display_audio(struct audio_state *state)
 {
-	int msec, freq, step;
+	int freq, step;
 	int32_t *recv, *buf;
 	double *channel;
-	size_t i, j, streak, page_count;
-	size_t recv_len, buf_len, buf_cap, buf_size, channel_len;
-	bool ok, success;
+	size_t i, j, streak;
+	size_t recv_len, buf_len, buf_cap, channel_len;
+	bool success;
 	int capture_chan;
 
 	state->signal = audio_signal_init(state->playback.channels,
@@ -1064,13 +1093,8 @@ static bool do_test_display_audio(struct audio_state *state)
 
 	success = false;
 	streak = 0;
-	msec = 0;
-	i = 0;
-	while (!success && msec < AUDIO_TIMEOUT) {
-		ok = chamelium_stream_receive_realtime_audio(state->stream,
-							     &page_count,
-							     &recv, &recv_len);
-		igt_assert(ok);
+	while (!success && state->msec < AUDIO_TIMEOUT) {
+		audio_state_receive(state, &recv, &recv_len);
 
 		memcpy(&buf[buf_len], recv, recv_len * sizeof(int32_t));
 		buf_len += recv_len;
@@ -1079,13 +1103,7 @@ static bool do_test_display_audio(struct audio_state *state)
 			continue;
 		igt_assert(buf_len == buf_cap);
 
-		if (state->dump_fd >= 0) {
-			buf_size = buf_len * sizeof(int32_t);
-			igt_assert(write(state->dump_fd, buf, buf_size) == buf_size);
-		}
-
-		msec = i * channel_len / (double) state->capture.rate * 1000;
-		igt_debug("Detecting audio signal, t=%d msec\n", msec);
+		igt_debug("Detecting audio signal, t=%d msec\n", state->msec);
 
 		for (j = 0; j < state->playback.channels; j++) {
 			capture_chan = state->channel_mapping[j];
@@ -1107,7 +1125,6 @@ static bool do_test_display_audio(struct audio_state *state)
 		}
 
 		buf_len = 0;
-		i++;
 
 		success = streak == MIN_STREAK * state->playback.channels;
 	}
Signature · 6 lines
2.21.0

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
Reviewed-by on v2 2/9
#5 lore raw

Re: [igt-dev] [PATCH i-g-t v2 2/9] tests/kms_chamelium: introduce audio_state_receive

Quoted 3 lines · Simon Ser

This extracts the logic receiving audio pages in do_test_display_audio into a new audio_state_receive function. The function takes care of updating the current msec counter and dumping the received data in a file.

Quoted 110 lines
---
 tests/kms_chamelium.c | 55 ++++++++++++++++++++++++++++---------------
 1 file changed, 36 insertions(+), 19 deletions(-)
tests/kms_chamelium.c +36 -18
index 1a0a02ca2890..6fdb9d68fcf2 100644
@@ -827,6 +827,9 @@ struct audio_state {
 	struct audio_signal *signal;
 	int channel_mapping[8];
 
+	size_t recv_pages;
+	int msec;
+
 	int dump_fd;
 	char *dump_path;
 
@@ -876,6 +879,9 @@ static void audio_state_start(struct audio_state *state)
 	enum chamelium_stream_realtime_mode stream_mode;
 	char dump_suffix[64];
 
+	state->recv_pages = 0;
+	state->msec = 0;
+
 	igt_debug("Starting test with playback format %s, sampling rate %d Hz "
 		  "and %d channels\n",
 		  snd_pcm_format_name(state->playback.format),
@@ -936,6 +942,29 @@ static void audio_state_start(struct audio_state *state)
 	}
 }
 
+static void audio_state_receive(struct audio_state *state,
+				int32_t **recv, size_t *recv_len)
+{
+	bool ok;
+	size_t page_count;
+	size_t recv_size;
+
+	ok = chamelium_stream_receive_realtime_audio(state->stream,
+						     &page_count,
+						     recv, recv_len);
+	igt_assert(ok);
+
+	state->msec = state->recv_pages * *recv_len
+		      / (double) state->capture.channels
+		      / (double) state->capture.rate * 1000;
+	state->recv_pages++;
+
+	if (state->dump_fd >= 0) {
+		recv_size = *recv_len * sizeof(int32_t);
+		igt_assert(write(state->dump_fd, *recv, recv_size) == recv_size);
+	}
+}
+
 static void audio_state_stop(struct audio_state *state, bool success)
 {
 	bool ok;
@@ -1003,12 +1032,12 @@ audio_output_callback(void *data, void *buffer, int samples)
 
 static bool do_test_display_audio(struct audio_state *state)
 {
-	int msec, freq, step;
+	int freq, step;
 	int32_t *recv, *buf;
 	double *channel;
-	size_t i, j, streak, page_count;
-	size_t recv_len, buf_len, buf_cap, buf_size, channel_len;
-	bool ok, success;
+	size_t i, j, streak;
+	size_t recv_len, buf_len, buf_cap, channel_len;
+	bool success;
 	int capture_chan;
 
 	state->signal = audio_signal_init(state->playback.channels,
@@ -1064,13 +1093,8 @@ static bool do_test_display_audio(struct audio_state *state)
 
 	success = false;
 	streak = 0;
-	msec = 0;
-	i = 0;
-	while (!success && msec < AUDIO_TIMEOUT) {
-		ok = chamelium_stream_receive_realtime_audio(state->stream,
-							     &page_count,
-							     &recv, &recv_len);
-		igt_assert(ok);
+	while (!success && state->msec < AUDIO_TIMEOUT) {
+		audio_state_receive(state, &recv, &recv_len);
 
 		memcpy(&buf[buf_len], recv, recv_len * sizeof(int32_t));
 		buf_len += recv_len;
@@ -1079,13 +1103,7 @@ static bool do_test_display_audio(struct audio_state *state)
 			continue;
 		igt_assert(buf_len == buf_cap);
 
-		if (state->dump_fd >= 0) {
-			buf_size = buf_len * sizeof(int32_t);
-			igt_assert(write(state->dump_fd, buf, buf_size) == buf_size);
-		}
-
-		msec = i * channel_len / (double) state->capture.rate * 1000;
-		igt_debug("Detecting audio signal, t=%d msec\n", msec);
+		igt_debug("Detecting audio signal, t=%d msec\n", state->msec);
 
 		for (j = 0; j < state->playback.channels; j++) {
 			capture_chan = state->channel_mapping[j];

tests/kms_chamelium.c static bool do_test_display_audio(struct audio_state *state) · line 1130

Quoted 7 lines
tests/kms_chamelium.c +0 -1
@@ -1107,7 +1125,6 @@ static bool do_test_display_audio(struct audio_state *state)
 		}
 
 		buf_len = 0;
-		i++;
 
 		success = streak == MIN_STREAK * state->playback.channels;
 	}

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

author
#6 lore raw

PATCH v2 3/9 tests/kms_chamelium: rename do_test_display_audio and test_audio_configuration

In reply to Simon Ser

- Rename do_test_display_audio to test_audio_frequencies to prepare for a future amplitude/delay test
- Rename test_audio_configuration to check_audio_configuration because this function doesn't execute any test, it just checks whether we can perform audio tests using a particular configuration

---
 tests/kms_chamelium.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)
tests/kms_chamelium.c +9 -8
index 6fdb9d68fcf2..9c8f51e8798b 100644
@@ -1009,7 +1009,7 @@ static void audio_state_stop(struct audio_state *state, bool success)
 }
 
 static int
-audio_output_callback(void *data, void *buffer, int samples)
+audio_output_frequencies_callback(void *data, void *buffer, int samples)
 {
 	struct audio_state *state = data;
 
@@ -1030,7 +1030,7 @@ audio_output_callback(void *data, void *buffer, int samples)
 	return state->run ? 0 : -1;
 }
 
-static bool do_test_display_audio(struct audio_state *state)
+static bool test_audio_frequencies(struct audio_state *state)
 {
 	int freq, step;
 	int32_t *recv, *buf;
@@ -1064,7 +1064,8 @@ static bool do_test_display_audio(struct audio_state *state)
 	}
 	audio_signal_synthesize(state->signal);
 
-	alsa_register_output_callback(state->alsa, audio_output_callback, state,
+	alsa_register_output_callback(state->alsa,
+				      audio_output_frequencies_callback, state,
 				      PLAYBACK_SAMPLES);
 
 	audio_state_start(state);
@@ -1139,8 +1140,8 @@ static bool do_test_display_audio(struct audio_state *state)
 	return success;
 }
 
-static bool test_audio_configuration(struct alsa *alsa, snd_pcm_format_t format,
-				     int channels, int sampling_rate)
+static bool check_audio_configuration(struct alsa *alsa, snd_pcm_format_t format,
+				      int channels, int sampling_rate)
 {
 	if (!alsa_test_output_configuration(alsa, format, channels,
 					    sampling_rate)) {
@@ -1225,15 +1226,15 @@ test_display_audio(data_t *data, struct chamelium_port *port,
 			channels = PLAYBACK_CHANNELS;
 			sampling_rate = test_sampling_rates[i];
 
-			if (!test_audio_configuration(alsa, format, channels,
-						      sampling_rate))
+			if (!check_audio_configuration(alsa, format, channels,
+						       sampling_rate))
 				continue;
 
 			run = true;
 
 			audio_state_init(&state, data, alsa, port,
 					 format, channels, sampling_rate);
-			success &= do_test_display_audio(&state);
+			success &= test_audio_frequencies(&state);
 			audio_state_fini(&state);
 
 			alsa_close_output(alsa);
Signature · 6 lines
2.21.0

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
Reviewed-by on v2 3/9
#7 lore raw

Re: [igt-dev] [PATCH i-g-t v2 3/9] tests/kms_chamelium: rename do_test_display_audio and test_audio_configuration

Quoted 7 lines · Simon Ser

- Rename do_test_display_audio to test_audio_frequencies to prepare for a future amplitude/delay test
- Rename test_audio_configuration to check_audio_configuration because this function doesn't execute any test, it just checks whether we can perform audio tests using a particular configuration

Quoted 57 lines
---
 tests/kms_chamelium.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)
tests/kms_chamelium.c +8 -7
index 6fdb9d68fcf2..9c8f51e8798b 100644
@@ -1009,7 +1009,7 @@ static void audio_state_stop(struct audio_state *state, bool success)
 }
 
 static int
-audio_output_callback(void *data, void *buffer, int samples)
+audio_output_frequencies_callback(void *data, void *buffer, int samples)
 {
 	struct audio_state *state = data;
 
@@ -1030,7 +1030,7 @@ audio_output_callback(void *data, void *buffer, int samples)
 	return state->run ? 0 : -1;
 }
 
-static bool do_test_display_audio(struct audio_state *state)
+static bool test_audio_frequencies(struct audio_state *state)
 {
 	int freq, step;
 	int32_t *recv, *buf;
@@ -1064,7 +1064,8 @@ static bool do_test_display_audio(struct audio_state *state)
 	}
 	audio_signal_synthesize(state->signal);
 
-	alsa_register_output_callback(state->alsa, audio_output_callback, state,
+	alsa_register_output_callback(state->alsa,
+				      audio_output_frequencies_callback, state,
 				      PLAYBACK_SAMPLES);
 
 	audio_state_start(state);
@@ -1139,8 +1140,8 @@ static bool do_test_display_audio(struct audio_state *state)
 	return success;
 }
 
-static bool test_audio_configuration(struct alsa *alsa, snd_pcm_format_t format,
-				     int channels, int sampling_rate)
+static bool check_audio_configuration(struct alsa *alsa, snd_pcm_format_t format,
+				      int channels, int sampling_rate)
 {
 	if (!alsa_test_output_configuration(alsa, format, channels,
 					    sampling_rate)) {
@@ -1225,15 +1226,15 @@ test_display_audio(data_t *data, struct chamelium_port *port,
 			channels = PLAYBACK_CHANNELS;
 			sampling_rate = test_sampling_rates[i];
 
-			if (!test_audio_configuration(alsa, format, channels,
-						      sampling_rate))
+			if (!check_audio_configuration(alsa, format, channels,
+						       sampling_rate))
 				continue;

tests/kms_chamelium.c test_display_audio(data_t *data, struct chamelium_port *port, · line 1240

Quoted 10 lines
tests/kms_chamelium.c +1 -1
 
 			run = true;
 
 			audio_state_init(&state, data, alsa, port,
 					 format, channels, sampling_rate);
-			success &= do_test_display_audio(&state);
+			success &= test_audio_frequencies(&state);
 			audio_state_fini(&state);
 
 			alsa_close_output(alsa);

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

author
#8 lore raw

PATCH v2 4/9 tests/kms_chamelium: explain why 8-channel tests aren't performed

In reply to Simon Ser

Also add a reference to the relevant Chromium bug.

---
 tests/kms_chamelium.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
tests/kms_chamelium.c +3 -1
index 9c8f51e8798b..56918a3b43fc 100644
@@ -1221,7 +1221,9 @@ test_display_audio(data_t *data, struct chamelium_port *port,
 			ret = alsa_open_output(alsa, audio_device);
 			igt_assert(ret >= 0);
 
-			/* TODO: playback on all 8 available channels */
+			/* TODO: playback on all 8 available channels (this
+			 * isn't supported by Chamelium devices yet, see
+			 * https://crbug.com/950917) */
 			format = test_formats[j];
 			channels = PLAYBACK_CHANNELS;
 			sampling_rate = test_sampling_rates[i];
Signature · 6 lines
2.21.0

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
Reviewed-by on v2 4/9
#9 lore raw

Re: [igt-dev] [PATCH i-g-t v2 4/9] tests/kms_chamelium: explain why 8-channel tests aren't performed

Quoted 3 lines · Simon Ser

Also add a reference to the relevant Chromium bug.

Quoted 10 lines
---
 tests/kms_chamelium.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
tests/kms_chamelium.c +0 -0
index 9c8f51e8798b..56918a3b43fc 100644

tests/kms_chamelium.c test_display_audio(data_t *data, struct chamelium_port *port, · line 1229

Quoted 10 lines
tests/kms_chamelium.c +3 -1
@@ -1221,7 +1221,9 @@ test_display_audio(data_t *data, struct chamelium_port *port,
 			ret = alsa_open_output(alsa, audio_device);
 			igt_assert(ret >= 0);
 
-			/* TODO: playback on all 8 available channels */
+			/* TODO: playback on all 8 available channels (this
+			 * isn't supported by Chamelium devices yet, see
+			 * https://crbug.com/950917) */
 			format = test_formats[j];
 			channels = PLAYBACK_CHANNELS;
 			sampling_rate = test_sampling_rates[i];

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

author
#10 lore raw

PATCH v2 5/9 lib/igt_audio: introduce audio_convert_to

In reply to Simon Ser

This function converts normalized doubles into an ALSA PCM format.

Instead of having per-format audio_signal_fill_* functions, we can only have audio_signal_fill that outputs normalized doubles. Then in ALSA's playback callback, we can simply use the new audio_convert_to function to fill the buffer.

This makes the test code simpler and prevents code duplication when another ALSA playback callback is implemented.

This adds a dependency of igt_audio over ALSA for the PCM format enum, but I don't think this is a concern, since I don't see the point of using igt_audio without igt_alsa. If this is an issue, it would always be possible to replace ALSA's enum with our own in the future.

---
 lib/igt_audio.c       | 87 +++++++++++++++++++++----------------------
 lib/igt_audio.h       | 12 +++---
 tests/kms_chamelium.c | 22 ++++-------
 3 files changed, 55 insertions(+), 66 deletions(-)
lib/igt_audio.c +42 -45
index 376e04ba6ed6..f2aac0e23a37 100644
@@ -304,51 +304,6 @@ void audio_signal_fill(struct audio_signal *signal, double *buffer,
 	audio_sanity_check(buffer, signal->channels * samples);
 }
 
-void audio_signal_fill_s16_le(struct audio_signal *signal, int16_t *buffer,
-			      size_t samples)
-{
-	double *tmp;
-	size_t i;
-
-	tmp = malloc(sizeof(double) * signal->channels * samples);
-	audio_signal_fill(signal, tmp, samples);
-
-	for (i = 0; i < signal->channels * samples; ++i)
-		buffer[i] = INT16_MAX * tmp[i];
-
-	free(tmp);
-}
-
-void audio_signal_fill_s24_le(struct audio_signal *signal, int32_t *buffer,
-			      size_t samples)
-{
-	double *tmp;
-	size_t i;
-
-	tmp = malloc(sizeof(double) * signal->channels * samples);
-	audio_signal_fill(signal, tmp, samples);
-
-	for (i = 0; i < signal->channels * samples; ++i)
-		buffer[i] = 0x7FFFFF * tmp[i];
-
-	free(tmp);
-}
-
-void audio_signal_fill_s32_le(struct audio_signal *signal, int32_t *buffer,
-			      size_t samples)
-{
-	double *tmp;
-	size_t i;
-
-	tmp = malloc(sizeof(double) * signal->channels * samples);
-	audio_signal_fill(signal, tmp, samples);
-
-	for (i = 0; i < signal->channels * samples; ++i)
-		buffer[i] = INT32_MAX * tmp[i];
-
-	free(tmp);
-}
-
 /**
  * Checks that frequencies specified in signal, and only those, are included
  * in the input data.
@@ -508,6 +463,48 @@ size_t audio_extract_channel_s32_le(double *dst, size_t dst_cap,
 	return dst_len;
 }
 
+static void audio_convert_to_s16_le(int16_t *dst, double *src, size_t len)
+{
+	size_t i;
+
+	for (i = 0; i < len; ++i)
+		dst[i] = INT16_MAX * src[i];
+}
+
+static void audio_convert_to_s24_le(int32_t *dst, double *src, size_t len)
+{
+	size_t i;
+
+	for (i = 0; i < len; ++i)
+		dst[i] = 0x7FFFFF * src[i];
+}
+
+static void audio_convert_to_s32_le(int32_t *dst, double *src, size_t len)
+{
+	size_t i;
+
+	for (i = 0; i < len; ++i)
+		dst[i] = INT32_MAX * src[i];
+}
+
+void audio_convert_to(void *dst, double *src, size_t len,
+		      snd_pcm_format_t format)
+{
+	switch (format) {
+	case SND_PCM_FORMAT_S16_LE:
+		audio_convert_to_s16_le(dst, src, len);
+		break;
+	case SND_PCM_FORMAT_S24_LE:
+		audio_convert_to_s24_le(dst, src, len);
+		break;
+	case SND_PCM_FORMAT_S32_LE:
+		audio_convert_to_s32_le(dst, src, len);
+		break;
+	default:
+		assert(false); /* unreachable */
+	}
+}
+
 #define RIFF_TAG "RIFF"
 #define WAVE_TAG "WAVE"
 #define FMT_TAG "fmt "
lib/igt_audio.h +5 -7
index c8de70871faa..5c910c27304d 100644
@@ -32,6 +32,8 @@
 #include <stdbool.h>
 #include <stdint.h>
 
+#include <alsa/asoundlib.h>
+
 struct audio_signal;
 
 struct audio_signal *audio_signal_init(int channels, int sampling_rate);
@@ -41,18 +43,14 @@ int audio_signal_add_frequency(struct audio_signal *signal, int frequency,
 void audio_signal_synthesize(struct audio_signal *signal);
 void audio_signal_reset(struct audio_signal *signal);
 void audio_signal_fill(struct audio_signal *signal, double *buffer,
-		       size_t buffer_len);
-void audio_signal_fill_s16_le(struct audio_signal *signal, int16_t *buffer,
-			      size_t buffer_len);
-void audio_signal_fill_s24_le(struct audio_signal *signal, int32_t *buffer,
-			      size_t buffer_len);
-void audio_signal_fill_s32_le(struct audio_signal *signal, int32_t *buffer,
-			      size_t buffer_len);
+		       size_t samples);
 bool audio_signal_detect(struct audio_signal *signal, int sampling_rate,
 			 int channel, const double *samples, size_t samples_len);
 size_t audio_extract_channel_s32_le(double *dst, size_t dst_cap,
 				    int32_t *src, size_t src_len,
 				    int n_channels, int channel);
+void audio_convert_to(void *dst, double *src, size_t len,
+		      snd_pcm_format_t format);
 int audio_create_wav_file_s32_le(const char *qualifier, uint32_t sample_rate,
 				 uint16_t channels, char **path);
 
tests/kms_chamelium.c +8 -14
index 56918a3b43fc..063840721f46 100644
@@ -1012,20 +1012,14 @@ static int
 audio_output_frequencies_callback(void *data, void *buffer, int samples)
 {
 	struct audio_state *state = data;
-
-	switch (state->playback.format) {
-	case SND_PCM_FORMAT_S16_LE:
-		audio_signal_fill_s16_le(state->signal, buffer, samples);
-		break;
-	case SND_PCM_FORMAT_S24_LE:
-		audio_signal_fill_s24_le(state->signal, buffer, samples);
-		break;
-	case SND_PCM_FORMAT_S32_LE:
-		audio_signal_fill_s32_le(state->signal, buffer, samples);
-		break;
-	default:
-		assert(false); /* unreachable */
-	}
+	double *tmp;
+	size_t len;
+
+	len = samples * state->playback.channels;
+	tmp = malloc(len * sizeof(double));
+	audio_signal_fill(state->signal, tmp, samples);
+	audio_convert_to(buffer, tmp, len, state->playback.format);
+	free(tmp);
 
 	return state->run ? 0 : -1;
 }
Signature · 6 lines
2.21.0

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
Reviewed-by on v2 5/9
#11 lore raw

Re: [igt-dev] [PATCH i-g-t v2 5/9] lib/igt_audio: introduce audio_convert_to

Quoted 10 lines · Simon Ser

This function converts normalized doubles into an ALSA PCM format.

Instead of having per-format audio_signal_fill_* functions, we can only have audio_signal_fill that outputs normalized doubles. Then in ALSA's playback callback, we can simply use the new audio_convert_to function to fill the buffer.

This makes the test code simpler and prevents code duplication when another ALSA playback callback is implemented.

Quoted 6 lines

This adds a dependency of igt_audio over ALSA for the PCM format enum, but I don't think this is a concern, since I don't see the point of using igt_audio without igt_alsa. If this is an issue, it would always be possible to replace ALSA's enum with our own in the future.

Yeah, this is a better design!

Quoted 170 lines
---
 lib/igt_audio.c       | 87 +++++++++++++++++++++----------------------
 lib/igt_audio.h       | 12 +++---
 tests/kms_chamelium.c | 22 ++++-------
 3 files changed, 55 insertions(+), 66 deletions(-)
lib/igt_audio.c +42 -45
index 376e04ba6ed6..f2aac0e23a37 100644
@@ -304,51 +304,6 @@ void audio_signal_fill(struct audio_signal *signal, double *buffer,
 	audio_sanity_check(buffer, signal->channels * samples);
 }
 
-void audio_signal_fill_s16_le(struct audio_signal *signal, int16_t *buffer,
-			      size_t samples)
-{
-	double *tmp;
-	size_t i;
-
-	tmp = malloc(sizeof(double) * signal->channels * samples);
-	audio_signal_fill(signal, tmp, samples);
-
-	for (i = 0; i < signal->channels * samples; ++i)
-		buffer[i] = INT16_MAX * tmp[i];
-
-	free(tmp);
-}
-
-void audio_signal_fill_s24_le(struct audio_signal *signal, int32_t *buffer,
-			      size_t samples)
-{
-	double *tmp;
-	size_t i;
-
-	tmp = malloc(sizeof(double) * signal->channels * samples);
-	audio_signal_fill(signal, tmp, samples);
-
-	for (i = 0; i < signal->channels * samples; ++i)
-		buffer[i] = 0x7FFFFF * tmp[i];
-
-	free(tmp);
-}
-
-void audio_signal_fill_s32_le(struct audio_signal *signal, int32_t *buffer,
-			      size_t samples)
-{
-	double *tmp;
-	size_t i;
-
-	tmp = malloc(sizeof(double) * signal->channels * samples);
-	audio_signal_fill(signal, tmp, samples);
-
-	for (i = 0; i < signal->channels * samples; ++i)
-		buffer[i] = INT32_MAX * tmp[i];
-
-	free(tmp);
-}
-
 /**
  * Checks that frequencies specified in signal, and only those, are included
  * in the input data.
@@ -508,6 +463,48 @@ size_t audio_extract_channel_s32_le(double *dst, size_t dst_cap,
 	return dst_len;
 }
 
+static void audio_convert_to_s16_le(int16_t *dst, double *src, size_t len)
+{
+	size_t i;
+
+	for (i = 0; i < len; ++i)
+		dst[i] = INT16_MAX * src[i];
+}
+
+static void audio_convert_to_s24_le(int32_t *dst, double *src, size_t len)
+{
+	size_t i;
+
+	for (i = 0; i < len; ++i)
+		dst[i] = 0x7FFFFF * src[i];
+}
+
+static void audio_convert_to_s32_le(int32_t *dst, double *src, size_t len)
+{
+	size_t i;
+
+	for (i = 0; i < len; ++i)
+		dst[i] = INT32_MAX * src[i];
+}
+
+void audio_convert_to(void *dst, double *src, size_t len,
+		      snd_pcm_format_t format)
+{
+	switch (format) {
+	case SND_PCM_FORMAT_S16_LE:
+		audio_convert_to_s16_le(dst, src, len);
+		break;
+	case SND_PCM_FORMAT_S24_LE:
+		audio_convert_to_s24_le(dst, src, len);
+		break;
+	case SND_PCM_FORMAT_S32_LE:
+		audio_convert_to_s32_le(dst, src, len);
+		break;
+	default:
+		assert(false); /* unreachable */
+	}
+}
+
 #define RIFF_TAG "RIFF"
 #define WAVE_TAG "WAVE"
 #define FMT_TAG "fmt "
lib/igt_audio.h +5 -7
index c8de70871faa..5c910c27304d 100644
@@ -32,6 +32,8 @@
 #include <stdbool.h>
 #include <stdint.h>
 
+#include <alsa/asoundlib.h>
+
 struct audio_signal;
 
 struct audio_signal *audio_signal_init(int channels, int sampling_rate);
@@ -41,18 +43,14 @@ int audio_signal_add_frequency(struct audio_signal *signal, int frequency,
 void audio_signal_synthesize(struct audio_signal *signal);
 void audio_signal_reset(struct audio_signal *signal);
 void audio_signal_fill(struct audio_signal *signal, double *buffer,
-		       size_t buffer_len);
-void audio_signal_fill_s16_le(struct audio_signal *signal, int16_t *buffer,
-			      size_t buffer_len);
-void audio_signal_fill_s24_le(struct audio_signal *signal, int32_t *buffer,
-			      size_t buffer_len);
-void audio_signal_fill_s32_le(struct audio_signal *signal, int32_t *buffer,
-			      size_t buffer_len);
+		       size_t samples);
 bool audio_signal_detect(struct audio_signal *signal, int sampling_rate,
 			 int channel, const double *samples, size_t samples_len);
 size_t audio_extract_channel_s32_le(double *dst, size_t dst_cap,
 				    int32_t *src, size_t src_len,
 				    int n_channels, int channel);
+void audio_convert_to(void *dst, double *src, size_t len,
+		      snd_pcm_format_t format);
 int audio_create_wav_file_s32_le(const char *qualifier, uint32_t sample_rate,
 				 uint16_t channels, char **path);
 
tests/kms_chamelium.c +1 -14
index 56918a3b43fc..063840721f46 100644
@@ -1012,20 +1012,14 @@ static int
 audio_output_frequencies_callback(void *data, void *buffer, int samples)
 {
 	struct audio_state *state = data;
-
-	switch (state->playback.format) {
-	case SND_PCM_FORMAT_S16_LE:
-		audio_signal_fill_s16_le(state->signal, buffer, samples);
-		break;
-	case SND_PCM_FORMAT_S24_LE:
-		audio_signal_fill_s24_le(state->signal, buffer, samples);
-		break;
-	case SND_PCM_FORMAT_S32_LE:
-		audio_signal_fill_s32_le(state->signal, buffer, samples);
-		break;
-	default:
-		assert(false); /* unreachable */
-	}
+	double *tmp;

tests/kms_chamelium.c static int · line 1025

Quoted 10 lines
tests/kms_chamelium.c +7 -0
+	size_t len;
+
+	len = samples * state->playback.channels;
+	tmp = malloc(len * sizeof(double));
+	audio_signal_fill(state->signal, tmp, samples);
+	audio_convert_to(buffer, tmp, len, state->playback.format);
+	free(tmp);
 
 	return state->run ? 0 : -1;
 }

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

author
#12 lore raw

PATCH v2 6/9 tests/kms_chamelium: add name parameter to audio_state_start

In reply to Simon Ser

This identifies the audio test name. This is required for adding multiple audio tests.

---
 tests/kms_chamelium.c | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)
tests/kms_chamelium.c +12 -10
index 063840721f46..14262831c3ff 100644
@@ -824,6 +824,7 @@ struct audio_state {
 		int rate;
 	} playback, capture;
 
+	const char *name;
 	struct audio_signal *signal;
 	int channel_mapping[8];
 
@@ -871,7 +872,7 @@ static void *run_audio_thread(void *data)
 	return NULL;
 }
 
-static void audio_state_start(struct audio_state *state)
+static void audio_state_start(struct audio_state *state, const char *name)
 {
 	int ret;
 	bool ok;
@@ -879,12 +880,13 @@ static void audio_state_start(struct audio_state *state)
 	enum chamelium_stream_realtime_mode stream_mode;
 	char dump_suffix[64];
 
+	state->name = name;
 	state->recv_pages = 0;
 	state->msec = 0;
 
-	igt_debug("Starting test with playback format %s, sampling rate %d Hz "
-		  "and %d channels\n",
-		  snd_pcm_format_name(state->playback.format),
+	igt_debug("Starting %s test with playback format %s, "
+		  "sampling rate %d Hz and %d channels\n",
+		  name, snd_pcm_format_name(state->playback.format),
 		  state->playback.rate, state->playback.channels);
 
 	chamelium_start_capturing_audio(state->chamelium, state->port, false);
@@ -930,8 +932,8 @@ static void audio_state_start(struct audio_state *state)
 
 	if (igt_frame_dump_is_enabled()) {
 		snprintf(dump_suffix, sizeof(dump_suffix),
-			 "capture-%s-%dch-%dHz",
-			 snd_pcm_format_name(state->playback.format),
+			 "capture-%s-%s-%dch-%dHz",
+			 name, snd_pcm_format_name(state->playback.format),
 			 state->playback.channels, state->playback.rate);
 
 		state->dump_fd = audio_create_wav_file_s32_le(dump_suffix,
@@ -1001,9 +1003,9 @@ static void audio_state_stop(struct audio_state *state, bool success)
 		state->dump_path = NULL;
 	}
 
-	igt_debug("Audio test result for format %s, sampling rate %d Hz and "
-		  "%d channels: %s\n",
-		  snd_pcm_format_name(state->playback.format),
+	igt_debug("Audio %s test result for format %s, sampling rate %d Hz "
+		  "and %d channels: %s\n",
+		  state->name, snd_pcm_format_name(state->playback.format),
 		  state->playback.rate, state->playback.channels,
 		  success ? "ALL GREEN" : "FAILED");
 }
@@ -1062,7 +1064,7 @@ static bool test_audio_frequencies(struct audio_state *state)
 				      audio_output_frequencies_callback, state,
 				      PLAYBACK_SAMPLES);
 
-	audio_state_start(state);
+	audio_state_start(state, "frequencies");
 
 	igt_assert(state->capture.rate == state->playback.rate);
 
Signature · 6 lines
2.21.0

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
Reviewed-by on v2 6/9
#13 lore raw

Re: [igt-dev] [PATCH i-g-t v2 6/9] tests/kms_chamelium: add name parameter to audio_state_start

Quoted 30 lines · Simon Ser

This identifies the audio test name. This is required for adding multiple audio tests.

---
 tests/kms_chamelium.c | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)
tests/kms_chamelium.c +2 -1
index 063840721f46..14262831c3ff 100644
@@ -824,6 +824,7 @@ struct audio_state {
 		int rate;
 	} playback, capture;
 
+	const char *name;
 	struct audio_signal *signal;
 	int channel_mapping[8];
 
@@ -871,7 +872,7 @@ static void *run_audio_thread(void *data)
 	return NULL;
 }
 
-static void audio_state_start(struct audio_state *state)
+static void audio_state_start(struct audio_state *state, const char *name)
 {
 	int ret;
 	bool ok;

tests/kms_chamelium.c static void audio_state_start(struct audio_state *state) · line 883

Quoted 4 lines
tests/kms_chamelium.c +1 -0
@@ -879,12 +880,13 @@ static void audio_state_start(struct audio_state *state)
 	enum chamelium_stream_realtime_mode stream_mode;
 	char dump_suffix[64];
 
+	state->name = name;

This is a little dangerous since the name could have been allocated on the stack of the caller, which could lead to a use after free later on.

With this replaced with strdup and a free(state->name) in the fini function, the patch is:

Quoted 38 lines
tests/kms_chamelium.c +8 -8
 	state->recv_pages = 0;
 	state->msec = 0;
 
-	igt_debug("Starting test with playback format %s, sampling rate %d Hz "
-		  "and %d channels\n",
-		  snd_pcm_format_name(state->playback.format),
+	igt_debug("Starting %s test with playback format %s, "
+		  "sampling rate %d Hz and %d channels\n",
+		  name, snd_pcm_format_name(state->playback.format),
 		  state->playback.rate, state->playback.channels);
 
 	chamelium_start_capturing_audio(state->chamelium, state->port, false);
@@ -930,8 +932,8 @@ static void audio_state_start(struct audio_state *state)
 
 	if (igt_frame_dump_is_enabled()) {
 		snprintf(dump_suffix, sizeof(dump_suffix),
-			 "capture-%s-%dch-%dHz",
-			 snd_pcm_format_name(state->playback.format),
+			 "capture-%s-%s-%dch-%dHz",
+			 name, snd_pcm_format_name(state->playback.format),
 			 state->playback.channels, state->playback.rate);
 
 		state->dump_fd = audio_create_wav_file_s32_le(dump_suffix,
@@ -1001,9 +1003,9 @@ static void audio_state_stop(struct audio_state *state, bool success)
 		state->dump_path = NULL;
 	}
 
-	igt_debug("Audio test result for format %s, sampling rate %d Hz and "
-		  "%d channels: %s\n",
-		  snd_pcm_format_name(state->playback.format),
+	igt_debug("Audio %s test result for format %s, sampling rate %d Hz "
+		  "and %d channels: %s\n",
+		  state->name, snd_pcm_format_name(state->playback.format),
 		  state->playback.rate, state->playback.channels,
 		  success ? "ALL GREEN" : "FAILED");
 }

tests/kms_chamelium.c static bool test_audio_frequencies(struct audio_state *state) · line 1070

Quoted 8 lines
tests/kms_chamelium.c +1 -1
@@ -1062,7 +1064,7 @@ static bool test_audio_frequencies(struct audio_state *state)
 				      audio_output_frequencies_callback, state,
 				      PLAYBACK_SAMPLES);
 
-	audio_state_start(state);
+	audio_state_start(state, "frequencies");
 
 	igt_assert(state->capture.rate == state->playback.rate);
 

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

author
#14 lore raw

PATCH v2 7/9 lib/igt_audio: make audio_extract_channel_s32_le support a NULL dst

In reply to Simon Ser

This adds a snprintf-like behaviour to audio_extract_channel_s32_le.

---
 lib/igt_audio.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)
lib/igt_audio.c +10 -1
index f2aac0e23a37..c7407fa1a97b 100644
@@ -445,7 +445,13 @@ bool audio_signal_detect(struct audio_signal *signal, int sampling_rate,
 }
 
 /**
- * Extracts a single channel from a multi-channel S32_LE input buffer.
+ * audio_extract_channel_s32_le: extracts a single channel from a multi-channel
+ * S32_LE input buffer.
+ *
+ * If dst_cap is zero, no copy is performed. This can be used to compute the
+ * minimum required capacity.
+ *
+ * Returns: the number of samples extracted.
  */
 size_t audio_extract_channel_s32_le(double *dst, size_t dst_cap,
 				    int32_t *src, size_t src_len,
@@ -456,6 +462,9 @@ size_t audio_extract_channel_s32_le(double *dst, size_t dst_cap,
 	igt_assert(channel < n_channels);
 	igt_assert(src_len % n_channels == 0);
 	dst_len = src_len / n_channels;
+	if (dst_cap == 0)
+		return dst_len;
+
 	igt_assert(dst_len <= dst_cap);
 	for (i = 0; i < dst_len; i++)
 		dst[i] = (double) src[i * n_channels + channel] / INT32_MAX;
Signature · 6 lines
2.21.0

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
Reviewed-by on v2 7/9
#15 lore raw

Re: [igt-dev] [PATCH i-g-t v2 7/9] lib/igt_audio: make audio_extract_channel_s32_le support a NULL dst

Quoted 3 lines · Simon Ser

This adds a snprintf-like behaviour to audio_extract_channel_s32_le.

Quoted 25 lines
---
 lib/igt_audio.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)
lib/igt_audio.c +7 -1
index f2aac0e23a37..c7407fa1a97b 100644
@@ -445,7 +445,13 @@ bool audio_signal_detect(struct audio_signal *signal, int sampling_rate,
 }
 
 /**
- * Extracts a single channel from a multi-channel S32_LE input buffer.
+ * audio_extract_channel_s32_le: extracts a single channel from a multi-channel
+ * S32_LE input buffer.
+ *
+ * If dst_cap is zero, no copy is performed. This can be used to compute the
+ * minimum required capacity.
+ *
+ * Returns: the number of samples extracted.
  */
 size_t audio_extract_channel_s32_le(double *dst, size_t dst_cap,
 				    int32_t *src, size_t src_len,

lib/igt_audio.c size_t audio_extract_channel_s32_le(double *dst, size_t dst_cap, · line 470

Quoted 9 lines
lib/igt_audio.c +3 -0
@@ -456,6 +462,9 @@ size_t audio_extract_channel_s32_le(double *dst, size_t dst_cap,
 	igt_assert(channel < n_channels);
 	igt_assert(src_len % n_channels == 0);
 	dst_len = src_len / n_channels;
+	if (dst_cap == 0)
+		return dst_len;
+
 	igt_assert(dst_len <= dst_cap);
 	for (i = 0; i < dst_len; i++)
 		dst[i] = (double) src[i * n_channels + channel] / INT32_MAX;

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

author
#16 lore raw

PATCH v2 8/9 tests/kms_chamelium: add pulse audio test

In reply to Simon Ser

This commit adds a pulse test alongside the existing frequencies test.

The test sends an infinite pulse and checks that the amplitude is correct. A window is used to check that each sample is within acceptable bounds. The test is stopped as soon as 3 audio pages pass the test.

---
 tests/kms_chamelium.c | 100 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 100 insertions(+)
tests/kms_chamelium.c +100 -0
index 14262831c3ff..073feff0d32d 100644
@@ -772,6 +772,9 @@ test_display_frame_dump(data_t *data, struct chamelium_port *port)
 /* A streak of 3 gives confidence that the signal is good. */
 #define MIN_STREAK 3
 
+#define PULSE_AMPLITUDE 0.9 /* normalized, ie. in [0, 1] */
+#define PULSE_ACCURACY 0.001 /* ± 0.1 % of the full amplitude */
+
 /* TODO: enable >48KHz rates, these are not reliable */
 static int test_sampling_rates[] = {
 	32000,
@@ -1136,6 +1139,102 @@ static bool test_audio_frequencies(struct audio_state *state)
 	return success;
 }
 
+static int audio_output_pulse_callback(void *data, void *buffer, int samples)
+{
+	struct audio_state *state = data;
+	double *tmp;
+	size_t len, i;
+
+	len = samples * state->playback.channels;
+	tmp = malloc(len * sizeof(double));
+	for (i = 0; i < len; i++)
+		tmp[i] = PULSE_AMPLITUDE;
+	audio_convert_to(buffer, tmp, len, state->playback.format);
+	free(tmp);
+
+	return state->run ? 0 : -1;
+}
+
+static bool detect_pulse_amplitude(double *buf, size_t buf_len)
+{
+	double min, max;
+	size_t i;
+	bool ok;
+
+	min = max = NAN;
+	for (i = 0; i < buf_len; i++) {
+		if (isnan(min) || buf[i] < min)
+			min = buf[i];
+		if (isnan(max) || buf[i] > max)
+			max = buf[i];
+	}
+
+	ok = (min >= PULSE_AMPLITUDE - PULSE_ACCURACY &&
+	      max <= PULSE_AMPLITUDE + PULSE_ACCURACY);
+	if (ok)
+		igt_debug("Pulse detected\n");
+	else
+		igt_debug("Pulse not detected (min=%f, max=%f)\n",
+			  min, max);
+	return ok;
+}
+
+static bool test_audio_pulse(struct audio_state *state)
+{
+	bool success;
+	int32_t *recv;
+	size_t recv_len, i, channel_len;
+	int streak, capture_chan;
+	double *channel;
+
+	alsa_register_output_callback(state->alsa,
+				      audio_output_pulse_callback, state,
+				      PLAYBACK_SAMPLES);
+
+	audio_state_start(state, "pulse");
+
+	recv = NULL;
+	recv_len = 0;
+	success = false;
+	while (!success && state->msec < AUDIO_TIMEOUT) {
+		audio_state_receive(state, &recv, &recv_len);
+
+		igt_debug("Detecting audio signal, t=%d msec\n", state->msec);
+
+		for (i = 0; i < state->playback.channels; i++) {
+			capture_chan = state->channel_mapping[i];
+			igt_assert(capture_chan >= 0);
+			igt_debug("Processing channel %zu (captured as "
+				  "channel %d)\n", i, capture_chan);
+
+			channel_len = audio_extract_channel_s32_le(NULL, 0,
+								   recv, recv_len,
+								   state->capture.channels,
+								   capture_chan);
+			channel = malloc(channel_len * sizeof(double));
+			audio_extract_channel_s32_le(channel, channel_len,
+						     recv, recv_len,
+						     state->capture.channels,
+						     capture_chan);
+
+			if (detect_pulse_amplitude(channel, channel_len))
+				streak++;
+			else
+				streak = 0;
+
+			free(channel);
+		}
+
+		success = streak == MIN_STREAK * state->playback.channels;
+	}
+
+	audio_state_stop(state, success);
+
+	free(recv);
+
+	return success;
+}
+
 static bool check_audio_configuration(struct alsa *alsa, snd_pcm_format_t format,
 				      int channels, int sampling_rate)
 {
@@ -1233,6 +1332,7 @@ test_display_audio(data_t *data, struct chamelium_port *port,
 			audio_state_init(&state, data, alsa, port,
 					 format, channels, sampling_rate);
 			success &= test_audio_frequencies(&state);
+			success &= test_audio_pulse(&state);
 			audio_state_fini(&state);
 
 			alsa_close_output(alsa);
Signature · 6 lines
2.21.0

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
Reviewed-by on v2 8/9
#17 lore raw

Re: [igt-dev] [PATCH i-g-t v2 8/9] tests/kms_chamelium: add pulse audio test

The commit message is confusing because it might make people think this has anything to do with pulseaudio.

Also, you are not really producing a pulse anyway. How about renaming it square_wave, DC, or flatline?

Quoted 16 lines · Simon Ser

This commit adds a pulse test alongside the existing frequencies test.

The test sends an infinite pulse and checks that the amplitude is correct. A window is used to check that each sample is within acceptable bounds. The test is stopped as soon as 3 audio pages pass the test.

---
 tests/kms_chamelium.c | 100 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 100 insertions(+)
tests/kms_chamelium.c +0 -0
index 14262831c3ff..073feff0d32d 100644

tests/kms_chamelium.c test_display_frame_dump(data_t *data, struct chamelium_port *port) · line 776

Quoted 5 lines
tests/kms_chamelium.c +2 -0
@@ -772,6 +772,9 @@ test_display_frame_dump(data_t *data, struct chamelium_port *port)
 /* A streak of 3 gives confidence that the signal is good. */
 #define MIN_STREAK 3
 
+#define PULSE_AMPLITUDE 0.9 /* normalized, ie. in [0, 1] */
+#define PULSE_ACCURACY 0.001 /* ± 0.1 % of the full amplitude */

No space before %.

Quoted 109 lines
tests/kms_chamelium.c +97 -0
+
 /* TODO: enable >48KHz rates, these are not reliable */
 static int test_sampling_rates[] = {
 	32000,
@@ -1136,6 +1139,102 @@ static bool test_audio_frequencies(struct audio_state *state)
 	return success;
 }
 
+static int audio_output_pulse_callback(void *data, void *buffer, int samples)
+{
+	struct audio_state *state = data;
+	double *tmp;
+	size_t len, i;
+
+	len = samples * state->playback.channels;
+	tmp = malloc(len * sizeof(double));
+	for (i = 0; i < len; i++)
+		tmp[i] = PULSE_AMPLITUDE;
+	audio_convert_to(buffer, tmp, len, state->playback.format);
+	free(tmp);
+
+	return state->run ? 0 : -1;
+}
+
+static bool detect_pulse_amplitude(double *buf, size_t buf_len)
+{
+	double min, max;
+	size_t i;
+	bool ok;
+
+	min = max = NAN;
+	for (i = 0; i < buf_len; i++) {
+		if (isnan(min) || buf[i] < min)
+			min = buf[i];
+		if (isnan(max) || buf[i] > max)
+			max = buf[i];
+	}
+
+	ok = (min >= PULSE_AMPLITUDE - PULSE_ACCURACY &&
+	      max <= PULSE_AMPLITUDE + PULSE_ACCURACY);
+	if (ok)
+		igt_debug("Pulse detected\n");
+	else
+		igt_debug("Pulse not detected (min=%f, max=%f)\n",
+			  min, max);
+	return ok;
+}
+
+static bool test_audio_pulse(struct audio_state *state)
+{
+	bool success;
+	int32_t *recv;
+	size_t recv_len, i, channel_len;
+	int streak, capture_chan;
+	double *channel;
+
+	alsa_register_output_callback(state->alsa,
+				      audio_output_pulse_callback, state,
+				      PLAYBACK_SAMPLES);
+
+	audio_state_start(state, "pulse");
+
+	recv = NULL;
+	recv_len = 0;
+	success = false;
+	while (!success && state->msec < AUDIO_TIMEOUT) {
+		audio_state_receive(state, &recv, &recv_len);
+
+		igt_debug("Detecting audio signal, t=%d msec\n", state->msec);
+
+		for (i = 0; i < state->playback.channels; i++) {
+			capture_chan = state->channel_mapping[i];
+			igt_assert(capture_chan >= 0);
+			igt_debug("Processing channel %zu (captured as "
+				  "channel %d)\n", i, capture_chan);
+
+			channel_len = audio_extract_channel_s32_le(NULL, 0,
+								   recv, recv_len,
+								   state->capture.channels,
+								   capture_chan);
+			channel = malloc(channel_len * sizeof(double));
+			audio_extract_channel_s32_le(channel, channel_len,
+						     recv, recv_len,
+						     state->capture.channels,
+						     capture_chan);
+
+			if (detect_pulse_amplitude(channel, channel_len))
+				streak++;
+			else
+				streak = 0;
+
+			free(channel);
+		}
+
+		success = streak == MIN_STREAK * state->playback.channels;
+	}
+
+	audio_state_stop(state, success);
+
+	free(recv);
+
+	return success;
+}
+
 static bool check_audio_configuration(struct alsa *alsa, snd_pcm_format_t format,
 				      int channels, int sampling_rate)
 {

tests/kms_chamelium.c test_display_audio(data_t *data, struct chamelium_port *port, · line 1338

Quoted 7 lines
tests/kms_chamelium.c +1 -0
@@ -1233,6 +1332,7 @@ test_display_audio(data_t *data, struct chamelium_port *port,
 			audio_state_init(&state, data, alsa, port,
 					 format, channels, sampling_rate);
 			success &= test_audio_frequencies(&state);
+			success &= test_audio_pulse(&state);
 			audio_state_fini(&state);
 
 			alsa_close_output(alsa);

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

author
#18 lore raw

PATCH v2 9/9 tests/kms_chamelium: add audio channel alignment test

In reply to Simon Ser

The previous pulse test only checked the signal amplitude.

This commit adds a new check to the pulse test: channel alignment. This check makes sure there is no time shift between each channel.

This is achieved by first sending a positive signal and then a falling edge. Edges in each channel should be aligned.

The index of each channel's falling edge is stored in number of samples. I chose not to implement a per-page test because the edge could be right between two pages.

---
 tests/kms_chamelium.c | 101 ++++++++++++++++++++++++++++++++++++------
 1 file changed, 87 insertions(+), 14 deletions(-)
tests/kms_chamelium.c +87 -14
index 073feff0d32d..44d04a4d4aad 100644
@@ -773,7 +773,8 @@ test_display_frame_dump(data_t *data, struct chamelium_port *port)
 #define MIN_STREAK 3
 
 #define PULSE_AMPLITUDE 0.9 /* normalized, ie. in [0, 1] */
-#define PULSE_ACCURACY 0.001 /* ± 0.1 % of the full amplitude */
+#define PULSE_AMPLITUDE_ACCURACY 0.001 /* ± 0.1 % of the full amplitude */
+#define PULSE_ALIGN_ACCURACY 2 /* number of samples */
 
 /* TODO: enable >48KHz rates, these are not reliable */
 static int test_sampling_rates[] = {
@@ -828,7 +829,7 @@ struct audio_state {
 	} playback, capture;
 
 	const char *name;
-	struct audio_signal *signal;
+	struct audio_signal *signal; /* for frequencies test only */
 	int channel_mapping[8];
 
 	size_t recv_pages;
@@ -839,6 +840,7 @@ struct audio_state {
 
 	pthread_t thread;
 	atomic_bool run;
+	atomic_bool positive; /* for pulse test only */
 };
 
 static void audio_state_init(struct audio_state *state, data_t *data,
@@ -1148,16 +1150,16 @@ static int audio_output_pulse_callback(void *data, void *buffer, int samples)
 	len = samples * state->playback.channels;
 	tmp = malloc(len * sizeof(double));
 	for (i = 0; i < len; i++)
-		tmp[i] = PULSE_AMPLITUDE;
+		tmp[i] = state->positive ? PULSE_AMPLITUDE : -PULSE_AMPLITUDE;
 	audio_convert_to(buffer, tmp, len, state->playback.format);
 	free(tmp);
 
 	return state->run ? 0 : -1;
 }
 
-static bool detect_pulse_amplitude(double *buf, size_t buf_len)
+static bool detect_pulse_amplitude(double *buf, size_t buf_len, bool pos)
 {
-	double min, max;
+	double expected, min, max;
 	size_t i;
 	bool ok;
 
@@ -1169,34 +1171,64 @@ static bool detect_pulse_amplitude(double *buf, size_t buf_len)
 			max = buf[i];
 	}
 
-	ok = (min >= PULSE_AMPLITUDE - PULSE_ACCURACY &&
-	      max <= PULSE_AMPLITUDE + PULSE_ACCURACY);
+	expected = pos ? PULSE_AMPLITUDE : -PULSE_AMPLITUDE;
+	ok = (min >= expected - PULSE_AMPLITUDE_ACCURACY &&
+	      max <= expected + PULSE_AMPLITUDE_ACCURACY);
 	if (ok)
-		igt_debug("Pulse detected\n");
+		igt_debug("Pulse amplitude detected\n");
 	else
-		igt_debug("Pulse not detected (min=%f, max=%f)\n",
+		igt_debug("Pulse amplitude not detected (min=%f, max=%f)\n",
 			  min, max);
 	return ok;
 }
 
+static ssize_t detect_falling_edge(double *buf, size_t buf_len)
+{
+	size_t i;
+
+	for (i = 0; i < buf_len; i++) {
+		if (buf[i] < 0)
+			return i;
+	}
+
+	return -1;
+}
+
+/** test_audio_pulse:
+ *
+ * Send pulse signals (one infinite positive pulse followed by a negative one)
+ * and check that:
+ *
+ * - The amplitude of the pulses is correct
+ * - All channels switch from a positive signal to a negative one at the same
+ *   time (ie. all channels are aligned)
+ */
 static bool test_audio_pulse(struct audio_state *state)
 {
-	bool success;
+	bool success, amp_success, align_success;
 	int32_t *recv;
 	size_t recv_len, i, channel_len;
+	ssize_t j;
 	int streak, capture_chan;
 	double *channel;
+	int falling_edges[8];
 
 	alsa_register_output_callback(state->alsa,
 				      audio_output_pulse_callback, state,
 				      PLAYBACK_SAMPLES);
 
+	/* Start by sending a positive signal */
+	state->positive = true;
+
 	audio_state_start(state, "pulse");
 
+	for (i = 0; i < state->playback.channels; i++)
+		falling_edges[i] = -1;
+
 	recv = NULL;
 	recv_len = 0;
-	success = false;
-	while (!success && state->msec < AUDIO_TIMEOUT) {
+	amp_success = false;
+	while (!amp_success && state->msec < AUDIO_TIMEOUT) {
 		audio_state_receive(state, &recv, &recv_len);
 
 		igt_debug("Detecting audio signal, t=%d msec\n", state->msec);
@@ -1217,17 +1249,58 @@ static bool test_audio_pulse(struct audio_state *state)
 						     state->capture.channels,
 						     capture_chan);
 
-			if (detect_pulse_amplitude(channel, channel_len))
+			/* Check whether the amplitude is fine */
+			if (detect_pulse_amplitude(channel, channel_len,
+			    state->positive))
 				streak++;
 			else
 				streak = 0;
 
+			/* If we're now sending a negative signal, detect the
+			 * falling edge */
+			j = detect_falling_edge(channel, channel_len);
+			if (!state->positive && j >= 0) {
+				falling_edges[i] = recv_len * state->recv_pages
+						   + j;
+			}
+
 			free(channel);
 		}
 
-		success = streak == MIN_STREAK * state->playback.channels;
+		amp_success = streak == MIN_STREAK * state->playback.channels;
+
+		if (amp_success && state->positive) {
+			/* Switch to a negative signal after we've detected the
+			 * positive one. */
+			state->positive = false;
+			amp_success = false;
+			streak = 0;
+			igt_debug("Switching to negative pulse\n");
+		}
+	}
+
+	/* Check alignment between all channels by comparing the index of the
+	 * falling edge. */
+	align_success = true;
+	for (i = 0; i < state->playback.channels; i++) {
+		if (falling_edges[i] < 0) {
+			igt_debug("Falling edge not detected for channel %zu\n",
+				  i);
+			align_success = false;
+			continue;
+		}
+
+		if (abs(falling_edges[0] - falling_edges[i]) >
+		    PULSE_ALIGN_ACCURACY) {
+			igt_debug("Channel alignment mismatch: "
+				  "channel 0 has a falling edge at index %d "
+				  "while channel %zu has index %d\n",
+				  falling_edges[0], i, falling_edges[i]);
+			align_success = false;
+		}
 	}
 
+	success = amp_success && align_success;
 	audio_state_stop(state, success);
 
 	free(recv);
Signature · 6 lines
2.21.0

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
Reviewed-by on v2 9/9
#19 lore raw

Re: [igt-dev] [PATCH i-g-t v2 9/9] tests/kms_chamelium: add audio channel alignment test

Quoted 1 line · Simon Ser

The previous pulse test only checked the signal amplitude.

Don't forget to change the name here too.

Quoted 21 lines

This commit adds a new check to the pulse test: channel alignment. This check makes sure there is no time shift between each channel.

This is achieved by first sending a positive signal and then a falling edge. Edges in each channel should be aligned.

The index of each channel's falling edge is stored in number of samples. I chose not to implement a per-page test because the edge could be right between two pages.

---
 tests/kms_chamelium.c | 101 ++++++++++++++++++++++++++++++++++++------
 1 file changed, 87 insertions(+), 14 deletions(-)
tests/kms_chamelium.c +0 -0
index 073feff0d32d..44d04a4d4aad 100644

tests/kms_chamelium.c test_display_frame_dump(data_t *data, struct chamelium_port *port) · line 777

Quoted 6 lines
tests/kms_chamelium.c +2 -1
@@ -773,7 +773,8 @@ test_display_frame_dump(data_t *data, struct chamelium_port *port)
 #define MIN_STREAK 3
 
 #define PULSE_AMPLITUDE 0.9 /* normalized, ie. in [0, 1] */
-#define PULSE_ACCURACY 0.001 /* ± 0.1 % of the full amplitude */
+#define PULSE_AMPLITUDE_ACCURACY 0.001 /* ± 0.1 % of the full amplitude */
+#define PULSE_ALIGN_ACCURACY 2 /* number of samples */

This value is oddly specific. The chamelium cannot introduce any phase issue between the channels, so the only place where this could be introduced is the sound card (and its driver).

Until proven that some soundcard are failing at this, let's just limit the accuracy to 0 samples.

Quoted 80 lines
tests/kms_chamelium.c +31 -8
 /* TODO: enable >48KHz rates, these are not reliable */
 static int test_sampling_rates[] = {
@@ -828,7 +829,7 @@ struct audio_state {
 	} playback, capture;
 
 	const char *name;
-	struct audio_signal *signal;
+	struct audio_signal *signal; /* for frequencies test only */
 	int channel_mapping[8];
 
 	size_t recv_pages;
@@ -839,6 +840,7 @@ struct audio_state {
 
 	pthread_t thread;
 	atomic_bool run;
+	atomic_bool positive; /* for pulse test only */
 };
 
 static void audio_state_init(struct audio_state *state, data_t *data,
@@ -1148,16 +1150,16 @@ static int audio_output_pulse_callback(void *data, void *buffer, int samples)
 	len = samples * state->playback.channels;
 	tmp = malloc(len * sizeof(double));
 	for (i = 0; i < len; i++)
-		tmp[i] = PULSE_AMPLITUDE;
+		tmp[i] = state->positive ? PULSE_AMPLITUDE : -PULSE_AMPLITUDE;
 	audio_convert_to(buffer, tmp, len, state->playback.format);
 	free(tmp);
 
 	return state->run ? 0 : -1;
 }
 
-static bool detect_pulse_amplitude(double *buf, size_t buf_len)
+static bool detect_pulse_amplitude(double *buf, size_t buf_len, bool pos)
 {
-	double min, max;
+	double expected, min, max;
 	size_t i;
 	bool ok;
 
@@ -1169,34 +1171,64 @@ static bool detect_pulse_amplitude(double *buf, size_t buf_len)
 			max = buf[i];
 	}
 
-	ok = (min >= PULSE_AMPLITUDE - PULSE_ACCURACY &&
-	      max <= PULSE_AMPLITUDE + PULSE_ACCURACY);
+	expected = pos ? PULSE_AMPLITUDE : -PULSE_AMPLITUDE;
+	ok = (min >= expected - PULSE_AMPLITUDE_ACCURACY &&
+	      max <= expected + PULSE_AMPLITUDE_ACCURACY);
 	if (ok)
-		igt_debug("Pulse detected\n");
+		igt_debug("Pulse amplitude detected\n");
 	else
-		igt_debug("Pulse not detected (min=%f, max=%f)\n",
+		igt_debug("Pulse amplitude not detected (min=%f, max=%f)\n",
 			  min, max);
 	return ok;
 }
 
+static ssize_t detect_falling_edge(double *buf, size_t buf_len)
+{
+	size_t i;
+
+	for (i = 0; i < buf_len; i++) {
+		if (buf[i] < 0)
+			return i;
+	}
+
+	return -1;
+}
+
+/** test_audio_pulse:
+ *
+ * Send pulse signals (one infinite positive pulse followed by a negative one)
+ * and check that:
+ *
+ * - The amplitude of the pulses is correct
+ * - All channels switch from a positive signal to a negative one at the same
+ *   time (ie. all channels are aligned)
+ */

tests/kms_chamelium.c static bool detect_pulse_amplitude(double *buf, size_t buf_len) · line 1214

Quoted 10 lines
tests/kms_chamelium.c +3 -1
 static bool test_audio_pulse(struct audio_state *state)
 {
-	bool success;
+	bool success, amp_success, align_success;
 	int32_t *recv;
 	size_t recv_len, i, channel_len;
+	ssize_t j;
 	int streak, capture_chan;
 	double *channel;
+	int falling_edges[8];

How about introducing MAX_CHANNEL?

This looks good otherwise:

Quoted 74 lines
tests/kms_chamelium.c +46 -4
 	alsa_register_output_callback(state->alsa,
 				      audio_output_pulse_callback, state,
 				      PLAYBACK_SAMPLES);
 
+	/* Start by sending a positive signal */
+	state->positive = true;
+
 	audio_state_start(state, "pulse");
 
+	for (i = 0; i < state->playback.channels; i++)
+		falling_edges[i] = -1;
+
 	recv = NULL;
 	recv_len = 0;
-	success = false;
-	while (!success && state->msec < AUDIO_TIMEOUT) {
+	amp_success = false;
+	while (!amp_success && state->msec < AUDIO_TIMEOUT) {
 		audio_state_receive(state, &recv, &recv_len);
 
 		igt_debug("Detecting audio signal, t=%d msec\n", state->msec);
@@ -1217,17 +1249,58 @@ static bool test_audio_pulse(struct audio_state *state)
 						     state->capture.channels,
 						     capture_chan);
 
-			if (detect_pulse_amplitude(channel, channel_len))
+			/* Check whether the amplitude is fine */
+			if (detect_pulse_amplitude(channel, channel_len,
+			    state->positive))
 				streak++;
 			else
 				streak = 0;
 
+			/* If we're now sending a negative signal, detect the
+			 * falling edge */
+			j = detect_falling_edge(channel, channel_len);
+			if (!state->positive && j >= 0) {
+				falling_edges[i] = recv_len * state->recv_pages
+						   + j;
+			}
+
 			free(channel);
 		}
 
-		success = streak == MIN_STREAK * state->playback.channels;
+		amp_success = streak == MIN_STREAK * state->playback.channels;
+
+		if (amp_success && state->positive) {
+			/* Switch to a negative signal after we've detected the
+			 * positive one. */
+			state->positive = false;
+			amp_success = false;
+			streak = 0;
+			igt_debug("Switching to negative pulse\n");
+		}
+	}
+
+	/* Check alignment between all channels by comparing the index of the
+	 * falling edge. */
+	align_success = true;
+	for (i = 0; i < state->playback.channels; i++) {
+		if (falling_edges[i] < 0) {
+			igt_debug("Falling edge not detected for channel %zu\n",
+				  i);
+			align_success = false;
+			continue;
+		}
+
+		if (abs(falling_edges[0] - falling_edges[i]) >
+		    PULSE_ALIGN_ACCURACY) {
+			igt_debug("Channel alignment mismatch: "
+				  "channel 0 has a falling edge at index %d "

tests/kms_chamelium.c static bool test_audio_pulse(struct audio_state *state) · line 1306

Quoted 10 lines
tests/kms_chamelium.c +5 -0
+				  "while channel %zu has index %d\n",
+				  falling_edges[0], i, falling_edges[i]);
+			align_success = false;
+		}
 	}
 
+	success = amp_success && align_success;
 	audio_state_stop(state, success);
 
 	free(recv);

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

#20 lore raw

[igt-dev] ✓ Fi.CI.BAT: success for tests/kms_chamelium: add pulse test

In reply to Simon Ser
== Series Details ==

== Series Details ==

Series: tests/kms_chamelium: add pulse test
URL : https://patchwork.freedesktop.org/series/61111/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_6141 -> IGTPW_3055
====================================================

Summary
-------

**SUCCESS**

No regressions found.

External URL: https://patchwork.freedesktop.org/api/1.0/series/61111/revisions/1/mbox/

Known issues
------------

Here are the changes found in IGTPW_3055 that come from known issues:

### IGT changes ###

#### Possible fixes ####

* igt@gem_mmap_gtt@basic:
- fi-icl-u3: [DMESG-WARN][1] ([fdo#107724]) -> [PASS][2]
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/fi-icl-u3/igt@[email protected]
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/fi-icl-u3/igt@[email protected]

* igt@i915_pm_rpm@basic-rte:
- fi-skl-6600u: [INCOMPLETE][3] ([fdo#107807]) -> [PASS][4]
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/fi-skl-6600u/igt@[email protected]
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/fi-skl-6600u/igt@[email protected]

* igt@kms_addfb_basic@bad-pitch-65536:
- {fi-icl-dsi}: [INCOMPLETE][5] ([fdo#107713]) -> [PASS][6]
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/fi-icl-dsi/igt@[email protected]
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/fi-icl-dsi/igt@[email protected]

{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).

[fdo#106107]: https://bugs.freedesktop.org/show_bug.cgi?id=106107
[fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
[fdo#107724]: https://bugs.freedesktop.org/show_bug.cgi?id=107724
[fdo#107807]: https://bugs.freedesktop.org/show_bug.cgi?id=107807

Participating hosts (53 -> 46)
------------------------------

Missing (7): fi-kbl-soraka fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-byt-clapper fi-bdw-samus

Build changes
-------------

* IGT: IGT_5015 -> IGTPW_3055

CI_DRM_6141: e94845147cc0346c3a9114d5359b188008daff9d @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_3055: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/
IGT_5015: cdd6b0a7630762cec14596b9863f418b48c32f46 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/
_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

#21 lore raw

[igt-dev] ✗ Fi.CI.IGT: failure for tests/kms_chamelium: add pulse test

In reply to Simon Ser
== Series Details ==

== Series Details ==

Series: tests/kms_chamelium: add pulse test
URL : https://patchwork.freedesktop.org/series/61111/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_6141_full -> IGTPW_3055_full
====================================================

Summary
-------

**FAILURE**

Serious unknown changes coming with IGTPW_3055_full absolutely need to be verified manually.

If you think the reported changes have nothing to do with the changes introduced in IGTPW_3055_full, please notify your bug team to allow them to document this new failure mode, which will reduce false positives in CI.

External URL: https://patchwork.freedesktop.org/api/1.0/series/61111/revisions/1/mbox/

Possible new issues
-------------------

Here are the unknown changes that may have been introduced in IGTPW_3055_full:

### IGT changes ###

#### Possible regressions ####

* igt@gem_mmap_gtt@hang:
- shard-glk: [PASS][1] -> [FAIL][2]
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk6/igt@[email protected]
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk3/igt@[email protected]

Known issues
------------

Here are the changes found in IGTPW_3055_full that come from known issues:

### IGT changes ###

#### Issues hit ####

* igt@gem_ctx_switch@basic-default:
- shard-iclb: [PASS][3] -> [INCOMPLETE][4] ([fdo#107713] / [fdo#108569])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb7/igt@[email protected]
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb8/igt@[email protected]

* igt@gem_eio@reset-stress:
- shard-snb: [PASS][5] -> [FAIL][6] ([fdo#109661])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb6/igt@[email protected]
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb4/igt@[email protected]

* igt@gem_tiled_wc:
- shard-iclb: [PASS][7] -> [INCOMPLETE][8] ([fdo#107713]) +1 similar issue
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb1/igt@gem_tiled_wc.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb7/igt@gem_tiled_wc.html

* igt@i915_suspend@debugfs-reader:
- shard-apl: [PASS][9] -> [DMESG-WARN][10] ([fdo#108566]) +4 similar issues
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-apl8/igt@[email protected]
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-apl3/igt@[email protected]

* igt@i915_suspend@fence-restore-tiled2untiled:
- shard-kbl: [PASS][11] -> [INCOMPLETE][12] ([fdo#103665])
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-kbl7/igt@[email protected]
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-kbl3/igt@[email protected]

* igt@kms_cursor_edge_walk@pipe-b-128x128-bottom-edge:
- shard-snb: [PASS][13] -> [SKIP][14] ([fdo#109271] / [fdo#109278])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb4/igt@[email protected]
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb7/igt@[email protected]

* igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic:
- shard-hsw: [PASS][15] -> [SKIP][16] ([fdo#109271]) +27 similar issues
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-hsw6/igt@[email protected]
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-hsw1/igt@[email protected]

* igt@kms_flip@plain-flip-fb-recreate-interruptible:
- shard-glk: [PASS][17] -> [FAIL][18] ([fdo#100368]) +1 similar issue
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk1/igt@[email protected]
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk8/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-pwrite:
- shard-snb: [PASS][19] -> [SKIP][20] ([fdo#109271])
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb6/igt@[email protected]
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb7/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbc-rgb565-draw-pwrite:
- shard-iclb: [PASS][21] -> [FAIL][22] ([fdo#103167]) +4 similar issues
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb5/igt@[email protected]
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb5/igt@[email protected]

* igt@kms_frontbuffer_tracking@psr-modesetfrombusy:
- shard-iclb: [PASS][23] -> [INCOMPLETE][24] ([fdo#106978] / [fdo#107713])
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb6/igt@[email protected]
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb1/igt@[email protected]

* igt@kms_psr2_su@page_flip:
- shard-iclb: [PASS][25] -> [SKIP][26] ([fdo#109642])
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb2/igt@kms_psr2_su@page_flip.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb1/igt@kms_psr2_su@page_flip.html

* igt@kms_psr@psr2_sprite_plane_move:
- shard-iclb: [PASS][27] -> [SKIP][28] ([fdo#109441]) +2 similar issues
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb2/igt@kms_psr@psr2_sprite_plane_move.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb8/igt@kms_psr@psr2_sprite_plane_move.html

* igt@kms_setmode@basic:
- shard-hsw: [PASS][29] -> [FAIL][30] ([fdo#99912])
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-hsw1/igt@[email protected]
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-hsw5/igt@[email protected]

#### Possible fixes ####

* igt@gem_exec_schedule@preemptive-hang-render:
- shard-apl: [INCOMPLETE][31] ([fdo#103927]) -> [PASS][32]
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-apl6/igt@[email protected]
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-apl8/igt@[email protected]

* igt@gem_workarounds@suspend-resume:
- shard-apl: [DMESG-WARN][33] ([fdo#108566]) -> [PASS][34] +6 similar issues
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-apl6/igt@[email protected]
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-apl7/igt@[email protected]

* igt@kms_cursor_crc@pipe-b-cursor-256x85-sliding:
- shard-apl: [FAIL][35] ([fdo#103232]) -> [PASS][36]
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-apl8/igt@[email protected]
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-apl2/igt@[email protected]
- shard-kbl: [FAIL][37] ([fdo#103232]) -> [PASS][38]
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-kbl1/igt@[email protected]
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-kbl1/igt@[email protected]

* igt@kms_cursor_legacy@2x-nonblocking-modeset-vs-cursor-atomic:
- shard-glk: [FAIL][39] ([fdo#106509] / [fdo#107409]) -> [PASS][40]
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk8/igt@[email protected]
[40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk1/igt@[email protected]

* igt@kms_flip@2x-modeset-vs-vblank-race:
- shard-glk: [FAIL][41] ([fdo#103060]) -> [PASS][42]
[41]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk1/igt@[email protected]
[42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk7/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt:
- shard-hsw: [SKIP][43] ([fdo#109271]) -> [PASS][44] +12 similar issues
[43]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-hsw1/igt@[email protected]
[44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-hsw8/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-blt:
- shard-iclb: [FAIL][45] ([fdo#103167]) -> [PASS][46] +7 similar issues
[45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb7/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-blt.html
[46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb6/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-blt.html

* igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes:
- shard-glk: [INCOMPLETE][47] ([fdo#103359] / [k.org#198133]) -> [PASS][48]
[47]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk1/igt@[email protected]
[48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk4/igt@[email protected]

* igt@kms_psr@psr2_sprite_render:
- shard-iclb: [SKIP][49] ([fdo#109441]) -> [PASS][50]
[49]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb1/igt@kms_psr@psr2_sprite_render.html
[50]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb2/igt@kms_psr@psr2_sprite_render.html

#### Warnings ####

* igt@gem_mmap_gtt@forked-big-copy-odd:
- shard-iclb: [INCOMPLETE][51] ([fdo#107713] / [fdo#109100]) -> [TIMEOUT][52] ([fdo#109673])
[51]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb7/igt@[email protected]
[52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb6/igt@[email protected]

* igt@kms_vblank@pipe-c-query-idle-hang:
- shard-snb: [SKIP][53] ([fdo#109271] / [fdo#109278]) -> [SKIP][54] ([fdo#109271])
[53]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb5/igt@[email protected]
[54]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb7/igt@[email protected]

* igt@prime_vgem@wait-bsd1:
- shard-snb: [FAIL][55] -> [INCOMPLETE][56] ([fdo#105411])
[55]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb6/igt@[email protected]
[56]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb4/igt@[email protected]

[fdo#100368]: https://bugs.freedesktop.org/show_bug.cgi?id=100368
[fdo#103060]: https://bugs.freedesktop.org/show_bug.cgi?id=103060
[fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
[fdo#103232]: https://bugs.freedesktop.org/show_bug.cgi?id=103232
[fdo#103359]: https://bugs.freedesktop.org/show_bug.cgi?id=103359
[fdo#103665]: https://bugs.freedesktop.org/show_bug.cgi?id=103665
[fdo#103927]: https://bugs.freedesktop.org/show_bug.cgi?id=103927
[fdo#105411]: https://bugs.freedesktop.org/show_bug.cgi?id=105411
[fdo#106509]: https://bugs.freedesktop.org/show_bug.cgi?id=106509
[fdo#106978]: https://bugs.freedesktop.org/show_bug.cgi?id=106978
[fdo#107409]: https://bugs.freedesktop.org/show_bug.cgi?id=107409
[fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
[fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
[fdo#108569]: https://bugs.freedesktop.org/show_bug.cgi?id=108569
[fdo#109100]: https://bugs.freedesktop.org/show_bug.cgi?id=109100
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
[fdo#109278]: https://bugs.freedesktop.org/show_bug.cgi?id=109278
[fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
[fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
[fdo#109661]: https://bugs.freedesktop.org/show_bug.cgi?id=109661
[fdo#109673]: https://bugs.freedesktop.org/show_bug.cgi?id=109673
[fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=99912
[k.org#198133]: https://bugzilla.kernel.org/show_bug.cgi?id=198133

Participating hosts (10 -> 6)
------------------------------

Missing (4): pig-skl-6260u shard-skl pig-hsw-4770r pig-glk-j5005

Build changes
-------------

* IGT: IGT_5015 -> IGTPW_3055
* Piglit: piglit_4509 -> None

CI_DRM_6141: e94845147cc0346c3a9114d5359b188008daff9d @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_3055: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/
IGT_5015: cdd6b0a7630762cec14596b9863f418b48c32f46 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/
_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

author
#22 lore raw

Re: [igt-dev] ✗ Fi.CI.IGT: failure for tests/kms_chamelium: add pulse test

Quoted 30 lines · Patchwork

== Series Details ==

Series: tests/kms_chamelium: add pulse test
URL : https://patchwork.freedesktop.org/series/61111/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_6141_full -> IGTPW_3055_full
====================================================

Summary
-------

**FAILURE**

Serious unknown changes coming with IGTPW_3055_full absolutely need to be verified manually.

If you think the reported changes have nothing to do with the changes introduced in IGTPW_3055_full, please notify your bug team to allow them to document this new failure mode, which will reduce false positives in CI.

External URL: https://patchwork.freedesktop.org/api/1.0/series/61111/revisions/1/mbox/

Possible new issues
-------------------

Here are the unknown changes that may have been introduced in IGTPW_3055_full:

Quoted 8 lines

### IGT changes ###

#### Possible regressions ####

* igt@gem_mmap_gtt@hang:
- shard-glk: [PASS][1] -> [FAIL][2]
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk6/igt@[email protected]
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk3/igt@[email protected]

Cc Martin

Quoted 187 lines

Known issues
------------

Here are the changes found in IGTPW_3055_full that come from known issues:

### IGT changes ###

#### Issues hit ####

* igt@gem_ctx_switch@basic-default:
- shard-iclb: [PASS][3] -> [INCOMPLETE][4] ([fdo#107713] / [fdo#108569])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb7/igt@[email protected]
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb8/igt@[email protected]

* igt@gem_eio@reset-stress:
- shard-snb: [PASS][5] -> [FAIL][6] ([fdo#109661])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb6/igt@[email protected]
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb4/igt@[email protected]

* igt@gem_tiled_wc:
- shard-iclb: [PASS][7] -> [INCOMPLETE][8] ([fdo#107713]) +1 similar issue
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb1/igt@gem_tiled_wc.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb7/igt@gem_tiled_wc.html

* igt@i915_suspend@debugfs-reader:
- shard-apl: [PASS][9] -> [DMESG-WARN][10] ([fdo#108566]) +4 similar issues
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-apl8/igt@[email protected]
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-apl3/igt@[email protected]

* igt@i915_suspend@fence-restore-tiled2untiled:
- shard-kbl: [PASS][11] -> [INCOMPLETE][12] ([fdo#103665])
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-kbl7/igt@[email protected]
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-kbl3/igt@[email protected]

* igt@kms_cursor_edge_walk@pipe-b-128x128-bottom-edge:
- shard-snb: [PASS][13] -> [SKIP][14] ([fdo#109271] / [fdo#109278])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb4/igt@[email protected]
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb7/igt@[email protected]

* igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic:
- shard-hsw: [PASS][15] -> [SKIP][16] ([fdo#109271]) +27 similar issues
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-hsw6/igt@[email protected]
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-hsw1/igt@[email protected]

* igt@kms_flip@plain-flip-fb-recreate-interruptible:
- shard-glk: [PASS][17] -> [FAIL][18] ([fdo#100368]) +1 similar issue
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk1/igt@[email protected]
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk8/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-pwrite:
- shard-snb: [PASS][19] -> [SKIP][20] ([fdo#109271])
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb6/igt@[email protected]
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb7/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbc-rgb565-draw-pwrite:
- shard-iclb: [PASS][21] -> [FAIL][22] ([fdo#103167]) +4 similar issues
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb5/igt@[email protected]
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb5/igt@[email protected]

* igt@kms_frontbuffer_tracking@psr-modesetfrombusy:
- shard-iclb: [PASS][23] -> [INCOMPLETE][24] ([fdo#106978] / [fdo#107713])
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb6/igt@[email protected]
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb1/igt@[email protected]

* igt@kms_psr2_su@page_flip:
- shard-iclb: [PASS][25] -> [SKIP][26] ([fdo#109642])
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb2/igt@kms_psr2_su@page_flip.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb1/igt@kms_psr2_su@page_flip.html

* igt@kms_psr@psr2_sprite_plane_move:
- shard-iclb: [PASS][27] -> [SKIP][28] ([fdo#109441]) +2 similar issues
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb2/igt@kms_psr@psr2_sprite_plane_move.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb8/igt@kms_psr@psr2_sprite_plane_move.html

* igt@kms_setmode@basic:
- shard-hsw: [PASS][29] -> [FAIL][30] ([fdo#99912])
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-hsw1/igt@[email protected]
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-hsw5/igt@[email protected]

#### Possible fixes ####

* igt@gem_exec_schedule@preemptive-hang-render:
- shard-apl: [INCOMPLETE][31] ([fdo#103927]) -> [PASS][32]
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-apl6/igt@[email protected]
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-apl8/igt@[email protected]

* igt@gem_workarounds@suspend-resume:
- shard-apl: [DMESG-WARN][33] ([fdo#108566]) -> [PASS][34] +6 similar issues
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-apl6/igt@[email protected]
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-apl7/igt@[email protected]

* igt@kms_cursor_crc@pipe-b-cursor-256x85-sliding:
- shard-apl: [FAIL][35] ([fdo#103232]) -> [PASS][36]
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-apl8/igt@[email protected]
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-apl2/igt@[email protected]
- shard-kbl: [FAIL][37] ([fdo#103232]) -> [PASS][38]
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-kbl1/igt@[email protected]
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-kbl1/igt@[email protected]

* igt@kms_cursor_legacy@2x-nonblocking-modeset-vs-cursor-atomic:
- shard-glk: [FAIL][39] ([fdo#106509] / [fdo#107409]) -> [PASS][40]
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk8/igt@[email protected]
[40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk1/igt@[email protected]

* igt@kms_flip@2x-modeset-vs-vblank-race:
- shard-glk: [FAIL][41] ([fdo#103060]) -> [PASS][42]
[41]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk1/igt@[email protected]
[42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk7/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt:
- shard-hsw: [SKIP][43] ([fdo#109271]) -> [PASS][44] +12 similar issues
[43]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-hsw1/igt@[email protected]
[44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-hsw8/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-blt:
- shard-iclb: [FAIL][45] ([fdo#103167]) -> [PASS][46] +7 similar issues
[45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb7/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-blt.html
[46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb6/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-blt.html

* igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes:
- shard-glk: [INCOMPLETE][47] ([fdo#103359] / [k.org#198133]) -> [PASS][48]
[47]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk1/igt@[email protected]
[48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk4/igt@[email protected]

* igt@kms_psr@psr2_sprite_render:
- shard-iclb: [SKIP][49] ([fdo#109441]) -> [PASS][50]
[49]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb1/igt@kms_psr@psr2_sprite_render.html
[50]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb2/igt@kms_psr@psr2_sprite_render.html

#### Warnings ####

* igt@gem_mmap_gtt@forked-big-copy-odd:
- shard-iclb: [INCOMPLETE][51] ([fdo#107713] / [fdo#109100]) -> [TIMEOUT][52] ([fdo#109673])
[51]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb7/igt@[email protected]
[52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb6/igt@[email protected]

* igt@kms_vblank@pipe-c-query-idle-hang:
- shard-snb: [SKIP][53] ([fdo#109271] / [fdo#109278]) -> [SKIP][54] ([fdo#109271])
[53]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb5/igt@[email protected]
[54]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb7/igt@[email protected]

* igt@prime_vgem@wait-bsd1:
- shard-snb: [FAIL][55] -> [INCOMPLETE][56] ([fdo#105411])
[55]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb6/igt@[email protected]
[56]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb4/igt@[email protected]

[fdo#100368]: https://bugs.freedesktop.org/show_bug.cgi?id=100368
[fdo#103060]: https://bugs.freedesktop.org/show_bug.cgi?id=103060
[fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
[fdo#103232]: https://bugs.freedesktop.org/show_bug.cgi?id=103232
[fdo#103359]: https://bugs.freedesktop.org/show_bug.cgi?id=103359
[fdo#103665]: https://bugs.freedesktop.org/show_bug.cgi?id=103665
[fdo#103927]: https://bugs.freedesktop.org/show_bug.cgi?id=103927
[fdo#105411]: https://bugs.freedesktop.org/show_bug.cgi?id=105411
[fdo#106509]: https://bugs.freedesktop.org/show_bug.cgi?id=106509
[fdo#106978]: https://bugs.freedesktop.org/show_bug.cgi?id=106978
[fdo#107409]: https://bugs.freedesktop.org/show_bug.cgi?id=107409
[fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
[fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
[fdo#108569]: https://bugs.freedesktop.org/show_bug.cgi?id=108569
[fdo#109100]: https://bugs.freedesktop.org/show_bug.cgi?id=109100
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
[fdo#109278]: https://bugs.freedesktop.org/show_bug.cgi?id=109278
[fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
[fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
[fdo#109661]: https://bugs.freedesktop.org/show_bug.cgi?id=109661
[fdo#109673]: https://bugs.freedesktop.org/show_bug.cgi?id=109673
[fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=99912
[k.org#198133]: https://bugzilla.kernel.org/show_bug.cgi?id=198133

Participating hosts (10 -> 6)
------------------------------

Missing (4): pig-skl-6260u shard-skl pig-hsw-4770r pig-glk-j5005

Build changes
-------------

* IGT: IGT_5015 -> IGTPW_3055
* Piglit: piglit_4509 -> None

Quoted 8 lines

CI_DRM_6141: e94845147cc0346c3a9114d5359b188008daff9d @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_3055: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/
IGT_5015: cdd6b0a7630762cec14596b9863f418b48c32f46 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

#23 lore raw

Re: [igt-dev] ✗ Fi.CI.IGT: failure for tests/kms_chamelium: add pulse test

Quoted 33 lines · Simon
Quoted 32 lines · Patchwork

== Series Details ==

Series: tests/kms_chamelium: add pulse test
URL : https://patchwork.freedesktop.org/series/61111/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_6141_full -> IGTPW_3055_full
====================================================

Summary
-------

**FAILURE**

Serious unknown changes coming with IGTPW_3055_full absolutely need to be verified manually.

If you think the reported changes have nothing to do with the changes introduced in IGTPW_3055_full, please notify your bug team to allow them to document this new failure mode, which will reduce false positives in CI.

External URL: https://patchwork.freedesktop.org/api/1.0/series/61111/revisions/1/mbox/

Possible new issues
-------------------

Here are the unknown changes that may have been introduced in IGTPW_3055_full:

### IGT changes ###

Quoted 8 lines
Quoted 6 lines

#### Possible regressions ####

* igt@gem_mmap_gtt@hang:
- shard-glk: [PASS][1] -> [FAIL][2]
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk6/igt@[email protected]
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk3/igt@[email protected]

Cc Martin

Thanks, filed:
https://bugs.freedesktop.org/show_bug.cgi?id=110773

Quoted 188 lines
Quoted 188 lines

Known issues
------------

Here are the changes found in IGTPW_3055_full that come from known issues:

### IGT changes ###

#### Issues hit ####

* igt@gem_ctx_switch@basic-default:
- shard-iclb: [PASS][3] -> [INCOMPLETE][4] ([fdo#107713] / [fdo#108569])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb7/igt@[email protected]
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb8/igt@[email protected]

* igt@gem_eio@reset-stress:
- shard-snb: [PASS][5] -> [FAIL][6] ([fdo#109661])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb6/igt@[email protected]
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb4/igt@[email protected]

* igt@gem_tiled_wc:
- shard-iclb: [PASS][7] -> [INCOMPLETE][8] ([fdo#107713]) +1 similar issue
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb1/igt@gem_tiled_wc.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb7/igt@gem_tiled_wc.html

* igt@i915_suspend@debugfs-reader:
- shard-apl: [PASS][9] -> [DMESG-WARN][10] ([fdo#108566]) +4 similar issues
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-apl8/igt@[email protected]
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-apl3/igt@[email protected]

* igt@i915_suspend@fence-restore-tiled2untiled:
- shard-kbl: [PASS][11] -> [INCOMPLETE][12] ([fdo#103665])
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-kbl7/igt@[email protected]
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-kbl3/igt@[email protected]

* igt@kms_cursor_edge_walk@pipe-b-128x128-bottom-edge:
- shard-snb: [PASS][13] -> [SKIP][14] ([fdo#109271] / [fdo#109278])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb4/igt@[email protected]
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb7/igt@[email protected]

* igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic:
- shard-hsw: [PASS][15] -> [SKIP][16] ([fdo#109271]) +27 similar issues
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-hsw6/igt@[email protected]
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-hsw1/igt@[email protected]

* igt@kms_flip@plain-flip-fb-recreate-interruptible:
- shard-glk: [PASS][17] -> [FAIL][18] ([fdo#100368]) +1 similar issue
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk1/igt@[email protected]
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk8/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-pwrite:
- shard-snb: [PASS][19] -> [SKIP][20] ([fdo#109271])
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb6/igt@[email protected]
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb7/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbc-rgb565-draw-pwrite:
- shard-iclb: [PASS][21] -> [FAIL][22] ([fdo#103167]) +4 similar issues
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb5/igt@[email protected]
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb5/igt@[email protected]

* igt@kms_frontbuffer_tracking@psr-modesetfrombusy:
- shard-iclb: [PASS][23] -> [INCOMPLETE][24] ([fdo#106978] / [fdo#107713])
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb6/igt@[email protected]
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb1/igt@[email protected]

* igt@kms_psr2_su@page_flip:
- shard-iclb: [PASS][25] -> [SKIP][26] ([fdo#109642])
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb2/igt@kms_psr2_su@page_flip.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb1/igt@kms_psr2_su@page_flip.html

* igt@kms_psr@psr2_sprite_plane_move:
- shard-iclb: [PASS][27] -> [SKIP][28] ([fdo#109441]) +2 similar issues
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb2/igt@kms_psr@psr2_sprite_plane_move.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb8/igt@kms_psr@psr2_sprite_plane_move.html

* igt@kms_setmode@basic:
- shard-hsw: [PASS][29] -> [FAIL][30] ([fdo#99912])
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-hsw1/igt@[email protected]
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-hsw5/igt@[email protected]

#### Possible fixes ####

* igt@gem_exec_schedule@preemptive-hang-render:
- shard-apl: [INCOMPLETE][31] ([fdo#103927]) -> [PASS][32]
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-apl6/igt@[email protected]
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-apl8/igt@[email protected]

* igt@gem_workarounds@suspend-resume:
- shard-apl: [DMESG-WARN][33] ([fdo#108566]) -> [PASS][34] +6 similar issues
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-apl6/igt@[email protected]
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-apl7/igt@[email protected]

* igt@kms_cursor_crc@pipe-b-cursor-256x85-sliding:
- shard-apl: [FAIL][35] ([fdo#103232]) -> [PASS][36]
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-apl8/igt@[email protected]
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-apl2/igt@[email protected]
- shard-kbl: [FAIL][37] ([fdo#103232]) -> [PASS][38]
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-kbl1/igt@[email protected]
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-kbl1/igt@[email protected]

* igt@kms_cursor_legacy@2x-nonblocking-modeset-vs-cursor-atomic:
- shard-glk: [FAIL][39] ([fdo#106509] / [fdo#107409]) -> [PASS][40]
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk8/igt@[email protected]
[40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk1/igt@[email protected]

* igt@kms_flip@2x-modeset-vs-vblank-race:
- shard-glk: [FAIL][41] ([fdo#103060]) -> [PASS][42]
[41]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk1/igt@[email protected]
[42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk7/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt:
- shard-hsw: [SKIP][43] ([fdo#109271]) -> [PASS][44] +12 similar issues
[43]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-hsw1/igt@[email protected]
[44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-hsw8/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-blt:
- shard-iclb: [FAIL][45] ([fdo#103167]) -> [PASS][46] +7 similar issues
[45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb7/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-blt.html
[46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb6/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-blt.html

* igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes:
- shard-glk: [INCOMPLETE][47] ([fdo#103359] / [k.org#198133]) -> [PASS][48]
[47]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-glk1/igt@[email protected]
[48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-glk4/igt@[email protected]

* igt@kms_psr@psr2_sprite_render:
- shard-iclb: [SKIP][49] ([fdo#109441]) -> [PASS][50]
[49]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb1/igt@kms_psr@psr2_sprite_render.html
[50]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb2/igt@kms_psr@psr2_sprite_render.html

#### Warnings ####

* igt@gem_mmap_gtt@forked-big-copy-odd:
- shard-iclb: [INCOMPLETE][51] ([fdo#107713] / [fdo#109100]) -> [TIMEOUT][52] ([fdo#109673])
[51]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-iclb7/igt@[email protected]
[52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-iclb6/igt@[email protected]

* igt@kms_vblank@pipe-c-query-idle-hang:
- shard-snb: [SKIP][53] ([fdo#109271] / [fdo#109278]) -> [SKIP][54] ([fdo#109271])
[53]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb5/igt@[email protected]
[54]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb7/igt@[email protected]

* igt@prime_vgem@wait-bsd1:
- shard-snb: [FAIL][55] -> [INCOMPLETE][56] ([fdo#105411])
[55]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6141/shard-snb6/igt@[email protected]
[56]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/shard-snb4/igt@[email protected]

[fdo#100368]: https://bugs.freedesktop.org/show_bug.cgi?id=100368
[fdo#103060]: https://bugs.freedesktop.org/show_bug.cgi?id=103060
[fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
[fdo#103232]: https://bugs.freedesktop.org/show_bug.cgi?id=103232
[fdo#103359]: https://bugs.freedesktop.org/show_bug.cgi?id=103359
[fdo#103665]: https://bugs.freedesktop.org/show_bug.cgi?id=103665
[fdo#103927]: https://bugs.freedesktop.org/show_bug.cgi?id=103927
[fdo#105411]: https://bugs.freedesktop.org/show_bug.cgi?id=105411
[fdo#106509]: https://bugs.freedesktop.org/show_bug.cgi?id=106509
[fdo#106978]: https://bugs.freedesktop.org/show_bug.cgi?id=106978
[fdo#107409]: https://bugs.freedesktop.org/show_bug.cgi?id=107409
[fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
[fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
[fdo#108569]: https://bugs.freedesktop.org/show_bug.cgi?id=108569
[fdo#109100]: https://bugs.freedesktop.org/show_bug.cgi?id=109100
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
[fdo#109278]: https://bugs.freedesktop.org/show_bug.cgi?id=109278
[fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
[fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
[fdo#109661]: https://bugs.freedesktop.org/show_bug.cgi?id=109661
[fdo#109673]: https://bugs.freedesktop.org/show_bug.cgi?id=109673
[fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=99912
[k.org#198133]: https://bugzilla.kernel.org/show_bug.cgi?id=198133

Participating hosts (10 -> 6)
------------------------------

Missing (4): pig-skl-6260u shard-skl pig-hsw-4770r pig-glk-j5005

Build changes
-------------

* IGT: IGT_5015 -> IGTPW_3055
* Piglit: piglit_4509 -> None

Quoted 8 lines
Quoted 8 lines

CI_DRM_6141: e94845147cc0346c3a9114d5359b188008daff9d @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_3055: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/
IGT_5015: cdd6b0a7630762cec14596b9863f418b48c32f46 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3055/

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

#24 lore raw

[igt-dev] ✓ Fi.CI.BAT: success for tests/kms_chamelium: add pulse test (rev2)

In reply to Simon Ser
== Series Details ==

== Series Details ==

Series: tests/kms_chamelium: add pulse test (rev2)
URL : https://patchwork.freedesktop.org/series/61111/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_6143 -> IGTPW_3060
====================================================

Summary
-------

**SUCCESS**

No regressions found.

External URL: https://patchwork.freedesktop.org/api/1.0/series/61111/revisions/2/mbox/

Known issues
------------

Here are the changes found in IGTPW_3060 that come from known issues:

### IGT changes ###

#### Issues hit ####

* igt@gem_basic@create-fd-close:
- fi-cml-u: [PASS][1] -> [INCOMPLETE][2] ([fdo#110566])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/fi-cml-u/igt@[email protected]
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/fi-cml-u/igt@[email protected]

* igt@i915_pm_rpm@module-reload:
- fi-skl-6770hq: [PASS][3] -> [FAIL][4] ([fdo#108511])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/fi-skl-6770hq/igt@[email protected]
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/fi-skl-6770hq/igt@[email protected]

#### Possible fixes ####

* igt@gem_exec_suspend@basic-s3:
- fi-blb-e6850: [INCOMPLETE][5] ([fdo#107718]) -> [PASS][6]
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/fi-blb-e6850/igt@[email protected]
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/fi-blb-e6850/igt@[email protected]

* igt@i915_selftest@live_contexts:
- fi-bdw-gvtdvm: [DMESG-FAIL][7] ([fdo#110235]) -> [PASS][8]
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/fi-bdw-gvtdvm/igt@i915_selftest@live_contexts.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/fi-bdw-gvtdvm/igt@i915_selftest@live_contexts.html

* igt@kms_addfb_basic@addfb25-framebuffer-vs-set-tiling:
- fi-apl-guc: [INCOMPLETE][9] ([fdo#103927]) -> [PASS][10]
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/fi-apl-guc/igt@[email protected]
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/fi-apl-guc/igt@[email protected]

* igt@kms_prop_blob@basic:
- fi-icl-u3: [DMESG-WARN][11] ([fdo#107724]) -> [PASS][12]
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/fi-icl-u3/igt@[email protected]
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/fi-icl-u3/igt@[email protected]

[fdo#103927]: https://bugs.freedesktop.org/show_bug.cgi?id=103927
[fdo#107718]: https://bugs.freedesktop.org/show_bug.cgi?id=107718
[fdo#107724]: https://bugs.freedesktop.org/show_bug.cgi?id=107724
[fdo#108511]: https://bugs.freedesktop.org/show_bug.cgi?id=108511
[fdo#110235]: https://bugs.freedesktop.org/show_bug.cgi?id=110235
[fdo#110566]: https://bugs.freedesktop.org/show_bug.cgi?id=110566

Participating hosts (53 -> 45)
------------------------------

Missing (8): fi-kbl-soraka fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-icl-y fi-byt-clapper fi-bdw-samus

Build changes
-------------

* IGT: IGT_5015 -> IGTPW_3060

CI_DRM_6143: 94b7a2ed11a4b683a03f9351d471112e8b0cc0a4 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_3060: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/
IGT_5015: cdd6b0a7630762cec14596b9863f418b48c32f46 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/
_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

#25 lore raw

[igt-dev] ✓ Fi.CI.IGT: success for tests/kms_chamelium: add pulse test (rev2)

In reply to Simon Ser
== Series Details ==

== Series Details ==

Series: tests/kms_chamelium: add pulse test (rev2)
URL : https://patchwork.freedesktop.org/series/61111/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_6143_full -> IGTPW_3060_full
====================================================

Summary
-------

**SUCCESS**

No regressions found.

External URL: https://patchwork.freedesktop.org/api/1.0/series/61111/revisions/2/mbox/

Known issues
------------

Here are the changes found in IGTPW_3060_full that come from known issues:

### IGT changes ###

#### Issues hit ####

* igt@gem_ctx_isolation@rcs0-s3:
- shard-kbl: [PASS][1] -> [INCOMPLETE][2] ([fdo#103665])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-kbl4/igt@[email protected]
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-kbl1/igt@[email protected]

* igt@gem_mmap_gtt@forked-basic-small-copy-odd:
- shard-iclb: [PASS][3] -> [INCOMPLETE][4] ([fdo#107713])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-iclb3/igt@[email protected]
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-iclb8/igt@[email protected]

* igt@gem_tiled_swapping@non-threaded:
- shard-iclb: [PASS][5] -> [FAIL][6] ([fdo#108686])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-iclb7/igt@[email protected]
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-iclb5/igt@[email protected]
- shard-glk: [PASS][7] -> [DMESG-WARN][8] ([fdo#108686])
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-glk2/igt@[email protected]
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-glk8/igt@[email protected]

* igt@i915_suspend@sysfs-reader:
- shard-apl: [PASS][9] -> [DMESG-WARN][10] ([fdo#108566]) +3 similar issues
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-apl5/igt@[email protected]
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-apl7/igt@[email protected]

* igt@kms_atomic_transition@plane-all-transition-fencing:
- shard-snb: [PASS][11] -> [SKIP][12] ([fdo#109271])
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-snb5/igt@[email protected]
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-snb6/igt@[email protected]

* igt@kms_cursor_crc@pipe-a-cursor-64x64-sliding:
- shard-apl: [PASS][13] -> [FAIL][14] ([fdo#103232]) +1 similar issue
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-apl1/igt@[email protected]
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-apl7/igt@[email protected]

* igt@kms_cursor_crc@pipe-c-cursor-128x42-onscreen:
- shard-kbl: [PASS][15] -> [FAIL][16] ([fdo#103232]) +1 similar issue
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-kbl3/igt@[email protected]
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-kbl1/igt@[email protected]

* igt@kms_flip_tiling@flip-x-tiled:
- shard-iclb: [PASS][17] -> [FAIL][18] ([fdo#108303])
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-iclb7/igt@[email protected]
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-iclb6/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-pwrite:
- shard-hsw: [PASS][19] -> [SKIP][20] ([fdo#109271]) +23 similar issues
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-hsw4/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-pwrite.html
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-hsw1/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-pwrite.html

* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-render:
- shard-glk: [PASS][21] -> [FAIL][22] ([fdo#103167])
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-glk3/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-render.html
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-glk2/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-render.html

* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-pwrite:
- shard-iclb: [PASS][23] -> [FAIL][24] ([fdo#103167]) +4 similar issues
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-iclb2/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-pwrite.html
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-iclb2/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-pwrite.html

* igt@kms_psr@psr2_basic:
- shard-iclb: [PASS][25] -> [SKIP][26] ([fdo#109441]) +1 similar issue
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-iclb2/igt@kms_psr@psr2_basic.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-iclb6/igt@kms_psr@psr2_basic.html

* igt@kms_sysfs_edid_timing:
- shard-hsw: [PASS][27] -> [FAIL][28] ([fdo#100047])
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-hsw7/igt@kms_sysfs_edid_timing.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-hsw1/igt@kms_sysfs_edid_timing.html

#### Possible fixes ####

* igt@i915_suspend@fence-restore-tiled2untiled:
- shard-apl: [DMESG-WARN][29] ([fdo#108566]) -> [PASS][30] +5 similar issues
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-apl1/igt@[email protected]
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-apl8/igt@[email protected]

* igt@kms_color@pipe-a-ctm-green-to-red:
- shard-glk: [INCOMPLETE][31] ([fdo#103359] / [k.org#198133]) -> [PASS][32]
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-glk2/igt@[email protected]
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-glk7/igt@[email protected]

* igt@kms_cursor_crc@pipe-b-cursor-256x85-sliding:
- shard-apl: [FAIL][33] ([fdo#103232]) -> [PASS][34]
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-apl4/igt@[email protected]
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-apl3/igt@[email protected]
- shard-kbl: [FAIL][35] ([fdo#103232]) -> [PASS][36]
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-kbl4/igt@[email protected]
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-kbl1/igt@[email protected]

* igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy:
- shard-glk: [FAIL][37] ([fdo#104873]) -> [PASS][38]
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-glk5/igt@[email protected]
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-glk4/igt@[email protected]

* igt@kms_dp_dsc@basic-dsc-enable-edp:
- shard-iclb: [SKIP][39] ([fdo#109349]) -> [PASS][40]
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-iclb6/igt@[email protected]
[40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-iclb2/igt@[email protected]

* igt@kms_flip@2x-plain-flip-ts-check-interruptible:
- shard-hsw: [SKIP][41] ([fdo#109271]) -> [PASS][42] +23 similar issues
[41]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-hsw1/igt@[email protected]
[42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-hsw5/igt@[email protected]

* igt@kms_frontbuffer_tracking@fbcpsr-1p-pri-indfb-multidraw:
- shard-iclb: [FAIL][43] ([fdo#103167]) -> [PASS][44] +2 similar issues
[43]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-iclb2/igt@[email protected]
[44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-iclb6/igt@[email protected]

* igt@kms_psr@psr2_dpms:
- shard-iclb: [SKIP][45] ([fdo#109441]) -> [PASS][46] +1 similar issue
[45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-iclb8/igt@kms_psr@psr2_dpms.html
[46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-iclb2/igt@kms_psr@psr2_dpms.html

* igt@kms_setmode@basic:
- shard-iclb: [FAIL][47] ([fdo#99912]) -> [PASS][48]
[47]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-iclb8/igt@[email protected]
[48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-iclb5/igt@[email protected]
- shard-kbl: [FAIL][49] ([fdo#99912]) -> [PASS][50]
[49]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-kbl1/igt@[email protected]
[50]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-kbl2/igt@[email protected]

* igt@kms_vblank@pipe-a-ts-continuation-suspend:
- shard-kbl: [DMESG-WARN][51] ([fdo#108566]) -> [PASS][52]
[51]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-kbl1/igt@[email protected]
[52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-kbl6/igt@[email protected]

#### Warnings ####

* igt@gem_mmap_gtt@forked-big-copy:
- shard-iclb: [INCOMPLETE][53] ([fdo#107713] / [fdo#109100]) -> [TIMEOUT][54] ([fdo#109673])
[53]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-iclb1/igt@[email protected]
[54]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-iclb3/igt@[email protected]

* igt@gem_mmap_gtt@forked-big-copy-xy:
- shard-iclb: [TIMEOUT][55] ([fdo#109673]) -> [INCOMPLETE][56] ([fdo#107713] / [fdo#109100])
[55]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-iclb5/igt@[email protected]
[56]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-iclb3/igt@[email protected]

* igt@gem_tiled_swapping@non-threaded:
- shard-hsw: [INCOMPLETE][57] ([fdo#103540]) -> [FAIL][58] ([fdo#108686])
[57]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-hsw8/igt@[email protected]
[58]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-hsw8/igt@[email protected]

* igt@kms_atomic_transition@3x-modeset-transitions-fencing:
- shard-snb: [SKIP][59] ([fdo#109271] / [fdo#109278]) -> [SKIP][60] ([fdo#109271])
[59]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-snb6/igt@[email protected]
[60]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-snb6/igt@[email protected]

* igt@kms_plane_alpha_blend@pipe-b-alpha-transparant-fb:
- shard-apl: [INCOMPLETE][61] ([fdo#103927]) -> [FAIL][62] ([fdo#108145])
[61]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-apl8/igt@[email protected]
[62]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-apl8/igt@[email protected]

* igt@prime_vgem@fence-wait-bsd1:
- shard-snb: [INCOMPLETE][63] ([fdo#105411]) -> [FAIL][64] ([fdo#110764])
[63]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-snb2/igt@[email protected]
[64]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-snb5/igt@[email protected]

* igt@prime_vgem@wait-bsd1:
- shard-snb: [FAIL][65] ([fdo#110764]) -> [INCOMPLETE][66] ([fdo#105411])
[65]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6143/shard-snb6/igt@[email protected]
[66]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/shard-snb7/igt@[email protected]

[fdo#100047]: https://bugs.freedesktop.org/show_bug.cgi?id=100047
[fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
[fdo#103232]: https://bugs.freedesktop.org/show_bug.cgi?id=103232
[fdo#103359]: https://bugs.freedesktop.org/show_bug.cgi?id=103359
[fdo#103540]: https://bugs.freedesktop.org/show_bug.cgi?id=103540
[fdo#103665]: https://bugs.freedesktop.org/show_bug.cgi?id=103665
[fdo#103927]: https://bugs.freedesktop.org/show_bug.cgi?id=103927
[fdo#104873]: https://bugs.freedesktop.org/show_bug.cgi?id=104873
[fdo#105411]: https://bugs.freedesktop.org/show_bug.cgi?id=105411
[fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
[fdo#108145]: https://bugs.freedesktop.org/show_bug.cgi?id=108145
[fdo#108303]: https://bugs.freedesktop.org/show_bug.cgi?id=108303
[fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
[fdo#108686]: https://bugs.freedesktop.org/show_bug.cgi?id=108686
[fdo#109100]: https://bugs.freedesktop.org/show_bug.cgi?id=109100
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
[fdo#109278]: https://bugs.freedesktop.org/show_bug.cgi?id=109278
[fdo#109349]: https://bugs.freedesktop.org/show_bug.cgi?id=109349
[fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
[fdo#109673]: https://bugs.freedesktop.org/show_bug.cgi?id=109673
[fdo#110764]: https://bugs.freedesktop.org/show_bug.cgi?id=110764
[fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=99912
[k.org#198133]: https://bugzilla.kernel.org/show_bug.cgi?id=198133

Participating hosts (10 -> 6)
------------------------------

Missing (4): pig-skl-6260u shard-skl pig-hsw-4770r pig-glk-j5005

Build changes
-------------

* IGT: IGT_5015 -> IGTPW_3060
* Piglit: piglit_4509 -> None

CI_DRM_6143: 94b7a2ed11a4b683a03f9351d471112e8b0cc0a4 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_3060: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/
IGT_5015: cdd6b0a7630762cec14596b9863f418b48c32f46 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3060/
_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev