Thank you Jani - this was clearly my mistake (apologies to Daniele/Rodrigo) - didn't realize we had this documented. I will go through that first. ...alan On Mon, 2022-11-21 at 14:12 +0200, Jani Nikula wrote: > On Mon, 21 Nov 2022, Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxxxxxxxx> wrote: > > On 17/11/2022 22:34, Teres Alexis, Alan Previn wrote: > > > On Thu, 2022-11-17 at 11:02 -0500, Vivi, Rodrigo wrote: > > > > On Wed, Nov 16, 2022 at 04:30:13PM -0800, Alan Previn wrote: > > > > > In preparation for future MTL-PXP feature support, PXP control > > > > > context should only valid on the correct gt tile. Depending on the > > > > > device-info this depends on which tile owns the VEBOX and KCR. > > > > > PXP is still a global feature though (despite its control-context > > > > > located in the owning GT structure). Additionally, we find > > > > > that the HAS_PXP macro is only used within the pxp module, > > > > > > > > > > That said, lets drop that HAS_PXP macro altogether and replace it > > > > > with a more fitting named intel_gtpxp_is_supported and helpers > > > > > so that PXP init/fini can use to verify if the referenced gt supports > > > > > PXP or teelink. > > > > > > > > Yep, I understand you as I'm not fan of these macros, specially > > > > single usage. But we need to consider that we have multiple dependencies > > > > there and other cases like this in the driver... Well, but I'm not > > > > opposing, but probably better to first get rid of the macro, > > > > then change the behavior of the function on the next patch. > > > > > > > > > > > > > > Add TODO for Meteorlake that will come in future series. > > > > > > > > This refactor patch should be standalone, without poputing it with > > > > the changes that didn't came yet to this point. > > > > > > > Sure i can follow this rule, but it would then raise the question of "nothign is really changing anywhere for MTL, why > > > are we doing this" thats why i wanted to add that placeholder. I see "TODO"s are a common thing in the driver for larger > > > features that cant all be enabled at once. Respectfully and humbly, is there some documented rule? Can you show it to > > > me? > > > > Separating refactoring from functional changes is one of the most basic > > principles we follow (and not just us) and there should never be > > pushback on the former due lack of functional changes. > > It's also documented [1][2] but that never seems to make a difference. > > BR, > Jani. > > > [1] https://docs.kernel.org/process/submitting-patches.html#separate-your-changes > [2] https://docs.kernel.org/process/5.Posting.html#patch-preparation > > > > > > > > On the basic level following this guideline makes it trivial to review > > the refactoring patch, and in the vast majority of cases much easier to > > review the functional change patch as well. > > > > And easy to review means happy reviewers, faster turnaround time (easier > > to carry a rebase), happier authors, easier reverts when things go bad > > (only small functional patch needs to be reverted), sometimes even > > easier backporting if code diverged a lot. > > > > Oh, and it even has potential to decrease internal technical debt. Often > > you can push refactoring upstream and keep a smaller delta behind the > > closed doors, when that is required. > > > > > > > Signed-off-by: Alan Previn <alan.previn.teres.alexis@xxxxxxxxx> > > > > > --- > > > > > drivers/gpu/drm/i915/i915_drv.h | 4 ---- > > > > > drivers/gpu/drm/i915/pxp/intel_pxp.c | 22 ++++++++++++++------ > > > > > drivers/gpu/drm/i915/pxp/intel_pxp.h | 3 +++ > > > > > drivers/gpu/drm/i915/pxp/intel_pxp_debugfs.c | 2 +- > > > > > 4 files changed, 20 insertions(+), 11 deletions(-) > > > > > > > > > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > > > > > index 7e3820d2c404..0616e5f0bd31 100644 > > > > > --- a/drivers/gpu/drm/i915/i915_drv.h > > > > > +++ b/drivers/gpu/drm/i915/i915_drv.h > > > > > @@ -933,10 +933,6 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915, > > > > > > > > > > #define HAS_GLOBAL_MOCS_REGISTERS(dev_priv) (INTEL_INFO(dev_priv)->has_global_mocs) > > > > > > > > > > -#define HAS_PXP(dev_priv) ((IS_ENABLED(CONFIG_DRM_I915_PXP) && \ > > > > > - INTEL_INFO(dev_priv)->has_pxp) && \ > > > > > - VDBOX_MASK(to_gt(dev_priv))) > > > > > - > > > > > #define HAS_GMCH(dev_priv) (INTEL_INFO(dev_priv)->display.has_gmch) > > > > > > > > > > #define HAS_GMD_ID(i915) (INTEL_INFO(i915)->has_gmd_id) > > > > > diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp.c b/drivers/gpu/drm/i915/pxp/intel_pxp.c > > > > > index 5efe61f67546..d993e752bd36 100644 > > > > > --- a/drivers/gpu/drm/i915/pxp/intel_pxp.c > > > > > +++ b/drivers/gpu/drm/i915/pxp/intel_pxp.c > > > > > @@ -44,6 +44,20 @@ struct intel_gt *pxp_to_gt(const struct intel_pxp *pxp) > > > > > return container_of(pxp, struct intel_gt, pxp); > > > > > } > > > > > > > > > > +static bool _gt_needs_teelink(struct intel_gt *gt) > > > > > +{ > > > > > + /* TODO: MTL won't rely on CONFIG_INTEL_MEI_PXP but on GSC engine */ > > > > > + return (IS_ENABLED(CONFIG_INTEL_MEI_PXP) && intel_huc_is_loaded_by_gsc(>->uc.huc) && > > > > > + intel_uc_uses_huc(>->uc)); > > > > > +} > > > > > + > > > > > +bool intel_pxp_supported_on_gt(const struct intel_pxp *pxp) > > > > > > > > If we are asking if it is supported on gt, then the argument must be a gt struct. > > > > > > > I agree with you but Daniele said above is more consistent with existing ways that is considered the standard. > > > Respectfully and humbly I would like to request both yourself and Daniele to show me the coding guidelines somewhere. > > > > > > Honestly, this is one of the first few hunks of the first patch of the first series in a very large complex design to > > > enable PXP on MTL and it only a helper utility function. Respecfully and humbly, I rather we focus our energy for review > > > + redo on more critical things like the e2e usage and top-to-bottom design or coding logic flows or find actual bugs > > > instead of debating about coding styles for internal only helper functions. > > > > My 2c/p is that the intel_pxp_supported_on_gt the "on_gt" part reads a > > bit clumsy because it makes it sound like the two are independent > > objects. Like I could pass one pxp to different GTs and ask if that one > > works here, or maybe there. > > > > I am though a fan of intel_pxp_ prefix meaning function operates on > > struct intel_pxp. > > > > In this case I don't know what is the correct relationship. If it is 1:1 > > between intel_pxp:intel_gt then intel_pxp_supported(pxp) sounds fine. > > Even if a singleton that works for me. If we do have 1:1 but only want > > to init the first one, but PXP truly lives in the GT block, we could > > have pointers per GT, with only the gt0 one being initialized, and > > perhaps a shadow i915->pxp pointer which points to gt[0]->pxp, if that > > makes for better code organisation? > > > > Regards, > > > > Tvrtko > > > > > > > > > > > > > +{ > > > > > + /* TODO: MTL won't rely on CONFIG_INTEL_MEI_PXP but on GSC engine */ > > > > > + return (IS_ENABLED(CONFIG_INTEL_MEI_PXP) && IS_ENABLED(CONFIG_DRM_I915_PXP) && > > > > > + INTEL_INFO((pxp_to_gt(pxp))->i915)->has_pxp && VDBOX_MASK(pxp_to_gt(pxp))); > > > > > +} > > > > > + > > > > > bool intel_pxp_is_enabled(const struct intel_pxp *pxp) > > > > > { > > > > > return pxp->ce; > > > > > @@ -142,17 +156,13 @@ void intel_pxp_init(struct intel_pxp *pxp) > > > > > { > > > > > struct intel_gt *gt = pxp_to_gt(pxp); > > > > > > > > > > - /* we rely on the mei PXP module */ > > > > > - if (!IS_ENABLED(CONFIG_INTEL_MEI_PXP)) > > > > > - return; > > > > > > > > I took a time to understand this movement based on the commit description. > > > > I have the feeling that this patch deserves further split in different patches. > > > > > > > > But also, looking a few lines above pxp_to_gt(pxp), I believe we > > > > have further refactor to do sooner. is is one pxp per gt, then we > > > > need to only enable in the gt0? > > > > > > > In our driver, PXP as reflected by the device info is being treated as a global feature. > > > PXP as a HW subsystem is "usable" device-wide from any workload on any engine on any tile (due to the internal mirror > > > component and additional plumbing across the tiles). So in line with that I rather not have the gem-exec-buf, gem-create > > > and gem-context calls be bothered about which GT to access to query of this global hw feature is enabled or active. > > > However the control point for allocating sessions, talking to the gsc firmware and doing global teardowns are only meant > > > to occur on and via the tile that owns the KCR engine which the media tile. This includes things like per-tile uncore > > > power gating controls of the GSC-CS. (although some aspects like IRQ for KCR global). So as u see its not a clean per-GT > > > feature. > > > > > > I did speak to Daniele many months back when enabling the full feature set (on internal POC work) about whether we > > > should make PXP a global subsystem instead of hanging off gt but we both agreed that because the control engines are > > > only located on one tile, so you might face some its gonna be a trade off one way or the other: > > > - pxp a global structure, then all of the init / shutdown / suspend-resume flows would then have a different set of > > > convoluted functions that try to get access to gt specific controls from a top level function flow. > > > > > > > > > Additionally, humbly and respectfully, perhaps you can read through the internal arch HW specs through which it can be > > > infered that PXP will continue to have a single entity for control events despite the feature being usable / accessible > > > across all tiles. > > > > > > > > - > > > > > /* > > > > > * 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)) > > > > > + if (intel_pxp_supported_on_gt(pxp)) > > > > > pxp_init_full(pxp); > > > > > - else if (intel_huc_is_loaded_by_gsc(>->uc.huc) && intel_uc_uses_huc(>->uc)) > > > > > + else if (_gt_needs_teelink(gt)) > > > > > intel_pxp_tee_component_init(pxp); > > > > > } > > > > > > > > > > diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp.h b/drivers/gpu/drm/i915/pxp/intel_pxp.h > > > > > index 2da309088c6d..efa83f9d5e24 100644 > > > > > --- a/drivers/gpu/drm/i915/pxp/intel_pxp.h > > > > > +++ b/drivers/gpu/drm/i915/pxp/intel_pxp.h > > > > > @@ -13,6 +13,9 @@ struct intel_pxp; > > > > > struct drm_i915_gem_object; > > > > > > > > > > struct intel_gt *pxp_to_gt(const struct intel_pxp *pxp); > > > > > + > > > > > +bool intel_pxp_supported_on_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); > > > > > > > > > > diff --git a/drivers/gpu/drm/i915/pxp/intel_pxp_debugfs.c b/drivers/gpu/drm/i915/pxp/intel_pxp_debugfs.c > > > > > index 4359e8be4101..f0ad6f34624a 100644 > > > > > --- a/drivers/gpu/drm/i915/pxp/intel_pxp_debugfs.c > > > > > +++ b/drivers/gpu/drm/i915/pxp/intel_pxp_debugfs.c > > > > > @@ -70,7 +70,7 @@ void intel_pxp_debugfs_register(struct intel_pxp *pxp, struct dentry *gt_root) > > > > > if (!gt_root) > > > > > return; > > > > > > > > > > - if (!HAS_PXP((pxp_to_gt(pxp)->i915))) > > > > > + if (!intel_pxp_supported_on_gt(pxp)) > > > > > return; > > > > > > > > > > root = debugfs_create_dir("pxp", gt_root); > > > > > -- > > > > > 2.34.1 > > > > > > > > > > -- > Jani Nikula, Intel Open Source Graphics Center