[PATCH 2/2] tools/intel_error_decode: Enable support for xe driver in the tool

sai.gowtham.ch at intel.com sai.gowtham.ch at intel.com
Fri Jan 31 20:29:40 UTC 2025


From: Sai Gowtham Ch <sai.gowtham.ch at intel.com>

Enables error decode support for xe dumps. which uses intel_error_decode_xe
lib.

Signed-off-by: Sai Gowtham Ch <sai.gowtham.ch at intel.com>
---
 tools/intel_error_decode.c | 156 +++++++++++++++++++++++++------------
 1 file changed, 107 insertions(+), 49 deletions(-)

diff --git a/tools/intel_error_decode.c b/tools/intel_error_decode.c
index 451608826..a722621e2 100644
--- a/tools/intel_error_decode.c
+++ b/tools/intel_error_decode.c
@@ -57,7 +57,11 @@
 #include "instdone.h"
 #include "intel_reg.h"
 #include "drmtest.h"
+#include "drm-uapi/xe_drm.h"
 #include "i915/intel_decode.h"
+#include "xe/intel_error_decode_xe_lib.h"
+
+#define XE_KMD_ERROR_DUMP_IDENTIFIER "**** Xe Device Coredump ****"
 
 static uint32_t
 print_head(unsigned int reg)
@@ -793,14 +797,86 @@ static void setup_pager(void)
 	}
 }
 
+static FILE *
+try_open_file(const char *format, ...)
+{
+	int ret;
+	char *filename;
+	FILE *file;
+	va_list args;
+
+	va_start(args, format);
+	ret = vasprintf(&filename, format, args);
+	va_end(args);
+
+	igt_assert(ret > 0);
+	file = fopen(filename, "r");
+	free(filename);
+
+	return file;
+}
+
+static FILE *
+open_i915_core_dump(const char *path)
+{
+	FILE *file = NULL;
+	struct stat st;
+
+	if (stat(path, &st))
+		return NULL;
+
+	if (S_ISDIR(st.st_mode)) {
+		file = try_open_file("%s/i915_error_state", path);
+		if (!file) {
+			int minor;
+			for (minor = 0; minor < 64; minor++) {
+				file = try_open_file("%s/%d/i915_error_state", path, minor);
+				if (file)
+					break;
+			}
+		}
+	} else {
+		file = fopen(path, "r");
+	}
+
+	return file;
+}
+
+static FILE *
+open_xe_core_dump(const char *path)
+{
+	FILE *file = NULL;
+
+	if (path) {
+		struct stat st;
+
+		if (stat(path, &st))
+			return NULL;
+
+		if (S_ISDIR(st.st_mode)) {
+			file = try_open_file("%s/data", path);
+		} else {
+			file = fopen(path, "r");
+		}
+	} else {
+		for (int minor = 0; minor < 64; minor++) {
+			file = try_open_file("/sys/class/drm/card%i/device/devcoredump/data", minor);
+			if (file)
+				break;
+		}
+	}
+
+	return file;
+}
+
 int
 main(int argc, char *argv[])
 {
 	FILE *file;
 	const char *path;
 	char *filename = NULL;
-	struct stat st;
-	int error;
+	char *line = NULL;
+	size_t line_size;
 
 	if (argc > 2) {
 		fprintf(stderr,
@@ -823,69 +899,51 @@ main(int argc, char *argv[])
 
 	if (argc == 1) {
 		if (isatty(0)) {
-			path = "/sys/class/drm/card0/error";
-			error = stat(path, &st);
-			if (error != 0) {
-				path = "/debug/dri";
-				error = stat(path, &st);
+			file = open_i915_core_dump("/sys/class/drm/card0/error");
+			if (!file) {
+				file  = open_i915_core_dump("/debug/dri");
 			}
-			if (error != 0) {
-				path = "/sys/kernel/debug/dri";
-				error = stat(path, &st);
+			if (!file) {
+				file = open_i915_core_dump("/sys/kernel/debug/dri");
 			}
-			if (error != 0) {
+			if (!file) {
+				file = open_xe_core_dump(NULL);
+			}
+			if (file == NULL) {
 				errx(1,
-				     "Couldn't find i915 debugfs directory.\n\n"
+				     "Couldn't find i915 or xe debugfs directory.\n\n"
 				     "Is debugfs mounted? You might try mounting it with a command such as:\n\n"
 				     "\tsudo mount -t debugfs debugfs /sys/kernel/debug\n");
 			}
 		} else {
-			read_data_file(stdin);
-			exit(0);
+			file = stdin;
 		}
 	} else {
 		path = argv[1];
-		error = stat(path, &st);
-		if (error != 0) {
-			fprintf(stderr, "Error opening %s: %s\n",
-					path, strerror(errno));
-			exit(1);
-		}
-	}
+		if (strcmp(path, "-") == 0) {
+				file = stdin;
+		} else {
+			FILE *i915, *xe;
 
-	if (S_ISDIR(st.st_mode)) {
-		int ret;
+			i915 = open_i915_core_dump(path);
+			xe = open_xe_core_dump(path);
 
-		ret = asprintf(&filename, "%s/i915_error_state", path);
-		assert(ret > 0);
-		file = fopen(filename, "r");
-		if (!file) {
-			int minor;
-			for (minor = 0; minor < 64; minor++) {
-				free(filename);
-				ret = asprintf(&filename, "%s/%d/i915_error_state", path, minor);
-				assert(ret > 0);
-
-				file = fopen(filename, "r");
-				if (file)
-					break;
+			if (i915 == NULL && xe == NULL) {
+				fprintf(stderr, "Error opening %s: %s\n", path, strerror(errno));
+				exit(1);
 			}
-		}
-		if (!file) {
-			fprintf(stderr, "Failed to find i915_error_state beneath %s\n",
-					path);
-			exit (1);
-		}
-	} else {
-		file = fopen(path, "r");
-		if (!file) {
-			fprintf(stderr, "Failed to open %s: %s\n",
-					path, strerror(errno));
-			exit (1);
+
+			file = i915 ? i915 : xe;
 		}
 	}
 
-	read_data_file(file);
+	getline(&line, &line_size, file);
+	rewind(file);
+	if (strncmp(line, XE_KMD_ERROR_DUMP_IDENTIFIER, strlen(XE_KMD_ERROR_DUMP_IDENTIFIER)) == 0)
+		read_xe_data_file(file);
+	else
+		read_data_file(file);
+	free(line);
 	fclose(file);
 
 	if (filename != path)
-- 
2.34.1



More information about the igt-dev mailing list