OSDN Git Service

drm/i915/gt: Sanitize RPS interrupts upon resume
authorChris Wilson <chris@chris-wilson.co.uk>
Sat, 2 May 2020 17:35:12 +0000 (18:35 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Sun, 3 May 2020 07:24:36 +0000 (08:24 +0100)
Currently we clear and disable the RPS pm interrupts on module load, and
presume that they remain disabled forevermore. However, the mask is
cleared on suspend and so after resume they may start showing up again
unexepectedly.

Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/1811
Fixes: 8e99299a04bc ("drm/i915/gt: Track use of RPS interrupts in flags")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Andi Shyti <andi@etezian.org>
Reviewed-by: Andi Shyti <andi@etezian.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20200502173512.32353-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_gt_pm.c
drivers/gpu/drm/i915/gt/intel_rps.c
drivers/gpu/drm/i915/gt/intel_rps.h

index 5097786..e597764 100644 (file)
@@ -171,6 +171,8 @@ static void gt_sanitize(struct intel_gt *gt, bool force)
                if (engine->reset.finish)
                        engine->reset.finish(engine);
 
+       intel_rps_sanitize(&gt->rps);
+
        intel_uncore_forcewake_put(gt->uncore, FORCEWAKE_ALL);
        intel_runtime_pm_put(gt->uncore->rpm, wakeref);
 }
index c682355..2f59fc6 100644 (file)
@@ -1844,8 +1844,11 @@ void intel_rps_init(struct intel_rps *rps)
 
        if (INTEL_GEN(i915) >= 8 && INTEL_GEN(i915) < 11)
                rps->pm_intrmsk_mbz |= GEN8_PMINTR_DISABLE_REDIRECT_TO_GUC;
+}
 
-       if (INTEL_GEN(i915) >= 6)
+void intel_rps_sanitize(struct intel_rps *rps)
+{
+       if (INTEL_GEN(rps_to_i915(rps)) >= 6)
                rps_disable_interrupts(rps);
 }
 
index af07fa5..8d3c9d6 100644 (file)
@@ -13,6 +13,7 @@ struct i915_request;
 
 void intel_rps_init_early(struct intel_rps *rps);
 void intel_rps_init(struct intel_rps *rps);
+void intel_rps_sanitize(struct intel_rps *rps);
 
 void intel_rps_driver_register(struct intel_rps *rps);
 void intel_rps_driver_unregister(struct intel_rps *rps);