[PATCH 1/3] drm/nouveau/devinit/tu102-: wait for GFW_BOOT_PROGRESS == COMPLETED
Lyude Paul
lyude at redhat.com
Mon Jan 30 23:19:27 UTC 2023
For the whole series:
Reviewed-by: Lyude Paul <lyude at 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 <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