For the whole series:

Reviewed-by: Lyude Paul <ly...@redhat.com>

Will push to drm-misc-fixes in just a moment

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 <bske...@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

Reply via email to