[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