Skip to content

Commit b24dcf1

Browse files
icklerodrigovivi
authored andcommitted
drm/i915/gt: Serialize GRDOM access between multiple engine resets
Don't allow two engines to be reset in parallel, as they would both try to select a reset bit (and send requests to common registers) and wait on that register, at the same time. Serialize control of the reset requests/acks using the uncore->lock, which will also ensure that no other GT state changes at the same time as the actual reset. Cc: [email protected] # v4.4 and upper Reported-by: Mika Kuoppala <[email protected]> Signed-off-by: Chris Wilson <[email protected]> Acked-by: Mika Kuoppala <[email protected]> Reviewed-by: Andi Shyti <[email protected]> Reviewed-by: Andrzej Hajda <[email protected]> Acked-by: Thomas Hellström <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]> Signed-off-by: Rodrigo Vivi <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/e0a2d894e77aed7c2e36b0d1abdc7dbac3011729.1657639152.git.mchehab@kernel.org (cherry picked from commit 336561a) Signed-off-by: Rodrigo Vivi <[email protected]>
1 parent aff1e0b commit b24dcf1

File tree

1 file changed

+28
-9
lines changed

1 file changed

+28
-9
lines changed

drivers/gpu/drm/i915/gt/intel_reset.c

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -300,9 +300,9 @@ static int gen6_hw_domain_reset(struct intel_gt *gt, u32 hw_domain_mask)
300300
return err;
301301
}
302302

303-
static int gen6_reset_engines(struct intel_gt *gt,
304-
intel_engine_mask_t engine_mask,
305-
unsigned int retry)
303+
static int __gen6_reset_engines(struct intel_gt *gt,
304+
intel_engine_mask_t engine_mask,
305+
unsigned int retry)
306306
{
307307
struct intel_engine_cs *engine;
308308
u32 hw_mask;
@@ -321,6 +321,20 @@ static int gen6_reset_engines(struct intel_gt *gt,
321321
return gen6_hw_domain_reset(gt, hw_mask);
322322
}
323323

324+
static int gen6_reset_engines(struct intel_gt *gt,
325+
intel_engine_mask_t engine_mask,
326+
unsigned int retry)
327+
{
328+
unsigned long flags;
329+
int ret;
330+
331+
spin_lock_irqsave(&gt->uncore->lock, flags);
332+
ret = __gen6_reset_engines(gt, engine_mask, retry);
333+
spin_unlock_irqrestore(&gt->uncore->lock, flags);
334+
335+
return ret;
336+
}
337+
324338
static struct intel_engine_cs *find_sfc_paired_vecs_engine(struct intel_engine_cs *engine)
325339
{
326340
int vecs_id;
@@ -487,9 +501,9 @@ static void gen11_unlock_sfc(struct intel_engine_cs *engine)
487501
rmw_clear_fw(uncore, sfc_lock.lock_reg, sfc_lock.lock_bit);
488502
}
489503

490-
static int gen11_reset_engines(struct intel_gt *gt,
491-
intel_engine_mask_t engine_mask,
492-
unsigned int retry)
504+
static int __gen11_reset_engines(struct intel_gt *gt,
505+
intel_engine_mask_t engine_mask,
506+
unsigned int retry)
493507
{
494508
struct intel_engine_cs *engine;
495509
intel_engine_mask_t tmp;
@@ -583,8 +597,11 @@ static int gen8_reset_engines(struct intel_gt *gt,
583597
struct intel_engine_cs *engine;
584598
const bool reset_non_ready = retry >= 1;
585599
intel_engine_mask_t tmp;
600+
unsigned long flags;
586601
int ret;
587602

603+
spin_lock_irqsave(&gt->uncore->lock, flags);
604+
588605
for_each_engine_masked(engine, gt, engine_mask, tmp) {
589606
ret = gen8_engine_reset_prepare(engine);
590607
if (ret && !reset_non_ready)
@@ -612,17 +629,19 @@ static int gen8_reset_engines(struct intel_gt *gt,
612629
* This is best effort, so ignore any error from the initial reset.
613630
*/
614631
if (IS_DG2(gt->i915) && engine_mask == ALL_ENGINES)
615-
gen11_reset_engines(gt, gt->info.engine_mask, 0);
632+
__gen11_reset_engines(gt, gt->info.engine_mask, 0);
616633

617634
if (GRAPHICS_VER(gt->i915) >= 11)
618-
ret = gen11_reset_engines(gt, engine_mask, retry);
635+
ret = __gen11_reset_engines(gt, engine_mask, retry);
619636
else
620-
ret = gen6_reset_engines(gt, engine_mask, retry);
637+
ret = __gen6_reset_engines(gt, engine_mask, retry);
621638

622639
skip_reset:
623640
for_each_engine_masked(engine, gt, engine_mask, tmp)
624641
gen8_engine_reset_cancel(engine);
625642

643+
spin_unlock_irqrestore(&gt->uncore->lock, flags);
644+
626645
return ret;
627646
}
628647

0 commit comments

Comments
 (0)