[PATCH 4/4] drm/xe: Add performance tunings to debugfs

Lucas De Marchi lucas.demarchi at intel.com
Thu Feb 27 04:54:27 UTC 2025


On Wed, Feb 26, 2025 at 11:21:06AM +0000, Tvrtko Ursulin wrote:
>Add a list of active tuning workarounds to debugfs, analogous to the

s/tuning workarounds/tunings/

>existing "plain" workarounds list.
>
>Rationale being that it seems to make sense to either have both or none.
>
>Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at igalia.com>
>Cc: Lucas De Marchi <lucas.demarchi at intel.com>
>Cc: Matt Roper <matthew.d.roper at intel.com>

Reviewed-by: Lucas De Marchi <lucas.demarchi at intel.com>

thanks
Lucas De Marchi

>---
> drivers/gpu/drm/xe/xe_gt.c         |  4 ++
> drivers/gpu/drm/xe/xe_gt_debugfs.c | 11 ++++++
> drivers/gpu/drm/xe/xe_gt_types.h   | 10 +++++
> drivers/gpu/drm/xe/xe_tuning.c     | 59 ++++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_tuning.h     |  3 ++
> 5 files changed, 87 insertions(+)
>
>diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c
>index d59c03bc05b7..cd5b14e38051 100644
>--- a/drivers/gpu/drm/xe/xe_gt.c
>+++ b/drivers/gpu/drm/xe/xe_gt.c
>@@ -361,6 +361,10 @@ int xe_gt_init_early(struct xe_gt *gt)
> 	if (err)
> 		return err;
>
>+	err = xe_tuning_init(gt);
>+	if (err)
>+		return err;
>+
> 	xe_wa_process_oob(gt);
>
> 	xe_force_wake_init_gt(gt, gt_to_fw(gt));
>diff --git a/drivers/gpu/drm/xe/xe_gt_debugfs.c b/drivers/gpu/drm/xe/xe_gt_debugfs.c
>index e7792858b1e4..2d63a69cbfa3 100644
>--- a/drivers/gpu/drm/xe/xe_gt_debugfs.c
>+++ b/drivers/gpu/drm/xe/xe_gt_debugfs.c
>@@ -30,6 +30,7 @@
> #include "xe_reg_sr.h"
> #include "xe_reg_whitelist.h"
> #include "xe_sriov.h"
>+#include "xe_tuning.h"
> #include "xe_uc_debugfs.h"
> #include "xe_wa.h"
>
>@@ -217,6 +218,15 @@ static int workarounds(struct xe_gt *gt, struct drm_printer *p)
> 	return 0;
> }
>
>+static int tunings(struct xe_gt *gt, struct drm_printer *p)
>+{
>+	xe_pm_runtime_get(gt_to_xe(gt));
>+	xe_tuning_dump(gt, p);
>+	xe_pm_runtime_put(gt_to_xe(gt));
>+
>+	return 0;
>+}
>+
> static int pat(struct xe_gt *gt, struct drm_printer *p)
> {
> 	xe_pm_runtime_get(gt_to_xe(gt));
>@@ -300,6 +310,7 @@ static const struct drm_info_list debugfs_list[] = {
> 	{"powergate_info", .show = xe_gt_debugfs_simple_show, .data = powergate_info},
> 	{"register-save-restore", .show = xe_gt_debugfs_simple_show, .data = register_save_restore},
> 	{"workarounds", .show = xe_gt_debugfs_simple_show, .data = workarounds},
>+	{"tunings", .show = xe_gt_debugfs_simple_show, .data = tunings},
> 	{"pat", .show = xe_gt_debugfs_simple_show, .data = pat},
> 	{"mocs", .show = xe_gt_debugfs_simple_show, .data = mocs},
> 	{"default_lrc_rcs", .show = xe_gt_debugfs_simple_show, .data = rcs_default_lrc},
>diff --git a/drivers/gpu/drm/xe/xe_gt_types.h b/drivers/gpu/drm/xe/xe_gt_types.h
>index 6e66bf0e8b3f..dd2969a1846d 100644
>--- a/drivers/gpu/drm/xe/xe_gt_types.h
>+++ b/drivers/gpu/drm/xe/xe_gt_types.h
>@@ -413,6 +413,16 @@ struct xe_gt {
> 		bool oob_initialized;
> 	} wa_active;
>
>+	/** @tuning_active: keep track of active tunings */
>+	struct {
>+		/** @tuning_active.gt: bitmap with active GT tunings */
>+		unsigned long *gt;
>+		/** @tuning_active.engine: bitmap with active engine tunings */
>+		unsigned long *engine;
>+		/** @tuning_active.lrc: bitmap with active LRC tunings */
>+		unsigned long *lrc;
>+	} tuning_active;
>+
> 	/** @user_engines: engines present in GT and available to userspace */
> 	struct {
> 		/**
>diff --git a/drivers/gpu/drm/xe/xe_tuning.c b/drivers/gpu/drm/xe/xe_tuning.c
>index 454ee00ef45f..03fffd208483 100644
>--- a/drivers/gpu/drm/xe/xe_tuning.c
>+++ b/drivers/gpu/drm/xe/xe_tuning.c
>@@ -7,6 +7,8 @@
>
> #include <kunit/visibility.h>
>
>+#include <drm/drm_managed.h>
>+
> #include "regs/xe_gt_regs.h"
> #include "xe_gt_types.h"
> #include "xe_platform_types.h"
>@@ -151,10 +153,44 @@ static const struct xe_rtp_entry_sr lrc_tunings[] = {
> 	{}
> };
>
>+/**
>+ * xe_tuning_init - initialize gt with tunings bookkeeping
>+ * @gt: GT instance to initialize
>+ *
>+ * Returns 0 for success, negative error code otherwise.
>+ */
>+int xe_tuning_init(struct xe_gt *gt)
>+{
>+	struct xe_device *xe = gt_to_xe(gt);
>+	size_t n_lrc, n_engine, n_gt, total;
>+	unsigned long *p;
>+
>+	n_gt = BITS_TO_LONGS(ARRAY_SIZE(gt_tunings));
>+	n_engine = BITS_TO_LONGS(ARRAY_SIZE(engine_tunings));
>+	n_lrc = BITS_TO_LONGS(ARRAY_SIZE(lrc_tunings));
>+	total = n_gt + n_engine + n_lrc;
>+
>+	p = drmm_kzalloc(&xe->drm, sizeof(*p) * total, GFP_KERNEL);
>+	if (!p)
>+		return -ENOMEM;
>+
>+	gt->tuning_active.gt = p;
>+	p += n_gt;
>+	gt->tuning_active.engine = p;
>+	p += n_engine;
>+	gt->tuning_active.lrc = p;
>+
>+	return 0;
>+}
>+ALLOW_ERROR_INJECTION(xe_tuning_init, ERRNO); /* See xe_pci_probe() */
>+
> void xe_tuning_process_gt(struct xe_gt *gt)
> {
> 	struct xe_rtp_process_ctx ctx = XE_RTP_PROCESS_CTX_INITIALIZER(gt);
>
>+	xe_rtp_process_ctx_enable_active_tracking(&ctx,
>+						  gt->tuning_active.gt,
>+						  ARRAY_SIZE(gt_tunings));
> 	xe_rtp_process_to_sr(&ctx, gt_tunings, &gt->reg_sr);
> }
> EXPORT_SYMBOL_IF_KUNIT(xe_tuning_process_gt);
>@@ -163,6 +199,9 @@ void xe_tuning_process_engine(struct xe_hw_engine *hwe)
> {
> 	struct xe_rtp_process_ctx ctx = XE_RTP_PROCESS_CTX_INITIALIZER(hwe);
>
>+	xe_rtp_process_ctx_enable_active_tracking(&ctx,
>+						  hwe->gt->tuning_active.engine,
>+						  ARRAY_SIZE(engine_tunings));
> 	xe_rtp_process_to_sr(&ctx, engine_tunings, &hwe->reg_sr);
> }
> EXPORT_SYMBOL_IF_KUNIT(xe_tuning_process_engine);
>@@ -179,5 +218,25 @@ void xe_tuning_process_lrc(struct xe_hw_engine *hwe)
> {
> 	struct xe_rtp_process_ctx ctx = XE_RTP_PROCESS_CTX_INITIALIZER(hwe);
>
>+	xe_rtp_process_ctx_enable_active_tracking(&ctx,
>+						  hwe->gt->tuning_active.lrc,
>+						  ARRAY_SIZE(lrc_tunings));
> 	xe_rtp_process_to_sr(&ctx, lrc_tunings, &hwe->reg_lrc);
> }
>+
>+void xe_tuning_dump(struct xe_gt *gt, struct drm_printer *p)
>+{
>+	size_t idx;
>+
>+	drm_printf(p, "GT Tunings\n");
>+	for_each_set_bit(idx, gt->tuning_active.gt, ARRAY_SIZE(gt_tunings))
>+		drm_printf_indent(p, 1, "%s\n", gt_tunings[idx].name);
>+
>+	drm_printf(p, "\nEngine Tunings\n");
>+	for_each_set_bit(idx, gt->tuning_active.engine, ARRAY_SIZE(engine_tunings))
>+		drm_printf_indent(p, 1, "%s\n", engine_tunings[idx].name);
>+
>+	drm_printf(p, "\nLRC Tunings\n");
>+	for_each_set_bit(idx, gt->tuning_active.lrc, ARRAY_SIZE(lrc_tunings))
>+		drm_printf_indent(p, 1, "%s\n", lrc_tunings[idx].name);
>+}
>diff --git a/drivers/gpu/drm/xe/xe_tuning.h b/drivers/gpu/drm/xe/xe_tuning.h
>index 4f9c3ac3b516..dd0d3ccc9c65 100644
>--- a/drivers/gpu/drm/xe/xe_tuning.h
>+++ b/drivers/gpu/drm/xe/xe_tuning.h
>@@ -6,11 +6,14 @@
> #ifndef _XE_TUNING_
> #define _XE_TUNING_
>
>+struct drm_printer;
> struct xe_gt;
> struct xe_hw_engine;
>
>+int xe_tuning_init(struct xe_gt *gt);
> void xe_tuning_process_gt(struct xe_gt *gt);
> void xe_tuning_process_engine(struct xe_hw_engine *hwe);
> void xe_tuning_process_lrc(struct xe_hw_engine *hwe);
>+void xe_tuning_dump(struct xe_gt *gt, struct drm_printer *p);
>
> #endif
>-- 
>2.48.0
>


More information about the Intel-xe mailing list