[PATCH i-g-t 03/10] lib/xe: Gather workarounds debugfs dumps
Gustavo Sousa <[email protected]>
| Newsgroups | org.freedesktop.lists.igt-dev |
|---|---|
| Message-ID | <[email protected]> |
In an upcoming change, we will cache workaround information in struct xe_device. As a preparation for that, add the logic to gather the dumps of workaround debugfs files into a single array, which will be used as the cached information in the future. Signed-off-by: Gustavo Sousa <[email protected]> --- lib/xe/xe_wa.c | 92 ++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 34 deletions(-) diff --git a/lib/xe/xe_wa.c b/lib/xe/xe_wa.c index d44431e7e61f..e4e1b0bb7972 100644 --- a/lib/xe/xe_wa.c +++ b/lib/xe/xe_wa.c @@ -7,12 +7,65 @@ #include <stdint.h> #include <stdio.h> +#include "igt_core.h" #include "igt_debugfs.h" #include "igt_sysfs.h" #include "xe/xe_wa.h" #include "xe/xe_query.h" +static void free_wa_debugfs_dumps(char **dumps) +{ + for (char **dump = dumps; *dump; dump++) + free(*dump); + + free(dumps); +} + +static char **get_wa_debugfs_dumps(int fd) +{ + char **dumps; + int gt; + int debugfs_fd; + int count = 1; /* Device workarounds */ + + xe_for_each_gt(fd, gt) + count++; + + dumps = calloc(count + 1, sizeof(*dumps)); + if (!dumps) + return NULL; + + debugfs_fd = igt_debugfs_dir(fd); + if (debugfs_fd == -1) + goto err; + + count = 0; + + if (!(dumps[count++] = igt_sysfs_get(debugfs_fd, "workarounds"))) + goto err; + + xe_for_each_gt(fd, gt) { + char name[32]; + + snprintf(name, sizeof(name), "gt%d/workarounds", gt); + + if (!(dumps[count++] = igt_sysfs_get(debugfs_fd, name))) + goto err; + } + + goto out; + +err: + free_wa_debugfs_dumps(dumps); + dumps = NULL; + +out: + close(debugfs_fd); + + return dumps; +} + static bool debugfs_dump_has_wa(char *dump, const char *wa) { char *a = dump; @@ -50,27 +103,6 @@ static bool debugfs_dump_has_wa(char *dump, const char *wa) return false; } -static int debugfs_file_has_wa(int drm_fd, int debugfs_fd, - const char *debugfs_name, const char *wa) -{ - char *debugfs_dump; - - if (!igt_debugfs_exists(drm_fd, debugfs_name, O_RDONLY)) - return -1; - - debugfs_dump = igt_sysfs_get(debugfs_fd, debugfs_name); - if (debugfs_dump) { - bool has_wa = debugfs_dump_has_wa(debugfs_dump, wa); - - free(debugfs_dump); - - if (has_wa) - return 1; - } - - return 0; -} - /** * xe_wa: Check if a workaround is enabled for the device. * @fd: A drm file descriptor. @@ -80,25 +112,17 @@ static int debugfs_file_has_wa(int drm_fd, int debugfs_fd, */ int xe_wa(int fd, const char *wa) { + char **dumps = get_wa_debugfs_dumps(fd); int ret = 0; - int debugfs_fd; - unsigned int xe; - char name[256]; - debugfs_fd = igt_debugfs_dir(fd); - if (debugfs_fd == -1) + if (igt_warn_on(!dumps)) return -1; - xe_for_each_gt(fd, xe) { - sprintf(name, "gt%d/workarounds", xe); - ret = debugfs_file_has_wa(fd, debugfs_fd, name, wa); - if (ret) + for (char **dump = dumps; *dump; dump++) + if ((ret = debugfs_dump_has_wa(*dump, wa))) break; - } - if (!ret) - ret = debugfs_file_has_wa(fd, debugfs_fd, "workarounds", wa); + free_wa_debugfs_dumps(dumps); - close(debugfs_fd); return ret; } -- 2.55.0