[PATCH 1/3] drm/nouveau/devinit/tu102-: wait for GFW_BOOT_PROGRESS == COMPLETED

Ben Skeggs skeggsb at gmail.com
Mon Jan 30 23:22:43 UTC 2023


On Tue, 31 Jan 2023 at 09:19, Lyude Paul <lyude at redhat.com> wrote:
>
> For the whole series:
>
> Reviewed-by: Lyude Paul <lyude at redhat.com>
>
> Will push to drm-misc-fixes in just a moment
Thank you Lyude!  Much appreciated.

Ben.

>
> On Tue, 2023-01-31 at 08:37 +1000, Ben Skeggs wrote:
> > Starting from Turing, the driver is no longer responsible for initiating
> > DEVINIT when required as the GPU started loading a FW image from ROM and
> > executing DEVINIT itself after power-on.
> >
> > However - we apparently still need to wait for it to complete.
> >
> > This should correct some issues with runpm on some systems, where we get
> > control of the HW before it's been fully reinitialised after resume from
> > suspend.
> >
> > Signed-off-by: Ben Skeggs <bskeggs at redhat.com>
> > ---
> >  .../drm/nouveau/nvkm/subdev/devinit/tu102.c   | 23 +++++++++++++++++++
> >  1 file changed, 23 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/tu102.c b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/tu102.c
> > index 634f64f88fc8..81a1ad2c88a7 100644
> > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/tu102.c
> > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/tu102.c
> > @@ -65,10 +65,33 @@ tu102_devinit_pll_set(struct nvkm_devinit *init, u32 type, u32 freq)
> >       return ret;
> >  }
> >
> > +static int
> > +tu102_devinit_wait(struct nvkm_device *device)
> > +{
> > +     unsigned timeout = 50 + 2000;
> > +
> > +     do {
> > +             if (nvkm_rd32(device, 0x118128) & 0x00000001) {
> > +                     if ((nvkm_rd32(device, 0x118234) & 0x000000ff) == 0xff)
> > +                             return 0;
> > +             }
> > +
> > +             usleep_range(1000, 2000);
> > +     } while (timeout--);
> > +
> > +     return -ETIMEDOUT;
> > +}
> > +
> >  int
> >  tu102_devinit_post(struct nvkm_devinit *base, bool post)
> >  {
> >       struct nv50_devinit *init = nv50_devinit(base);
> > +     int ret;
> > +
> > +     ret = tu102_devinit_wait(init->base.subdev.device);
> > +     if (ret)
> > +             return ret;
> > +
> >       gm200_devinit_preos(init, post);
> >       return 0;
> >  }
>
> --
> Cheers,
>  Lyude Paul (she/her)
>  Software Engineer at Red Hat
>


More information about the dri-devel mailing list