From: Dave Airlie <airlied@gmail.com>
To: dri-devel@lists.freedesktop.org
Cc: nouveau@lists.freedesktop.org
Subject: [PATCH] nouveau/gsp/fbsr: split fbsr suspend into two paths and reorder.
Date: Wed, 18 Jun 2025 13:22:44 +1000 [thread overview]
Message-ID: <20250618032244.487604-1-airlied@gmail.com> (raw)
From: Dave Airlie <airlied@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@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
reply other threads:[~2025-06-18 3:23 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250618032244.487604-1-airlied@gmail.com \
--to=airlied@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=nouveau@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.