[PATCH] nouveau/gsp/fbsr: split fbsr suspend into two paths and reorder.
Dave Airlie
airlied at gmail.com
Wed Jun 18 03:22:44 UTC 2025
From: Dave Airlie <airlied at redhat.com>
This is a fix/part revert for c21b039715ce
drm/nouveau/gsp: add hals for fbsr.suspend/resume()
For some undetermined reasons the above commit has caused a regression,
after a few s/r cycles, we start to get channel timeouts with robust
context 38 error (not defined in openrm).
Reordering this earlier seems to work for 535, but 570 wants to have
the suspend/resume data address for some reason.
This moves the suspend earlier but also splits the path in two
for r570. It seems to fix the issue.
It should also be noted that openrm doesn't do this, it keeps
the order the same, so there is something that doesn't make sense.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
.../gpu/drm/nouveau/include/nvkm/subdev/gsp.h | 1 +
.../drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c | 18 ++++++++++++------
.../drm/nouveau/nvkm/subdev/gsp/rm/r570/fbsr.c | 13 ++++++++++++-
.../gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h | 1 +
4 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h
index 226c7ec56b8e..e678a7389662 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h
@@ -146,6 +146,7 @@ struct nvkm_gsp {
struct nvkm_gsp_radix3 radix3;
struct nvkm_gsp_mem meta;
struct sg_table fbsr;
+ u64 fbsr_size;
} sr;
struct {
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c
index baf42339f93e..8c69b654a489 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c
@@ -1719,6 +1719,9 @@ r535_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
u32 len = rm->api->gsp->sr_data_size(gsp);
GspFwSRMeta *sr;
+ ret = rm->api->fbsr->suspend(gsp);
+ if (ret)
+ return ret;
ret = nvkm_gsp_sg(gsp->subdev.device, len, &gsp->sr.sgt);
if (ret)
return ret;
@@ -1737,12 +1740,15 @@ r535_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
sr->sysmemAddrOfSuspendResumeData = gsp->sr.radix3.lvl0.addr;
sr->sizeOfSuspendResumeData = len;
- ret = rm->api->fbsr->suspend(gsp);
- if (ret) {
- nvkm_gsp_mem_dtor(&gsp->sr.meta);
- nvkm_gsp_radix3_dtor(gsp, &gsp->sr.radix3);
- nvkm_gsp_sg_free(gsp->subdev.device, &gsp->sr.sgt);
- return ret;
+ if (rm->api->fbsr->suspend2) {
+ ret = rm->api->fbsr->suspend2(gsp);
+ if (ret) {
+ nvkm_gsp_mem_dtor(&gsp->sr.meta);
+ nvkm_gsp_radix3_dtor(gsp, &gsp->sr.radix3);
+ nvkm_gsp_sg_free(gsp->subdev.device, &gsp->sr.sgt);
+ gsp->rm->api->fbsr->resume(gsp);
+ return ret;
+ }
}
}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/fbsr.c b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/fbsr.c
index 2945d5b4e570..d47dc5aa5e2b 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/fbsr.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/fbsr.c
@@ -132,8 +132,18 @@ r570_fbsr_suspend(struct nvkm_gsp *gsp)
if (ret)
return ret;
+ gsp->sr.fbsr_size = size;
+ return 0;
+}
+
+static int
+r570_fbsr_suspend2(struct nvkm_gsp *gsp)
+{
+ struct nvkm_subdev *subdev = &gsp->subdev;
+ struct nvkm_device *device = subdev->device;
+ int ret;
/* Initialise FBSR on RM. */
- ret = r570_fbsr_init(gsp, &gsp->sr.fbsr, size);
+ ret = r570_fbsr_init(gsp, &gsp->sr.fbsr, gsp->sr.fbsr_size);
if (ret) {
nvkm_gsp_sg_free(device, &gsp->sr.fbsr);
return ret;
@@ -145,5 +155,6 @@ r570_fbsr_suspend(struct nvkm_gsp *gsp)
const struct nvkm_rm_api_fbsr
r570_fbsr = {
.suspend = r570_fbsr_suspend,
+ .suspend2 = r570_fbsr_suspend2,
.resume = r570_fbsr_resume,
};
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h
index 393ea775941f..c71904c3f9cc 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h
@@ -79,6 +79,7 @@ struct nvkm_rm_api {
const struct nvkm_rm_api_fbsr {
int (*suspend)(struct nvkm_gsp *);
+ int (*suspend2)(struct nvkm_gsp *);
void (*resume)(struct nvkm_gsp *);
} *fbsr;
--
2.49.0
More information about the Nouveau
mailing list