Skip to content

Commit

Permalink
drm/i915: No TLB invalidation on wedged GT
Browse files Browse the repository at this point in the history
It is not an error for GuC TLB invalidations to fail when the GT is
wedged or disabled, so do not process a wait failure as one in
guc_send_invalidate_tlb.

Signed-off-by: Fei Yang <fei.yang@intel.com>
Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
CC: John Harrison <john.c.harrison@intel.com>
Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Acked-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Acked-by: Nirmoy Das <nirmoy.das@intel.com>
Signed-off-by: Andi Shyti <andi.shyti@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231017180806.3054290-6-jonathan.cavitt@intel.com
  • Loading branch information
Jonathan Cavitt authored and Andi Shyti committed Oct 18, 2023
1 parent 2202eca commit 55ac6ea
Showing 1 changed file with 31 additions and 1 deletion.
32 changes: 31 additions & 1 deletion drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@

#include "i915_drv.h"
#include "i915_reg.h"
#include "i915_irq.h"
#include "i915_trace.h"

/**
Expand Down Expand Up @@ -1935,6 +1936,12 @@ void intel_guc_submission_cancel_requests(struct intel_guc *guc)

/* GuC is blown away, drop all references to contexts */
xa_destroy(&guc->context_lookup);

/*
* Wedged GT won't respond to any TLB invalidation request. Simply
* release all the blocked waiters.
*/
wake_up_all_tlb_invalidate(guc);
}

void intel_guc_submission_reset_finish(struct intel_guc *guc)
Expand Down Expand Up @@ -4749,10 +4756,19 @@ static long must_wait_woken(struct wait_queue_entry *wq_entry, long timeout)
return timeout;
}

static bool intel_gt_is_enabled(const struct intel_gt *gt)
{
/* Check if GT is wedged or suspended */
if (intel_gt_is_wedged(gt) || !intel_irqs_enabled(gt->i915))
return false;
return true;
}

static int guc_send_invalidate_tlb(struct intel_guc *guc,
enum intel_guc_tlb_invalidation_type type)
{
struct intel_guc_tlb_wait _wq, *wq = &_wq;
struct intel_gt *gt = guc_to_gt(guc);
DEFINE_WAIT_FUNC(wait, woken_wake_function);
int err;
u32 seqno;
Expand All @@ -4766,6 +4782,13 @@ static int guc_send_invalidate_tlb(struct intel_guc *guc,
};
u32 size = ARRAY_SIZE(action);

/*
* Early guard against GT enablement. TLB invalidation should not be
* attempted if the GT is disabled due to suspend/wedge.
*/
if (!intel_gt_is_enabled(gt))
return -EINVAL;

init_waitqueue_head(&_wq.wq);

if (xa_alloc_cyclic_irq(&guc->tlb_lookup, &seqno, wq,
Expand Down Expand Up @@ -4798,7 +4821,14 @@ static int guc_send_invalidate_tlb(struct intel_guc *guc,
if (err)
goto out;

if (!must_wait_woken(&wait, intel_guc_ct_max_queue_time_jiffies())) {
/*
* Late guard against GT enablement. It is not an error for the TLB
* invalidation to time out if the GT is disabled during the process
* due to suspend/wedge. In fact, the TLB invalidation is cancelled
* in this case.
*/
if (!must_wait_woken(&wait, intel_guc_ct_max_queue_time_jiffies()) &&
intel_gt_is_enabled(gt)) {
guc_err(guc,
"TLB invalidation response timed out for seqno %u\n", seqno);
err = -ETIME;
Expand Down

0 comments on commit 55ac6ea

Please sign in to comment.