diff options
author | Matthew Auld <matthew.auld@intel.com> | 2023-04-18 15:41:47 +0300 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2023-12-20 02:31:41 +0300 |
commit | fa4fe0db0885b089200cc336207e40f6902ebbb2 (patch) | |
tree | 247509c9681937b2fed99fbf2aab10a49316b69f /drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c | |
parent | a8a39c15b011b8ed986f55c6e52e015b0d81da8a (diff) | |
download | linux-fa4fe0db0885b089200cc336207e40f6902ebbb2.tar.xz |
drm/xe/tlb: fix expected_seqno calculation
It looks like when tlb_invalidation.seqno overflows
TLB_INVALIDATION_SEQNO_MAX, we start counting again from one, as per
send_tlb_invalidation(). This is also inline with initial value we give
it in xe_gt_tlb_invalidation_init(). When calculating the
expected_seqno we should also take this into account.
While we are here also print out the values if we ever trigger the
warning.
v2 (José):
- drm_WARN_ON() is preferred over plain WARN_ON(), since it gives
information on the originating device.
Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/248
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: José Roberto de Souza <jose.souza@intel.com>
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Diffstat (limited to 'drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c')
-rw-r--r-- | drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c index f279e21300aa..604f189dbd70 100644 --- a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c +++ b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c @@ -319,7 +319,12 @@ int xe_guc_tlb_invalidation_done_handler(struct xe_guc *guc, u32 *msg, u32 len) /* Sanity check on seqno */ expected_seqno = (gt->tlb_invalidation.seqno_recv + 1) % TLB_INVALIDATION_SEQNO_MAX; - XE_WARN_ON(expected_seqno != msg[0]); + if (!expected_seqno) + expected_seqno = 1; + if (drm_WARN_ON(>->xe->drm, expected_seqno != msg[0])) { + drm_err(>->xe->drm, "TLB expected_seqno(%d) != msg(%u)\n", + expected_seqno, msg[0]); + } gt->tlb_invalidation.seqno_recv = msg[0]; smp_wmb(); |