drm/nouveau/gsp: add hal for gsp.sr_data_size()
authorBen Skeggs <bskeggs@nvidia.com>
Mon, 31 Mar 2025 19:22:41 +0000 (05:22 +1000)
committerDave Airlie <airlied@redhat.com>
Sun, 18 May 2025 20:29:26 +0000 (06:29 +1000)
570.86.15 uses a slightly different calculation for the size of the
sysmem buffer needed to store GSP-RM's vidmem data across suspend.

Signed-off-by: Ben Skeggs <bskeggs@nvidia.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Timur Tabi <ttabi@nvidia.com>
Tested-by: Timur Tabi <ttabi@nvidia.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h

index b7c2a785bc58b4fda94267658d57a257364b995e..85eb838d2a094c11b2043bd22d70d80b7c926301 100644 (file)
@@ -1700,6 +1700,14 @@ lvl1_fail:
        return ret;
 }
 
+static u32
+r535_gsp_sr_data_size(struct nvkm_gsp *gsp)
+{
+       GspFwWprMeta *meta = gsp->wpr_meta.data;
+
+       return meta->gspFwWprEnd - meta->gspFwWprStart;
+}
+
 int
 r535_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
 {
@@ -1707,8 +1715,7 @@ r535_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
        int ret;
 
        if (suspend) {
-               GspFwWprMeta *meta = gsp->wpr_meta.data;
-               u64 len = meta->gspFwWprEnd - meta->gspFwWprStart;
+               u32 len = rm->api->gsp->sr_data_size(gsp);
                GspFwSRMeta *sr;
 
                ret = nvkm_gsp_sg(gsp->subdev.device, len, &gsp->sr.sgt);
@@ -2167,4 +2174,5 @@ r535_gsp = {
        .get_static_info = r535_gsp_get_static_info,
        .xlat_mc_engine_idx = r535_gsp_xlat_mc_engine_idx,
        .drop_send_user_shared_data = r535_gsp_drop_send_user_shared_data,
+       .sr_data_size = r535_gsp_sr_data_size,
 };
index 7aed7cd72e8561b03ee2046dd29a771653507af2..eb018b73d26fe88b7e14609971681e8b797921da 100644 (file)
@@ -34,6 +34,7 @@ struct nvkm_rm_api {
                int (*get_static_info)(struct nvkm_gsp *);
                bool (*xlat_mc_engine_idx)(u32 mc_engine_idx, enum nvkm_subdev_type *, int *inst);
                void (*drop_send_user_shared_data)(struct nvkm_gsp *);
+               u32 (*sr_data_size)(struct nvkm_gsp *);
        } *gsp;
 
        const struct nvkm_rm_api_rpc {