[PATCH v4 1/5] drm/xe: add xe_device_wa infrastructure

Lucas De Marchi lucas.demarchi at intel.com
Thu Jun 26 22:18:45 UTC 2025


On Wed, Jun 25, 2025 at 01:07:46PM -0700, Matt Atwood wrote:
>There are some workarounds that must be applied before gt init,
>wa_150154044425 for example. Instead of sprinkling them conditionally
>throughout the driver as we did for i915 generate an oob.rules file
>reusing the RTP infrastructure to make these easier to track.
>
>v2: rename xe_soc_wa to xe_device_wa
>
>Signed-off-by: Matt Atwood <matthew.s.atwood at intel.com>
>---
> drivers/gpu/drm/xe/Makefile               | 11 ++++++++-
> drivers/gpu/drm/xe/xe_device_wa_oob.rules |  0
> drivers/gpu/drm/xe/xe_gen_wa_oob.c        | 27 ++++++++++++++++-------
> 3 files changed, 29 insertions(+), 9 deletions(-)
> create mode 100644 drivers/gpu/drm/xe/xe_device_wa_oob.rules
>
>diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
>index eee6bac01a00..64498ce2a839 100644
>--- a/drivers/gpu/drm/xe/Makefile
>+++ b/drivers/gpu/drm/xe/Makefile
>@@ -21,6 +21,15 @@ $(obj)/generated/%_wa_oob.c $(obj)/generated/%_wa_oob.h: $(obj)/xe_gen_wa_oob \
> 		 $(src)/xe_wa_oob.rules
> 	$(call cmd,wa_oob)
>
>+generated_device_oob := $(obj)/generated/xe_device_wa_oob.c $(obj)/generated/xe_device_wa_oob.h
>+quiet_cmd_device_wa_oob = GEN     $(notdir $(generated_device_oob))
>+      cmd_device_wa_oob = mkdir -p $(@D); $^ $(generated_device_oob)
>+$(obj)/generated/%_device_wa_oob.c $(obj)/generated/%_device_wa_oob.h: $(obj)/xe_gen_wa_oob \
>+		 $(src)/xe_device_wa_oob.rules
>+	$(call cmd,device_wa_oob)
>+
>+
>+
> # Please keep these build lists sorted!
>
> # core driver code
>@@ -339,4 +348,4 @@ $(obj)/%.hdrtest: $(src)/%.h FORCE
> 	$(call if_changed_dep,hdrtest)
>
> uses_generated_oob := $(addprefix $(obj)/, $(xe-y))
>-$(uses_generated_oob): $(obj)/generated/xe_wa_oob.h
>+$(uses_generated_oob): $(obj)/generated/xe_wa_oob.h $(obj)/generated/xe_device_wa_oob.h
>diff --git a/drivers/gpu/drm/xe/xe_device_wa_oob.rules b/drivers/gpu/drm/xe/xe_device_wa_oob.rules
>new file mode 100644
>index 000000000000..e69de29bb2d1
>diff --git a/drivers/gpu/drm/xe/xe_gen_wa_oob.c b/drivers/gpu/drm/xe/xe_gen_wa_oob.c
>index ed9183599e31..d8bb26317f28 100644
>--- a/drivers/gpu/drm/xe/xe_gen_wa_oob.c
>+++ b/drivers/gpu/drm/xe/xe_gen_wa_oob.c
>@@ -18,8 +18,8 @@
> 	" *\n" \
> 	" * This file was generated from rules: %s\n" \
> 	" */\n" \
>-	"#ifndef _GENERATED_XE_WA_OOB_\n" \
>-	"#define _GENERATED_XE_WA_OOB_\n" \
>+	"#ifndef _GENERATED_%s_\n" \
>+	"#define _GENERATED_%s_\n" \
> 	"\n" \
> 	"enum {\n"
>
>@@ -52,7 +52,7 @@ static char *strip(char *line, size_t linelen)
> }
>
> #define MAX_LINE_LEN 4096
>-static int parse(FILE *input, FILE *csource, FILE *cheader)
>+static int parse(FILE *input, FILE *csource, FILE *cheader, bool device)
> {
> 	char line[MAX_LINE_LEN + 1];
> 	char *name, *prev_name = NULL, *rules;
>@@ -96,7 +96,10 @@ static int parse(FILE *input, FILE *csource, FILE *cheader)
> 		}
>
> 		if (name) {
>-			fprintf(cheader, "\tXE_WA_OOB_%s = %u,\n", name, idx);
>+			if (device == false)
>+				fprintf(cheader, "\tXE_WA_OOB_%s = %u,\n", name, idx);
>+			else
>+				fprintf(cheader, "\tXE_DEVICE_WA_OOB_%s = %u,\n", name, idx);
>
> 			/* Close previous entry before starting a new one */
> 			if (idx)
>@@ -117,8 +120,10 @@ static int parse(FILE *input, FILE *csource, FILE *cheader)
> 	/* Close last entry */
> 	if (idx)
> 		fprintf(csource, ") },\n");
>-
>-	fprintf(cheader, "\t_XE_WA_OOB_COUNT = %u\n", idx);
>+	if (device == false)
>+		fprintf(cheader, "\t_XE_WA_OOB_COUNT = %u\n", idx);
>+	else
>+		fprintf(cheader, "\t_XE_DEVICE_WA_OOB_COUNT = %u\n", idx);
>
> 	return 0;
> }
>@@ -157,9 +162,15 @@ int main(int argc, const char *argv[])
> 		}
> 	}
>
>-	fprintf(args[ARGS_CHEADER].f, HEADER, args[ARGS_INPUT].fn);
>+	char *device = strstr(args[ARGS_CHEADER].fn, "device_");
>+	if (device == NULL)
>+		fprintf(args[ARGS_CHEADER].f, HEADER, args[ARGS_INPUT].fn, "XE_WA_OOB", "XE_WA_OOB");
>+	else
>+		fprintf(args[ARGS_CHEADER].f, HEADER, args[ARGS_INPUT].fn, "XE_DEVICE_WA_OOB", "XE_DEVICE_WA_OOB");

We could just derive a prefix from the argument rather than look for a
hardcoded value and use another hardcoded value.

	char prefix[128];

	...

	if (fn_to_prefix(args[ARGS_CHEADER].fn, prefix, sizeof(prefix)) < 0)
		return 1;

where fn_to_prefix() does something like (totally untested, just to give
an idea):

	if (strlcpy(prefix, fn, sz) >= sz)
		return -ENAMETOOLONG;

	for (p = prefix; *p; p++) {
		switch (*p) {
		case '.':
			*p = '_';
			break;
		default:
			*p = toupper(*p);
			break;
		}
	}

Then this is a "prep patch" to derive the hardcoded defines from the
filename, which makes sense in our case.

Lucas De Marchi

>+
>+	bool prefix = device != NULL ? true : false;
> 	ret = parse(args[ARGS_INPUT].f, args[ARGS_CSOURCE].f,
>-		    args[ARGS_CHEADER].f);
>+		    args[ARGS_CHEADER].f, prefix);
> 	if (!ret)
> 		fprintf(args[ARGS_CHEADER].f, FOOTER);
>
>-- 
>2.49.0
>


More information about the Intel-xe mailing list