[PATCH 2/2] tools/intel_error_decode: Enable support for xe driver in the tool
Rodrigo Vivi
rodrigo.vivi at intel.com
Thu Feb 6 16:24:34 UTC 2025
On Fri, Jan 31, 2025 at 08:29:40PM +0000, sai.gowtham.ch at intel.com wrote:
> 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"
>From this one we can see that the right place for the lib is under:
igt/lib/xe/
> +#include "xe/intel_error_decode_xe_lib.h"
also, what about
devcoredump_decode.h ?
> +
> +#define XE_KMD_ERROR_DUMP_IDENTIFIER "**** Xe Device Coredump ****"
what about having this in the lib?
>
> 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");
This i915 vs xe detection looks complex.
We should keep these i915 possibilities inside the i915 function
and here have a simple is i915 call i915 function, elif xe call xe function else error below...
> }
> - 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);
xe_read_data_file() is a better name for this function
> + else
> + read_data_file(file);
and probably good to rename this to
i915_read_data_file()
in other words, add i915_ prefix to all current functions exported in lib/i915/intel_decode.h
and even rename the file to i915_error_decode.h and in a separate patch...
> + free(line);
> fclose(file);
>
> if (filename != path)
> --
> 2.34.1
>
More information about the igt-dev
mailing list