From: Tomasz Lis <tomasz.lis@intel.com>
To: intel-xe@lists.freedesktop.org
Cc: "Michał Winiarski" <michal.winiarski@intel.com>,
"Michał Wajdeczko" <michal.wajdeczko@intel.com>,
"Piotr Piórkowski" <piotr.piorkowski@intel.com>,
"Matthew Brost" <matthew.brost@intel.com>,
"Lucas De Marchi" <lucas.demarchi@intel.com>
Subject: [PATCH v2 5/7] drm/xe/vf: Rebase HWSP of all contexts after migration
Date: Fri, 16 May 2025 00:18:25 +0200 [thread overview]
Message-ID: <20250515221827.1493032-6-tomasz.lis@intel.com> (raw)
In-Reply-To: <20250515221827.1493032-1-tomasz.lis@intel.com>
All contexts require an update due to GGTT range shift, as that
affects their HWSP.
The HW status page of a context contains GGTT references, which
need to be shifted to a new range (or re-computed using the
previously updated vma nodes). The references include ring start
address and indirect state address.
v2: move some functions to better matched files
Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
---
drivers/gpu/drm/xe/xe_exec_queue.c | 8 ++++++++
drivers/gpu/drm/xe/xe_exec_queue.h | 2 ++
drivers/gpu/drm/xe/xe_guc_submit.c | 11 +++++++++++
drivers/gpu/drm/xe/xe_guc_submit.h | 2 ++
drivers/gpu/drm/xe/xe_lrc.c | 16 ++++++++++++++++
drivers/gpu/drm/xe/xe_lrc.h | 1 +
drivers/gpu/drm/xe/xe_sriov_vf.c | 17 +++++++++++++++--
7 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_exec_queue.c b/drivers/gpu/drm/xe/xe_exec_queue.c
index ce78cee5dec6..d03600519b27 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue.c
+++ b/drivers/gpu/drm/xe/xe_exec_queue.c
@@ -1041,3 +1041,11 @@ int xe_exec_queue_last_fence_test_dep(struct xe_exec_queue *q, struct xe_vm *vm)
return err;
}
+
+void xe_exec_queue_contexts_hwsp_rebase(struct xe_exec_queue *eq)
+{
+ int i;
+
+ for (i = 0; i < eq->width; ++i)
+ xe_lrc_update_hwctx_regs_with_address(eq->lrc[i]);
+}
diff --git a/drivers/gpu/drm/xe/xe_exec_queue.h b/drivers/gpu/drm/xe/xe_exec_queue.h
index 17bc50a7f05a..aeeecd38ba00 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue.h
+++ b/drivers/gpu/drm/xe/xe_exec_queue.h
@@ -90,4 +90,6 @@ int xe_exec_queue_last_fence_test_dep(struct xe_exec_queue *q,
struct xe_vm *vm);
void xe_exec_queue_update_run_ticks(struct xe_exec_queue *q);
+void xe_exec_queue_contexts_hwsp_rebase(struct xe_exec_queue *eq);
+
#endif
diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
index 69ccfb2e1cff..4e1d8a86ed7e 100644
--- a/drivers/gpu/drm/xe/xe_guc_submit.c
+++ b/drivers/gpu/drm/xe/xe_guc_submit.c
@@ -2424,3 +2424,14 @@ void xe_guc_submit_print(struct xe_guc *guc, struct drm_printer *p)
guc_exec_queue_print(q, p);
mutex_unlock(&guc->submission_state.lock);
}
+
+void xe_guc_contexts_hwsp_rebase(struct xe_guc *guc)
+{
+ struct xe_exec_queue *eq;
+ unsigned long index;
+
+ mutex_lock(&guc->submission_state.lock);
+ xa_for_each(&guc->submission_state.exec_queue_lookup, index, eq)
+ xe_exec_queue_contexts_hwsp_rebase(eq);
+ mutex_unlock(&guc->submission_state.lock);
+}
diff --git a/drivers/gpu/drm/xe/xe_guc_submit.h b/drivers/gpu/drm/xe/xe_guc_submit.h
index 2c2d2936440d..2cc44298465f 100644
--- a/drivers/gpu/drm/xe/xe_guc_submit.h
+++ b/drivers/gpu/drm/xe/xe_guc_submit.h
@@ -44,4 +44,6 @@ void
xe_guc_exec_queue_snapshot_free(struct xe_guc_submit_exec_queue_snapshot *snapshot);
void xe_guc_submit_print(struct xe_guc *guc, struct drm_printer *p);
+void xe_guc_contexts_hwsp_rebase(struct xe_guc *guc);
+
#endif
diff --git a/drivers/gpu/drm/xe/xe_lrc.c b/drivers/gpu/drm/xe/xe_lrc.c
index 61a2e87990a9..525565480aef 100644
--- a/drivers/gpu/drm/xe/xe_lrc.c
+++ b/drivers/gpu/drm/xe/xe_lrc.c
@@ -1184,6 +1184,22 @@ void xe_lrc_destroy(struct kref *ref)
kfree(lrc);
}
+/**
+ * xe_lrc_update_hwctx_regs_with_address - Re-compute GGTT references within given LRC.
+ * @lrc: the &xe_lrc struct instance
+ */
+void xe_lrc_update_hwctx_regs_with_address(struct xe_lrc *lrc)
+{
+ if (xe_lrc_has_indirect_ring_state(lrc)) {
+ xe_lrc_write_ctx_reg(lrc, CTX_INDIRECT_RING_STATE,
+ __xe_lrc_indirect_ring_ggtt_addr(lrc));
+
+ xe_lrc_write_indirect_ctx_reg(lrc, INDIRECT_CTX_RING_START,
+ __xe_lrc_ring_ggtt_addr(lrc));
+ } else
+ xe_lrc_write_ctx_reg(lrc, CTX_RING_START, __xe_lrc_ring_ggtt_addr(lrc));
+}
+
void xe_lrc_set_ring_tail(struct xe_lrc *lrc, u32 tail)
{
if (xe_lrc_has_indirect_ring_state(lrc))
diff --git a/drivers/gpu/drm/xe/xe_lrc.h b/drivers/gpu/drm/xe/xe_lrc.h
index eb6e8de8c939..e7a99cfd0abe 100644
--- a/drivers/gpu/drm/xe/xe_lrc.h
+++ b/drivers/gpu/drm/xe/xe_lrc.h
@@ -88,6 +88,7 @@ bool xe_lrc_ring_is_idle(struct xe_lrc *lrc);
u32 xe_lrc_indirect_ring_ggtt_addr(struct xe_lrc *lrc);
u32 xe_lrc_ggtt_addr(struct xe_lrc *lrc);
u32 *xe_lrc_regs(struct xe_lrc *lrc);
+void xe_lrc_update_hwctx_regs_with_address(struct xe_lrc *lrc);
u32 xe_lrc_read_ctx_reg(struct xe_lrc *lrc, int reg_nr);
void xe_lrc_write_ctx_reg(struct xe_lrc *lrc, int reg_nr, u32 val);
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
index ad863be4783e..0e73b79b3a73 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf.c
+++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
@@ -7,12 +7,14 @@
#include "xe_assert.h"
#include "xe_device.h"
+#include "xe_exec_queue_types.h"
#include "xe_gt.h"
#include "xe_gt_sriov_printk.h"
#include "xe_gt_sriov_vf.h"
#include "xe_guc_ct.h"
#include "xe_guc_submit.h"
#include "xe_irq.h"
+#include "xe_lrc.h"
#include "xe_pm.h"
#include "xe_sriov.h"
#include "xe_sriov_printk.h"
@@ -223,6 +225,15 @@ static int vf_post_migration_requery_guc(struct xe_device *xe)
return ret;
}
+static void vf_post_migration_fixup_contexts(struct xe_device *xe)
+{
+ struct xe_gt *gt;
+ unsigned int id;
+
+ for_each_gt(gt, xe, id)
+ xe_guc_contexts_hwsp_rebase(>->uc.guc);
+}
+
static void vf_post_migration_fixup_ctb(struct xe_device *xe)
{
struct xe_gt *gt;
@@ -303,9 +314,11 @@ static void vf_post_migration_recovery(struct xe_device *xe)
goto fail;
need_fixups = vf_post_migration_fixup_ggtt_nodes(xe);
- /* FIXME: add the recovery steps */
- if (need_fixups)
+ if (need_fixups) {
+ vf_post_migration_fixup_contexts(xe);
+ /* FIXME: add the recovery steps */
vf_post_migration_fixup_ctb(xe);
+ }
vf_post_migration_kickstart(xe);
vf_post_migration_notify_resfix_done(xe);
--
2.25.1
next prev parent reply other threads:[~2025-05-15 22:18 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-15 22:18 [PATCH v2 0/7] drm/xe/vf: Post-migration recovery of queues and jobs Tomasz Lis
2025-05-15 22:18 ` [PATCH v2 1/7] drm/xe/sa: Avoid caching GGTT address within the manager Tomasz Lis
2025-05-15 22:18 ` [PATCH v2 2/7] drm/xe/vf: Finish RESFIX by reset if CTB not enabled Tomasz Lis
2025-05-15 22:18 ` [PATCH v2 3/7] drm/xe/vf: Pause submissions during RESFIX fixups Tomasz Lis
2025-05-16 17:30 ` Michal Wajdeczko
2025-05-19 23:07 ` Lis, Tomasz
2025-05-15 22:18 ` [PATCH v2 4/7] drm/xe: Block reset while recovering from VF migration Tomasz Lis
2025-05-15 22:18 ` Tomasz Lis [this message]
2025-05-16 17:01 ` [PATCH v2 5/7] drm/xe/vf: Rebase HWSP of all contexts after migration Michal Wajdeczko
2025-05-15 22:18 ` [PATCH v2 6/7] drm/xe/vf: Rebase MEMIRQ structures for " Tomasz Lis
2025-05-16 17:15 ` Michal Wajdeczko
2025-05-15 22:18 ` [PATCH v2 7/7] drm/xe/vf: Post migration, repopulate ring area for pending request Tomasz Lis
2025-05-15 22:24 ` ✓ CI.Patch_applied: success for drm/xe/vf: Post-migration recovery of queues and jobs (rev2) Patchwork
2025-05-15 22:25 ` ✗ CI.checkpatch: warning " Patchwork
2025-05-15 22:26 ` ✓ CI.KUnit: success " Patchwork
2025-05-15 22:36 ` ✓ CI.Build: " Patchwork
2025-05-15 22:39 ` ✓ CI.Hooks: " Patchwork
2025-05-15 22:40 ` ✓ CI.checksparse: " Patchwork
2025-05-15 23:03 ` ✓ Xe.CI.BAT: " Patchwork
2025-05-16 14:21 ` ✓ Xe.CI.Full: " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250515221827.1493032-6-tomasz.lis@intel.com \
--to=tomasz.lis@intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=lucas.demarchi@intel.com \
--cc=matthew.brost@intel.com \
--cc=michal.wajdeczko@intel.com \
--cc=michal.winiarski@intel.com \
--cc=piotr.piorkowski@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.