]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
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 150e22fde2ac20ca1016b1d00b26669277fa7b17..e962d0e8f837777177c433e83bfaacf88d86b986 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 2f028a30e07db23f7f02b3343f599130c1d1da15..7fb13434c051de931ab38bfd187b00a332da50a4 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 2945d5b4e57070b70ca6ff4b2466496c4a75dda3..8ef8b4f65588300d42fabb6e416fda4108a3060a 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 393ea775941fae05d5bbb765e23c5b8ca789648d..4f0ae6cc085c3de737bd489141ed7ab8bf1a6b12 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;