[Intel-gfx] [PATCH 2/2] drm/i915/pxp: Trigger the global teardown for before suspending

Juston Li justonli at chromium.org
Mon Nov 21 22:14:43 UTC 2022


On Mon, 2022-11-21 at 19:21 +0000, Teres Alexis, Alan Previn wrote:
> 
> 
> On Mon, 2022-11-21 at 10:39 -0800, Juston Li wrote:
> > On Thu, 2022-11-17 at 16:36 -0800, Alan Previn wrote:
> > > A driver bug was recently discovered where the security firmware
> > > was
> > > receiving internal HW signals indicating that session key
> > > expirations
> > > had occurred. Architecturally, the firmware was expecting a
> > > response
> > > from the GuC to acknowledge the event with the firmware side.
> > > However the OS was in a suspended state and GuC had been reset.
> > > Internal specifications actually required the driver to ensure
> > > that all active sessions be properly cleaned up in such cases
> > > where
> > > the system is suspended and the GuC potentially unable to
> > > respond.
> > > 
> > > This patch adds the global teardown code in i915's
> > > suspend_prepare
> > > code path.
> > > 
> Alan:[snip]
> 
> > > +void intel_pxp_end(struct intel_pxp *pxp)
> > > +{
> > > +       struct drm_i915_private *i915 = pxp_to_gt(pxp)->i915;
> > > +       intel_wakeref_t wakeref;
> > > +
> > > +       if (!intel_pxp_is_enabled(pxp))
> > > +               return;
> > > +
> > > +       wakeref = intel_runtime_pm_get(&i915->runtime_pm);
> > > +
> > > +       mutex_lock(&pxp->arb_mutex);
> > > +
> > > +       if (__pxp_global_teardown_locked(pxp, true))
> > > +               drm_dbg(&(pxp_to_gt(pxp))->i915->drm, "PXP end
> > > timed
> > > out\n");
> > > +
> > > +       mutex_unlock(&pxp->arb_mutex);
> > > +
> > > +       intel_pxp_fini_hw(pxp);
> > 
> > Is intel_pxp_suspend() still needed then if we already fini_hw()
> > here
> > and mark invalidation in intel_pxp_terminate()?
> > 
> 
> Good catch - looks like we might not need intel_pxp_suspend. But I'll
> verify that for you.

Actually, might need to be careful here. If system aborts suspend or
fails to suspend for any reason, suspend_prepare()->intel_pxp_fini_hw()
might have been called but not suspend().

Correct me if I'm wrong, but in that case I don't think resume() will
be called and thus intel_pxp_init_hw().

For some background, there were some issues with PXP ending up in a bad
state when some other driver caused suspend to fail or user
closed/opened lid quickly and aborted suspend.

> Also, looks like i forgot to include a non-CONFIG_DRM_I915_PXP
> version of intel_pxp_end which was causing the build
> failure. Will resend.
> 
> Btw, thanks for reviewing this Juston, i had cc'd you because of the
> impact to suspend-resume flows and I believe you
> have had prior experience debugging issues with that and runtime-
> suspend/resume. Do you any other issues with this
> change?

Np, thanks for the patches!

The only other concern I had that's more of a downstream issue is we
ended up using hw_state_invalidated to block PXP ioctl ops during
teardown to prevent further PXP ioctls triggering pxp_start and another
termination queued.
I don't recall if I sent you this patch on our tree:
https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/3207105
I think this could happen in suspend now too, if app sends PXP ops
while suspend termination is in progress.

Juston


More information about the Intel-gfx mailing list