Hi Lucas,

> > > > @@ -2897,7 +2897,9 @@ engine_init_workarounds(struct intel_engine_cs 
> > > > *engine, struct i915_wa_list *wal
> > > >          */
> > > >         if (engine->flags & I915_ENGINE_FIRST_RENDER_COMPUTE) {
> > > >                 general_render_compute_wa_init(engine, wal);
> > > > -               ccs_engine_wa_mode(engine, wal);
> > > > +
> > > > +               if (engine->class == COMPUTE_CLASS)
> > > > +                       ccs_engine_wa_mode(engine, wal);
> > > 
> > > FIRST_RENDER_COMPUTE is meant to only be on the first engine of either
> > > rcs or ccs (which share certain register domains), one engine.
> > > 
> > > It looks like that was broken by
> > > 
> > >   commit 1bfc03b1375244f9029bb448ee8224b3b6dae99f
> > >   Author: Lucas De Marchi <lucas.demar...@intel.com>
> 
> yep, my bad.
> 
> > >   Date:   Tue Mar 19 23:03:03 2024 -0700
> > > 
> > >       drm/i915: Remove special handling for !RCS_MASK()
> > 
> > Aha! So the logic here[*] breaks the meaning of
> > I915_ENGINE_FIRST_RENDER_COMPUTE, becasue, other than PVC, we
> > forgot that we have DG2 that needs the special check that uses
> > !RCS_MASK().
> 
> no, that would mean a DG2 without render engine.

OK, I don't know the history, I thought that the idea was to
remove support for PVC, the only multi-CCS machine that once i915
supported other than DG2.

> The previous check to enable I915_ENGINE_FIRST_RENDER_COMPUTE was:
> 
>       if ((engine->class == COMPUTE_CLASS && !RCS_MASK(engine->gt) &&
>            __ffs(CCS_MASK(engine->gt)) == engine->instance) ||
>            engine->class == RENDER_CLASS)
> 
> i.e. if render is fused off, it enables it in the first compute engine.
> Otherwise it enables it in the render.
> 
> And assuming we don't have platforms with render fused off (which still
> holds true as far as I'm aware), that became:
> 
>       if ((engine->class == COMPUTE_CLASS || engine->class == RENDER_CLASS) &&
>           __ffs(CCS_MASK(engine->gt) | RCS_MASK(engine->gt)) == 
> engine->instance)

The difference is that this applies in two cases: it's true for
the first CCS we encounter and also for the only RCS. Arshad
noticed that we end up applying the workaround twice.

So the !RCS_MASK(gt) check is still needed.

Alternatively, as Matt suggested, we could assign
I915_ENGINE_FIRST_RENDER_COMPUTE only to the RCS.

I have a slight preference for the way it was done before because
it make the logic clearer.

Thanks,
Andi

> It was supposed to mean the same thing... but doesn't as engine->instance
> starts from 0 for each class.

Reply via email to