Re: [PATCH i-g-t 07/10] lib/xe: Add xe_wa_from_cache()

Matt Roper <[email protected]> Wed, 29 Jul 2026 15:20:05 -0700
Newsgroups org.freedesktop.lists.igt-dev
Message-ID <[email protected]>
On Tue, Jul 21, 2026 at 04:00:00PM -0300, Gustavo Sousa wrote:
> An upcoming change will need to check if a workaround is enabled
> during the creation of the xe_device struct, i.e., during the
> execution of xe_device_get().  It is not possible to call xe_wa() in
> that context because the struct is not yet cached and xe_wa() calling
> xe_device_get() will cause an infinite recursion.
> 
> Add the function xe_wa_from_cache() to allow checking for workarounds
> in that specific scenario and make a note in the function's
> documentation about its purpose.
> 
> Signed-off-by: Gustavo Sousa <[email protected]>
> ---
>  lib/xe/xe_wa.c | 34 ++++++++++++++++++++++++++++------
>  lib/xe/xe_wa.h |  1 +
>  2 files changed, 29 insertions(+), 6 deletions(-)
> 
> diff --git a/lib/xe/xe_wa.c b/lib/xe/xe_wa.c
> index 8c8f7156c21f..ac3dcf6ef1c1 100644
> --- a/lib/xe/xe_wa.c
> +++ b/lib/xe/xe_wa.c
> @@ -105,19 +105,28 @@ static bool debugfs_dump_has_wa(char *dump, const char *wa)
>  
>  /**
>   * xe_wa: Check if a workaround is enabled for the device.

The function name needs to be updated in this comment.

Otherwise,

Reviewed-by: Matt Roper <[email protected]>

> - * @fd: A drm file descriptor.
> + * @xe_dev: Xe device where the cached data is stashed.
>   * @wa: Name of the workaround to be checked.
>   *
> - * Return a boolean indicating whether the workaround is enabled.
> - * On error, returns false and a warning is printed.
> + * This function is like xe_wa(), but it receives the "incomplete"
> + * (see next paragraph) xe_device struct directly instead of a drm
> + * file descriptor.
> + *
> + * This function is only expected to be used in specific paths during
> + * the initialization of a xe_device struct (i.e. during execution of
> + * xe_device_get()), where the workaround cache is ready
> + * (i.e. xe_wa_build_cache()), but the xe_device struct is not yet
> + * fully built and cached (which is a requirement for xe_wa()).
>   */
> -bool xe_wa(int fd, const char *wa)
> +bool xe_wa_from_cache(struct xe_device *xe_dev, const char *wa)
>  {
> -	char **dumps = xe_device_get(fd)->wa_cache;
> +	char **dumps;
>  
> -	if (igt_warn_on(!dumps))
> +	if (igt_warn_on(!xe_dev->wa_cache))
>  		return false;
>  
> +	dumps = xe_dev->wa_cache;
> +
>  	for (char **dump = dumps; *dump; dump++)
>  		if (debugfs_dump_has_wa(*dump, wa))
>  			return true;
> @@ -125,6 +134,19 @@ bool xe_wa(int fd, const char *wa)
>  	return false;
>  }
>  
> +/**
> + * xe_wa: Check if a workaround is enabled for the device.
> + * @fd: A drm file descriptor.
> + * @wa: Name of the workaround to be checked.
> + *
> + * Return a boolean indicating whether the workaround is enabled.
> + * On error, returns false and a warning is printed.
> + */
> +bool xe_wa(int fd, const char *wa)
> +{
> +	return xe_wa_from_cache(xe_device_get(fd), wa);
> +}
> +
>  /**
>   * xe_wa_build_cache: Build cached data for xe_wa().
>   * @xe_dev: Xe device where the cache will be stashed.
> diff --git a/lib/xe/xe_wa.h b/lib/xe/xe_wa.h
> index aa1c50c0f9c9..2f141ae15016 100644
> --- a/lib/xe/xe_wa.h
> +++ b/lib/xe/xe_wa.h
> @@ -14,5 +14,6 @@ bool xe_wa(int fd, const char *wa);
>  
>  void xe_wa_build_cache(struct xe_device *xe_dev);
>  void xe_wa_free_cache(struct xe_device *xe_dev);
> +bool xe_wa_from_cache(struct xe_device *xe_dev, const char *wa);
>  
>  #endif /* XE_WA_H */
> 
> -- 
> 2.55.0
> 

-- 
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation