[PATCH i-g-t 6/6] tools/intel_reg: Add forcewake support to xe

Matt Roper matthew.d.roper at intel.com
Fri Sep 20 18:04:20 UTC 2024


On Fri, Sep 20, 2024 at 11:01:37AM -0700, Matt Roper wrote:
> On Wed, Sep 18, 2024 at 09:36:29AM -0700, Lucas De Marchi wrote:
> > Now that the igt lib is prepared, start passing the open driver fd so
> > the correct forcewake is taken.
> > 
> > Before:
> > $ sudo ./build/tools/intel_reg read 0x2358
> >                                     (0x00002358): 0xffffffff
> 
> Hmm, this example makes me wonder if we actually should have called this
> top-level "forcewake_all" debugfs node something else.  This example
> shows that we're not relying on this interface solely for forcewake
> purposes, but as a wider "wake everything up and make sure it's
> accessible" interface.  At the hardware level, forcewake deals only with
> the GT-specific ability to exit+suppress RC6; if we read GT registers
> while in RC6, we'll get back 0x0 as a result (which isn't what we see
> here).
> 
> The failures we had here were because the device itself had gone into
> runtime D3 (so register reads come back as ~0); using forcewake
> indirectly suppresses runtime D3 as a side effect.  But if you'd wanted
> to read a non-GT register (sgunit, display, etc.), those register reads
> also would have failed before this change due to D3, even though the
> registers themselves don't need forcewake.  So we're in a situation
> where we also rely on the "forcewake" interface for reading/writing
> non-GT registers that don't care about forcewake.
> 
> If a future platform adds, for example, a new sleep + wakelock system to
> part of the sgunit, do we want to make this debugfs automatically wake
> the sgunit too in case we want to read its registers?  For that matter,
> should this device-level "wake up everything so we can read registers"
> interface also be grabbing all of our display power wells by default?
> 
> Anyway, I'm probably overthinking this; we don't need to worry about it
> for this patch series.
> 
> > 
> > After:
> > $ sudo ./build/tools/intel_reg read 0x2358
> > Opened device: /dev/dri/card0
> >                                     (0x00002358): 0x91e59eeb
> > 
> > Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
> > ---
> >  tools/intel_reg.c | 13 ++++++++++++-
> >  1 file changed, 12 insertions(+), 1 deletion(-)
> > 
> > diff --git a/tools/intel_reg.c b/tools/intel_reg.c
> > index 906ae9b84..b650c3697 100644
> > --- a/tools/intel_reg.c
> > +++ b/tools/intel_reg.c
> > @@ -802,7 +802,18 @@ static int parse_reg(struct config *config, struct reg *reg, const char *s)
> >  
> >  static int register_access_init(struct config *config)
> >  {
> > -	return intel_register_access_init(&config->mmio_data, config->pci_dev, 0, -1);
> > +	int drm_fd = __drm_open_driver(DRIVER_INTEL | DRIVER_XE);
> > +	int ret;
> > +
> > +	if (drm_fd < 0) {
> > +		fprintf(stderr, "could not open i915 or xe device\n");
> > +		return EXIT_FAILURE;
> > +	}
> > +
> > +	ret = intel_register_access_init(&config->mmio_data, config->pci_dev, 0, drm_fd);
> > +	close(drm_fd);
> > +
> > +	return ret;
> 
> As noted on the previous patch, if we get here, it's always a 'return 0'
> since intel_register_access_init() can't fail (and should probably have
> just been a void function).  But not a blocker.
> 
> Reviewed-by: Matt Roper <matthew.d.roper at intel.com>

Actually I just saw Ville's reply and it's a good point that this tool
did used to be able to run before/without the driver loaded.  So we
should just skip the "wake stuff up" part and proceed without failing
for that case.


Matt

> 
> 
> Matt
> 
> >  }
> >  
> >  /* XXX: add support for register ranges, maybe REGISTER..REGISTER */
> > -- 
> > 2.46.1
> > 
> 
> -- 
> 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 igt-dev mailing list