[Intel-gfx] [PATCH v2] tests/gem_error_capture: Initial testcase for error state capture/dump
Chris Wilson
chris at chris-wilson.co.uk
Fri Apr 11 19:12:24 CEST 2014
On Fri, Apr 11, 2014 at 05:48:12PM +0100, oscar.mateo at intel.com wrote:
> +static void check_error_state(const char *expected_ring_name,
> + uint64_t expected_offset)
> +{
> + FILE *file;
> + int debug_fd;
> + char *line = NULL;
> + size_t line_size = 0;
> + char *dashes = NULL;
> + char *ring_name = NULL;
> + int bb_matched = 0;
> + uint32_t gtt_offset;
> + char expected_line[32];
> + int req_matched = 0;
> + int requests;
> + uint32_t seqno, tail;
> + long jiffies;
> + int ringbuf_matched = 0;
> + unsigned int offset, command, expected_addr = 0;
> + int i, items;
> + bool bb_ok = false, req_ok = false, ringbuf_ok = false;
Most of these are only of use in local scope.
> + debug_fd = igt_debugfs_open("i915_error_state", O_RDONLY);
> + igt_assert(debug_fd >= 0);
> + file = fdopen(debug_fd, "r");
> +
> + while (getline(&line, &line_size, file) > 0) {
> + dashes = strstr(line, "---");
> + if (!dashes)
> + continue;
> +
> + ring_name = realloc(ring_name, dashes - line);
> + strncpy(ring_name, line, dashes - line);
> + ring_name[dashes - line - 1] = '\0';
> +
> + bb_matched = sscanf(dashes, "--- gtt_offset = 0x%08x\n",
> + >t_offset);
> + if (bb_matched == 1) {
> + igt_assert(strstr(ring_name, expected_ring_name));
> + igt_assert(gtt_offset == expected_offset);
> +
> + for (i = 0; i < sizeof(batch) / 4; i++) {
> + igt_assert(getline(&line, &line_size, file) > 0);
> + snprintf(expected_line, sizeof(expected_line), "%08x : %08x",
> + 4*i, batch[i]);
> + igt_assert(strstr(line, expected_line));
> + }
> + bb_ok = true;
> + continue;
> + }
> +
> + req_matched = sscanf(dashes, "--- %d requests\n",
> + &requests);
> + if (req_matched == 1) {
> + igt_assert(strstr(ring_name, expected_ring_name));
> + igt_assert(requests == 1);
Bad assumption. You could still have the request from
gem_quiescent_gpu() which may not have been retired before the error
triggers.
> +
> + igt_assert(getline(&line, &line_size, file) > 0);
> + items = sscanf(line, " seqno 0x%08x, emitted %ld, tail 0x%08x\n",
> + &seqno, &jiffies, &tail);
> + igt_assert(items == 3);
Bad. I may change the format. s/may/will/
> + req_ok = true;
> + continue;
> + }
> +
> + ringbuf_matched = sscanf(dashes, "--- ringbuffer = 0x%08x\n",
> + >t_offset);
> + if (ringbuf_matched == 1) {
> + if (!strstr(ring_name, expected_ring_name))
> + continue;
> + igt_assert(req_ok);
> +
> + for (i = 0; i < tail / 4; i++) {
> + igt_assert(getline(&line, &line_size, file) > 0);
> + items = sscanf(line, "%08x : %08x\n",
> + &offset, &command);
> + igt_assert(items == 2);
> + if ((command & 0x1F800000) == MI_BATCH_BUFFER_START) {
> + igt_assert(getline(&line, &line_size, file) > 0);
> + items = sscanf(line, "%08x : %08x\n",
> + &offset, &expected_addr);
> + igt_assert(items == 2);
> + i++;
> + }
> + }
> + igt_assert(expected_addr == expected_offset);
Bad. Some gen encode flags into the BB start address.
> + ringbuf_ok = true;
> + continue;
> + }
> +
> + if (bb_ok && req_ok && ringbuf_ok)
> + break;
> + }
> + igt_assert(bb_ok && req_ok && ringbuf_ok);
> +
> + free(line);
> + free(ring_name);
> + close(debug_fd);
> +}
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list