nouveau/gsp: fix suspend/resume regression on r570 firmware
authorDave Airlie <airlied@redhat.com>
Tue, 3 Feb 2026 05:21:13 +0000 (15:21 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 4 Feb 2026 02:17:57 +0000 (12:17 +1000)
The r570 firmware with certain GPUs (at least RTX6000) needs this
flag to reflect the suspend vs runtime PM state of the driver.

This uses that info to set the correct flags to the firmware.

This fixes a regression on RTX6000 and other GPUs since r570 firmware
was enabled.

Fixes: 53dac0623853 ("drm/nouveau/gsp: add support for 570.144")
Cc: <stable@vger.kernel.org>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Tested-by: Lyude Paul <lyude@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Link: https://patch.msgid.link/20260203052431.2219998-4-airlied@gmail.com
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/fbsr.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/fbsr.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h

index 150e22f..e962d0e 100644 (file)
@@ -208,7 +208,7 @@ r535_fbsr_resume(struct nvkm_gsp *gsp)
 }
 
 static int
-r535_fbsr_suspend(struct nvkm_gsp *gsp)
+r535_fbsr_suspend(struct nvkm_gsp *gsp, bool runtime)
 {
        struct nvkm_subdev *subdev = &gsp->subdev;
        struct nvkm_device *device = subdev->device;
index 2f028a3..7fb1343 100644 (file)
@@ -1748,7 +1748,7 @@ r535_gsp_fini(struct nvkm_gsp *gsp, enum nvkm_suspend_state suspend)
                sr->sysmemAddrOfSuspendResumeData = gsp->sr.radix3.lvl0.addr;
                sr->sizeOfSuspendResumeData = len;
 
-               ret = rm->api->fbsr->suspend(gsp);
+               ret = rm->api->fbsr->suspend(gsp, suspend == NVKM_RUNTIME_SUSPEND);
                if (ret) {
                        nvkm_gsp_mem_dtor(&gsp->sr.meta);
                        nvkm_gsp_radix3_dtor(gsp, &gsp->sr.radix3);
index 2945d5b..8ef8b4f 100644 (file)
@@ -62,7 +62,7 @@ r570_fbsr_resume(struct nvkm_gsp *gsp)
 }
 
 static int
-r570_fbsr_init(struct nvkm_gsp *gsp, struct sg_table *sgt, u64 size)
+r570_fbsr_init(struct nvkm_gsp *gsp, struct sg_table *sgt, u64 size, bool runtime)
 {
        NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS *ctrl;
        struct nvkm_gsp_object memlist;
@@ -81,7 +81,7 @@ r570_fbsr_init(struct nvkm_gsp *gsp, struct sg_table *sgt, u64 size)
        ctrl->hClient = gsp->internal.client.object.handle;
        ctrl->hSysMem = memlist.handle;
        ctrl->sysmemAddrOfSuspendResumeData = gsp->sr.meta.addr;
-       ctrl->bEnteringGcoffState = 1;
+       ctrl->bEnteringGcoffState = runtime ? 1 : 0;
 
        ret = nvkm_gsp_rm_ctrl_wr(&gsp->internal.device.subdevice, ctrl);
        if (ret)
@@ -92,7 +92,7 @@ r570_fbsr_init(struct nvkm_gsp *gsp, struct sg_table *sgt, u64 size)
 }
 
 static int
-r570_fbsr_suspend(struct nvkm_gsp *gsp)
+r570_fbsr_suspend(struct nvkm_gsp *gsp, bool runtime)
 {
        struct nvkm_subdev *subdev = &gsp->subdev;
        struct nvkm_device *device = subdev->device;
@@ -133,7 +133,7 @@ r570_fbsr_suspend(struct nvkm_gsp *gsp)
                return ret;
 
        /* Initialise FBSR on RM. */
-       ret = r570_fbsr_init(gsp, &gsp->sr.fbsr, size);
+       ret = r570_fbsr_init(gsp, &gsp->sr.fbsr, size, runtime);
        if (ret) {
                nvkm_gsp_sg_free(device, &gsp->sr.fbsr);
                return ret;
index 393ea77..4f0ae6c 100644 (file)
@@ -78,7 +78,7 @@ struct nvkm_rm_api {
        } *device;
 
        const struct nvkm_rm_api_fbsr {
-               int (*suspend)(struct nvkm_gsp *);
+               int (*suspend)(struct nvkm_gsp *, bool runtime);
                void (*resume)(struct nvkm_gsp *);
        } *fbsr;