Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

nouveau/gsp: fix suspend/resume regression on r570 firmware

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

+7 -7
+1 -1
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/fbsr.c
··· 208 208 } 209 209 210 210 static int 211 - r535_fbsr_suspend(struct nvkm_gsp *gsp) 211 + r535_fbsr_suspend(struct nvkm_gsp *gsp, bool runtime) 212 212 { 213 213 struct nvkm_subdev *subdev = &gsp->subdev; 214 214 struct nvkm_device *device = subdev->device;
+1 -1
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c
··· 1748 1748 sr->sysmemAddrOfSuspendResumeData = gsp->sr.radix3.lvl0.addr; 1749 1749 sr->sizeOfSuspendResumeData = len; 1750 1750 1751 - ret = rm->api->fbsr->suspend(gsp); 1751 + ret = rm->api->fbsr->suspend(gsp, suspend == NVKM_RUNTIME_SUSPEND); 1752 1752 if (ret) { 1753 1753 nvkm_gsp_mem_dtor(&gsp->sr.meta); 1754 1754 nvkm_gsp_radix3_dtor(gsp, &gsp->sr.radix3);
+4 -4
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/fbsr.c
··· 62 62 } 63 63 64 64 static int 65 - r570_fbsr_init(struct nvkm_gsp *gsp, struct sg_table *sgt, u64 size) 65 + r570_fbsr_init(struct nvkm_gsp *gsp, struct sg_table *sgt, u64 size, bool runtime) 66 66 { 67 67 NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS *ctrl; 68 68 struct nvkm_gsp_object memlist; ··· 81 81 ctrl->hClient = gsp->internal.client.object.handle; 82 82 ctrl->hSysMem = memlist.handle; 83 83 ctrl->sysmemAddrOfSuspendResumeData = gsp->sr.meta.addr; 84 - ctrl->bEnteringGcoffState = 1; 84 + ctrl->bEnteringGcoffState = runtime ? 1 : 0; 85 85 86 86 ret = nvkm_gsp_rm_ctrl_wr(&gsp->internal.device.subdevice, ctrl); 87 87 if (ret) ··· 92 92 } 93 93 94 94 static int 95 - r570_fbsr_suspend(struct nvkm_gsp *gsp) 95 + r570_fbsr_suspend(struct nvkm_gsp *gsp, bool runtime) 96 96 { 97 97 struct nvkm_subdev *subdev = &gsp->subdev; 98 98 struct nvkm_device *device = subdev->device; ··· 133 133 return ret; 134 134 135 135 /* Initialise FBSR on RM. */ 136 - ret = r570_fbsr_init(gsp, &gsp->sr.fbsr, size); 136 + ret = r570_fbsr_init(gsp, &gsp->sr.fbsr, size, runtime); 137 137 if (ret) { 138 138 nvkm_gsp_sg_free(device, &gsp->sr.fbsr); 139 139 return ret;
+1 -1
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h
··· 78 78 } *device; 79 79 80 80 const struct nvkm_rm_api_fbsr { 81 - int (*suspend)(struct nvkm_gsp *); 81 + int (*suspend)(struct nvkm_gsp *, bool runtime); 82 82 void (*resume)(struct nvkm_gsp *); 83 83 } *fbsr; 84 84