Reviewed-by: Alan Previn <alan.previn.teres.alexis@xxxxxxxxx> On Thu, 2022-06-09 at 16:19 -0700, Ceraolo Spurio, Daniele wrote: > The mei_pxp module is required to send the command to load authenticate > the HuC to the GSC even if pxp is not in use for protected content > management. > > Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@xxxxxxxxx> > Cc: Alan Previn <alan.previn.teres.alexis@xxxxxxxxx> > --- > drivers/gpu/drm/i915/Makefile | 10 +++--- > drivers/gpu/drm/i915/pxp/intel_pxp.c | 32 +++++++++++++------- > drivers/gpu/drm/i915/pxp/intel_pxp.h | 32 -------------------- > drivers/gpu/drm/i915/pxp/intel_pxp_irq.h | 8 +++++ > drivers/gpu/drm/i915/pxp/intel_pxp_session.c | 8 ++++- > drivers/gpu/drm/i915/pxp/intel_pxp_session.h | 11 +++++-- > drivers/gpu/drm/i915/pxp/intel_pxp_tee.c | 10 ++++-- > 7 files changed, 57 insertions(+), 54 deletions(-) > > diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile > index d2b18f03a33c..5d3aa4807def 100644 > --- a/drivers/gpu/drm/i915/Makefile > +++ b/drivers/gpu/drm/i915/Makefile > @@ -303,15 +303,17 @@ i915-y += \ > > i915-y += i915_perf.o > > -# Protected execution platform (PXP) support > -i915-$(CONFIG_DRM_I915_PXP) += \ > +# Protected execution platform (PXP) support. Base support is required for HuC > +i915-y += \ > pxp/intel_pxp.o \ > + pxp/intel_pxp_tee.o > + > +i915-$(CONFIG_DRM_I915_PXP) += \ > pxp/intel_pxp_cmd.o \ > pxp/intel_pxp_debugfs.o \ > pxp/intel_pxp_irq.o \ > pxp/intel_pxp_pm.o \ > - pxp/intel_pxp_session.o \ > - pxp/intel_pxp_tee.o > + pxp/intel_pxp_session.o > > # Post-mortem debug and GPU hang state capture > i915-$(CONFIG_DRM_I915_CAPTURE_ERROR) += i915_gpu_error.o > diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp.c b/drivers/gpu/drm/i915/pxp/intel_pxp.c > index 15311eaed848..b602a51c3692 100644 > --- a/drivers/gpu/drm/i915/pxp/intel_pxp.c > +++ b/drivers/gpu/drm/i915/pxp/intel_pxp.c > @@ -103,19 +103,15 @@ static int create_vcs_context(struct intel_pxp *pxp) > > static void destroy_vcs_context(struct intel_pxp *pxp) > { > - intel_engine_destroy_pinned_context(fetch_and_zero(&pxp->ce)); > + if (pxp->ce) > + intel_engine_destroy_pinned_context(fetch_and_zero(&pxp->ce)); > } > > -void intel_pxp_init(struct intel_pxp *pxp) > +static void pxp_init_full(struct intel_pxp *pxp) > { > struct intel_gt *gt = pxp_to_gt(pxp); > int ret; > > - if (!HAS_PXP(gt->i915)) > - return; > - > - mutex_init(&pxp->tee_mutex); > - > /* > * we'll use the completion to check if there is a termination pending, > * so we start it as completed and we reinit it when a termination > @@ -124,8 +120,7 @@ void intel_pxp_init(struct intel_pxp *pxp) > init_completion(&pxp->termination); > complete_all(&pxp->termination); > > - mutex_init(&pxp->arb_mutex); > - INIT_WORK(&pxp->session_work, intel_pxp_session_work); > + intel_pxp_session_management_init(pxp); > > ret = create_vcs_context(pxp); > if (ret) > @@ -143,11 +138,26 @@ void intel_pxp_init(struct intel_pxp *pxp) > destroy_vcs_context(pxp); > } > > -void intel_pxp_fini(struct intel_pxp *pxp) > +void intel_pxp_init(struct intel_pxp *pxp) > { > - if (!intel_pxp_is_enabled(pxp)) > + struct intel_gt *gt = pxp_to_gt(pxp); > + > + /* we rely on the mei PXP module */ > + if (!IS_ENABLED(CONFIG_INTEL_MEI_PXP)) > return; > > + /* > + * If HuC is loaded by GSC but PXP is disabled, we can skip the init of > + * the full PXP session/object management and just init the tee channel. > + */ > + if (HAS_PXP(gt->i915)) > + pxp_init_full(pxp); > + else if (intel_huc_is_loaded_by_gsc(>->uc.huc) && intel_uc_uses_huc(>->uc)) > + intel_pxp_tee_component_init(pxp); > +} > + > +void intel_pxp_fini(struct intel_pxp *pxp) > +{ > pxp->arb_is_valid = false; > > intel_pxp_tee_component_fini(pxp); > diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp.h b/drivers/gpu/drm/i915/pxp/intel_pxp.h > index 73847e535cab..2da309088c6d 100644 > --- a/drivers/gpu/drm/i915/pxp/intel_pxp.h > +++ b/drivers/gpu/drm/i915/pxp/intel_pxp.h > @@ -12,7 +12,6 @@ > struct intel_pxp; > struct drm_i915_gem_object; > > -#ifdef CONFIG_DRM_I915_PXP > struct intel_gt *pxp_to_gt(const struct intel_pxp *pxp); > bool intel_pxp_is_enabled(const struct intel_pxp *pxp); > bool intel_pxp_is_active(const struct intel_pxp *pxp); > @@ -32,36 +31,5 @@ int intel_pxp_key_check(struct intel_pxp *pxp, > bool assign); > > void intel_pxp_invalidate(struct intel_pxp *pxp); > -#else > -static inline void intel_pxp_init(struct intel_pxp *pxp) > -{ > -} > - > -static inline void intel_pxp_fini(struct intel_pxp *pxp) > -{ > -} > - > -static inline int intel_pxp_start(struct intel_pxp *pxp) > -{ > - return -ENODEV; > -} > - > -static inline bool intel_pxp_is_enabled(const struct intel_pxp *pxp) > -{ > - return false; > -} > - > -static inline bool intel_pxp_is_active(const struct intel_pxp *pxp) > -{ > - return false; > -} > - > -static inline int intel_pxp_key_check(struct intel_pxp *pxp, > - struct drm_i915_gem_object *obj, > - bool assign) > -{ > - return -ENODEV; > -} > -#endif > > #endif /* __INTEL_PXP_H__ */ > diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp_irq.h b/drivers/gpu/drm/i915/pxp/intel_pxp_irq.h > index 8b5793654844..8c292dc86f68 100644 > --- a/drivers/gpu/drm/i915/pxp/intel_pxp_irq.h > +++ b/drivers/gpu/drm/i915/pxp/intel_pxp_irq.h > @@ -27,6 +27,14 @@ void intel_pxp_irq_handler(struct intel_pxp *pxp, u16 iir); > static inline void intel_pxp_irq_handler(struct intel_pxp *pxp, u16 iir) > { > } > + > +static inline void intel_pxp_irq_enable(struct intel_pxp *pxp) > +{ > +} > + > +static inline void intel_pxp_irq_disable(struct intel_pxp *pxp) > +{ > +} > #endif > > #endif /* __INTEL_PXP_IRQ_H__ */ > diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp_session.c b/drivers/gpu/drm/i915/pxp/intel_pxp_session.c > index 92b00b4de240..8453e13e9120 100644 > --- a/drivers/gpu/drm/i915/pxp/intel_pxp_session.c > +++ b/drivers/gpu/drm/i915/pxp/intel_pxp_session.c > @@ -137,7 +137,7 @@ static void pxp_terminate_complete(struct intel_pxp *pxp) > complete_all(&pxp->termination); > } > > -void intel_pxp_session_work(struct work_struct *work) > +static void pxp_session_work(struct work_struct *work) > { > struct intel_pxp *pxp = container_of(work, typeof(*pxp), session_work); > struct intel_gt *gt = pxp_to_gt(pxp); > @@ -172,3 +172,9 @@ void intel_pxp_session_work(struct work_struct *work) > > intel_runtime_pm_put(gt->uncore->rpm, wakeref); > } > + > +void intel_pxp_session_management_init(struct intel_pxp *pxp) > +{ > + mutex_init(&pxp->arb_mutex); > + INIT_WORK(&pxp->session_work, pxp_session_work); > +} > diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp_session.h b/drivers/gpu/drm/i915/pxp/intel_pxp_session.h > index ba4c9d2b94b7..903ac52cffa1 100644 > --- a/drivers/gpu/drm/i915/pxp/intel_pxp_session.h > +++ b/drivers/gpu/drm/i915/pxp/intel_pxp_session.h > @@ -8,8 +8,13 @@ > > #include <linux/types.h> > > -struct work_struct; > - > -void intel_pxp_session_work(struct work_struct *work); > +struct intel_pxp; > > +#ifdef CONFIG_DRM_I915_PXP > +void intel_pxp_session_management_init(struct intel_pxp *pxp); > +#else > +static inline void intel_pxp_session_management_init(struct intel_pxp *pxp) > +{ > +} > +#endif > #endif /* __INTEL_PXP_SESSION_H__ */ > diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp_tee.c b/drivers/gpu/drm/i915/pxp/intel_pxp_tee.c > index 4b6f5655fab5..2c1fc49ecec1 100644 > --- a/drivers/gpu/drm/i915/pxp/intel_pxp_tee.c > +++ b/drivers/gpu/drm/i915/pxp/intel_pxp_tee.c > @@ -97,7 +97,8 @@ static int i915_pxp_tee_component_bind(struct device *i915_kdev, > return 0; > > /* the component is required to fully start the PXP HW */ > - intel_pxp_init_hw(pxp); > + if (intel_pxp_is_enabled(pxp)) > + intel_pxp_init_hw(pxp); > > intel_runtime_pm_put(&i915->runtime_pm, wakeref); > > @@ -111,8 +112,9 @@ static void i915_pxp_tee_component_unbind(struct device *i915_kdev, > struct intel_pxp *pxp = i915_dev_to_pxp(i915_kdev); > intel_wakeref_t wakeref; > > - with_intel_runtime_pm_if_in_use(&i915->runtime_pm, wakeref) > - intel_pxp_fini_hw(pxp); > + if (intel_pxp_is_enabled(pxp)) > + with_intel_runtime_pm_if_in_use(&i915->runtime_pm, wakeref) > + intel_pxp_fini_hw(pxp); > > mutex_lock(&pxp->tee_mutex); > pxp->pxp_component = NULL; > @@ -130,6 +132,8 @@ int intel_pxp_tee_component_init(struct intel_pxp *pxp) > struct intel_gt *gt = pxp_to_gt(pxp); > struct drm_i915_private *i915 = gt->i915; > > + mutex_init(&pxp->tee_mutex); > + > ret = component_add_typed(i915->drm.dev, &i915_pxp_tee_component_ops, > I915_COMPONENT_PXP); > if (ret < 0) { > -- > 2.25.1 >