[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, >->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