[Intel-xe] [RFC 2/2] drm/xe: Register OOB workarounds
Mika Kuoppala
mika.kuoppala at linux.intel.com
Wed Apr 12 11:31:18 UTC 2023
Lucas De Marchi <lucas.demarchi at intel.com> writes:
> Some workarounds can't be implemented in the xe_wa.c as entries
> on a table since they need to be spread throughout the driver.
> Provide a mechanism to allow "registering" these workarounds so they can
> later be dumped together with the others.
>
> This uses a trick to define the static const entry when checking if the
> workarounds is "enabled". That entry is put in a specific section so
> later we can access all the entries in that section. Normally the linker
> provides the __start_<section>/__stop_<section> symbols. However since
> the kernel itself uses a linker script, this doesn't work, hence provide
> our own custom linker script to do what is missing.
>
> Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
> ---
> drivers/gpu/drm/xe/Makefile | 2 ++
> drivers/gpu/drm/xe/xe.lds | 8 ++++++++
> drivers/gpu/drm/xe/xe_guc.c | 6 +++---
> drivers/gpu/drm/xe/xe_rtp_types.h | 8 ++++++++
> drivers/gpu/drm/xe/xe_wa.c | 14 ++++++++++++--
> drivers/gpu/drm/xe/xe_wa.h | 10 ++++++++++
> 6 files changed, 43 insertions(+), 5 deletions(-)
> create mode 100644 drivers/gpu/drm/xe/xe.lds
>
> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> index aceca651de57..9cbcc0ed06b2 100644
> --- a/drivers/gpu/drm/xe/Makefile
> +++ b/drivers/gpu/drm/xe/Makefile
> @@ -216,6 +216,8 @@ ifeq ($(CONFIG_DRM_FBDEV_EMULATION),y)
> xe-$(CONFIG_DRM_XE_DISPLAY) += display/intel_fbdev.o
> endif
>
> +LDFLAGS_xe.o := -T $(srctree)/$(src)/xe.lds
> +
> obj-$(CONFIG_DRM_XE) += xe.o
> obj-$(CONFIG_DRM_XE_KUNIT_TEST) += tests/
>
> diff --git a/drivers/gpu/drm/xe/xe.lds b/drivers/gpu/drm/xe/xe.lds
> new file mode 100644
> index 000000000000..a2187eab2c8b
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe.lds
> @@ -0,0 +1,8 @@
> +SECTIONS
> +{
> + .rodata.__xe_wa_oob ALIGN(8) : {
> + __start___xe_wa_oob = .;
> + *(__xe_wa_oob)
> + __stop___xe_wa_oob = .;
> + }
> +}
> diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c
> index ee71b969bcbf..608ac2a022e8 100644
> --- a/drivers/gpu/drm/xe/xe_guc.c
> +++ b/drivers/gpu/drm/xe/xe_guc.c
> @@ -20,6 +20,7 @@
> #include "xe_mmio.h"
> #include "xe_platform_types.h"
> #include "xe_uc_fw.h"
> +#include "xe_wa.h"
> #include "xe_wopcm.h"
>
> static struct xe_gt *
> @@ -134,9 +135,8 @@ static u32 guc_ctl_wa_flags(struct xe_guc *guc)
> struct xe_gt *gt = guc_to_gt(guc);
> u32 flags = 0;
>
> - /* Wa_22012773006:gen11,gen12 < XeHP */
> - if (GRAPHICS_VER(xe) >= 11 &&
> - GRAPHICS_VERx100(xe) < 1250)
> + if (XE_WA("22012773006",
> + GRAPHICS_VER(xe) >= 11 && GRAPHICS_VERx100(xe) < 1250))
> flags |= GUC_WA_POLLCS;
Now the entry will appear regardless if it was activated.
Would it add value to have it only listed if it was activated, or even
both: implemented and activated as separate entries.
-Mika
>
> /* Wa_16011759253 */
> diff --git a/drivers/gpu/drm/xe/xe_rtp_types.h b/drivers/gpu/drm/xe/xe_rtp_types.h
> index e87f1b280d96..4f7832d074bd 100644
> --- a/drivers/gpu/drm/xe/xe_rtp_types.h
> +++ b/drivers/gpu/drm/xe/xe_rtp_types.h
> @@ -101,4 +101,12 @@ struct xe_rtp_entry {
> u8 flags;
> };
>
> +/**
> + * struct xe_rtp_entry - Entry in a special section, used for "out-of-band"
> + * definitions
> + */
> +struct xe_rtp_oob_entry {
> + const char *name;
> +};
> +
> #endif
> diff --git a/drivers/gpu/drm/xe/xe_wa.c b/drivers/gpu/drm/xe/xe_wa.c
> index 100315c03014..26fb91aae014 100644
> --- a/drivers/gpu/drm/xe/xe_wa.c
> +++ b/drivers/gpu/drm/xe/xe_wa.c
> @@ -72,8 +72,8 @@
> * engine registers are restored in a context restore sequence. This is
> * currently not used in the driver.
> *
> - * - Other: There are WAs that, due to their nature, cannot be applied from a
> - * central place. Those are peppered around the rest of the code, as needed.
> + * - Other/OOB: There are WAs that, due to their nature, cannot be applied from
> + * a central place. Those are peppered around the rest of the code, as needed.
> * Workarounds related to the display IP are the main example.
> *
> * .. [1] Technically, some registers are powercontext saved & restored, so they
> @@ -92,6 +92,9 @@
> #define _MMIO(x) _XE_RTP_REG(x)
> #define MCR_REG(x) _XE_RTP_MCR_REG(x)
>
> +extern const struct xe_rtp_oob_entry __start___xe_wa_oob[];
> +extern const struct xe_rtp_oob_entry __stop___xe_wa_oob[];
> +
> __diag_push();
> __diag_ignore_all("-Woverride-init", "Allow field overrides in table");
>
> @@ -665,6 +668,7 @@ void xe_wa_process_lrc(struct xe_hw_engine *hwe)
> void xe_wa_dump(struct xe_device *xe, struct drm_printer *p)
> {
> const struct xe_rtp_entry *entry;
> + const struct xe_rtp_oob_entry *oob_entry;
>
> drm_printf(p, "Workarounds\n");
>
> @@ -679,4 +683,10 @@ void xe_wa_dump(struct xe_device *xe, struct drm_printer *p)
> drm_printf(p, "\tLRC\n");
> for (entry = lrc_was; entry && entry->name; entry++)
> drm_printf(p, "\t\t%s\n", entry->name);
> +
> + drm_printf(p, "\tOOB\n");
> + for (oob_entry = __start___xe_wa_oob;
> + oob_entry < __stop___xe_wa_oob;
> + oob_entry++)
> + drm_printf(p, "\t\t%s\n", oob_entry->name);
> }
> diff --git a/drivers/gpu/drm/xe/xe_wa.h b/drivers/gpu/drm/xe/xe_wa.h
> index 97d104b7e566..212fc9b4efe6 100644
> --- a/drivers/gpu/drm/xe/xe_wa.h
> +++ b/drivers/gpu/drm/xe/xe_wa.h
> @@ -6,6 +6,8 @@
> #ifndef _XE_WA_
> #define _XE_WA_
>
> +#include "xe_rtp_types.h"
> +
> struct drm_printer;
> struct xe_device;
> struct xe_gt;
> @@ -19,4 +21,12 @@ void xe_wa_dump(struct xe_device *xe, struct drm_printer *p);
>
> void xe_reg_whitelist_process_engine(struct xe_hw_engine *hwe);
>
> +#define XE_WA(name__, cond__) ({ \
> + static const struct xe_rtp_oob_entry entry__ \
> + __used __aligned(8) __section("__xe_wa_oob") = { \
> + .name = name__, \
> + }; \
> + cond__; \
> +})
> +
> #endif
> --
> 2.39.0
More information about the Intel-xe
mailing list