[PATCH 4/6] drm/xe/vf: Provide early access to GMDID register
Matt Roper
matthew.d.roper at intel.com
Thu May 23 21:17:10 UTC 2024
On Thu, May 23, 2024 at 02:08:16PM -0700, Matt Roper wrote:
> On Thu, May 23, 2024 at 09:22:38PM +0200, Michal Wajdeczko wrote:
> > VFs do not have direct access to the GMDID register and must obtain
> > its value from the GuC. Since we need GMDID value very early in the
> > driver probe flow, before we even start the full setup of GT and GuC
> > data structures, we must do some early initializations ourselves.
> >
> > Additionally, since we also need GMDID for the media GT, which isn't
> > created yet, temporarly tweak the root GT type into MEDIA to allow
> > communication with the correct GuC, as only it can provide the value
> > of the media GMDID register.
> >
> > Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
> > ---
> > drivers/gpu/drm/xe/xe_pci.c | 47 ++++++++++++++++++++++++++++++++++---
> > 1 file changed, 44 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
> > index ece410289f6c..eefac633dbc1 100644
> > --- a/drivers/gpu/drm/xe/xe_pci.c
> > +++ b/drivers/gpu/drm/xe/xe_pci.c
> > @@ -20,6 +20,8 @@
> > #include "xe_device.h"
> > #include "xe_drv.h"
> > #include "xe_gt.h"
> > +#include "xe_gt_sriov_vf.h"
> > +#include "xe_guc.h"
> > #include "xe_macros.h"
> > #include "xe_mmio.h"
> > #include "xe_module.h"
> > @@ -471,10 +473,49 @@ static void read_gmdid(struct xe_device *xe, enum xe_gmdid_type type, u32 *ver,
> >
> > KUNIT_STATIC_STUB_REDIRECT(read_gmdid, xe, type, ver, revid);
> >
> > - if (type == GMDID_MEDIA)
> > - gmdid_reg.addr += MEDIA_GT_GSI_OFFSET;
> > + if (IS_SRIOV_VF(xe)) {
> > + /*
> > + * To get the value of the GMDID register, VFs must obtain it
> > + * from the GuC using MMIO communication.
> > + *
> > + * Note that at this point the xe_gt is not fully uninitialized
> > + * and only basic access to MMIO registers is possible. To use
> > + * our existing GuC communication functions we must perform at
> > + * least basic xe_gt and xe_guc initialization.
> > + *
> > + * Since to obtain the value of GMDID_MEDIA we need to use the
> > + * media GuC, temporarly tweak the gt type.
> > + */
> > + xe_gt_assert(gt, gt->info.type == XE_GT_TYPE_UNINITIALIZED);
> > +
> > + if (type == GMDID_MEDIA) {
> > + gt->info.id = 1;
> > + gt->info.type = XE_GT_TYPE_MEDIA;
> > + } else {
> > + gt->info.id = 0;
> > + gt->info.type = XE_GT_TYPE_MAIN;
> > + }
> > +
> > + xe_guc_comm_init_early(>->uc.guc);
> > +
> > + /* don't bother with GMDID if failed to negotiate the GuC ABI */
> > + val = xe_gt_sriov_vf_bootstrap(gt) ? 0 : xe_gt_sriov_vf_gmdid(gt);
> > +
> > + /* undo */
> > + gt->info.id = 0;
> > + gt->info.type = XE_GT_TYPE_UNINITIALIZED;
>
> The xe_guc_comm_init_early() and xe_gt_sriov_vf_bootstrap() above also
> make changes to the various GuC0 structures (which might be "wrong" if
> we were reading the media's GMD_ID, but I think all of those changes
> wind up getting overwritten later with the correct GuC0 values again
> later when we initialize the GuC for real. You might want to add some
> kind of comment about that, since otherwise it looks at first glance
> like we might be leaving GuC1 state inside the GuC0 structure here.
>
> Otherwise,
>
> Reviewed-by: Matt Roper <matthew.d.roper at intel.com>
Oh, one more question --- for non-SRIOV cases we assume that it's always
safe to read the GMD_ID register offsets, even if the platform has
fused-off media (like PVC did in the past). If media is fused off, that
register read comes back as 0x0 and we move forward recognizing that
media just isn't available. I don't think any of the post-MTL platforms
we have at the moment (i.e., platforms where GMD_ID exists) ever have
fused off media yet, but I imagine that situation will likely come back
at some point in the future.
With the SRIOV-based flows here, are we going to get any GuC errors
while blindly attempting to read the media GT's GMD_ID if media (and
thus the media GuC) isn't actually present?
Matt
>
> > + } else {
> > + /*
> > + * We need to apply the GSI offset explicitly here as at this
> > + * point the xe_gt is not fully uninitialized and only basic
> > + * access to MMIO registers is possible.
> > + */
> > + if (type == GMDID_MEDIA)
> > + gmdid_reg.addr += MEDIA_GT_GSI_OFFSET;
> > +
> > + val = xe_mmio_read32(gt, gmdid_reg);
> > + }
> >
> > - val = xe_mmio_read32(gt, gmdid_reg);
> > *ver = REG_FIELD_GET(GMD_ID_ARCH_MASK, val) * 100 + REG_FIELD_GET(GMD_ID_RELEASE_MASK, val);
> > *revid = REG_FIELD_GET(GMD_ID_REVID, val);
> > }
> > --
> > 2.43.0
> >
>
> --
> Matt Roper
> Graphics Software Engineer
> Linux GPU Platform Enablement
> Intel Corporation
--
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation
More information about the Intel-xe
mailing list