545.23.06 has incompatible changes to a number of definitions that
impact the layout of GspStaticConfigInfo.

Signed-off-by: Ben Skeggs <bske...@nvidia.com>
Reviewed-by: Dave Airlie <airl...@redhat.com>
Reviewed-by: Timur Tabi <tt...@nvidia.com>
Tested-by: Timur Tabi <tt...@nvidia.com>
---
 .../drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c | 67 +++++++++++--------
 .../gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h   |  1 +
 2 files changed, 39 insertions(+), 29 deletions(-)

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 b225dd06d490..338201b65930 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
@@ -165,36 +165,14 @@ r535_gsp_intr_get_table(struct nvkm_gsp *gsp)
        return ret;
 }
 
-static int
-r535_gsp_rpc_get_gsp_static_info(struct nvkm_gsp *gsp)
+static void
+r535_gsp_get_static_info_fb(struct nvkm_gsp *gsp,
+                           const struct 
NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS *info)
 {
-       GspStaticConfigInfo *rpc;
        int last_usable = -1;
 
-       rpc = nvkm_gsp_rpc_rd(gsp, NV_VGPU_MSG_FUNCTION_GET_GSP_STATIC_INFO, 
sizeof(*rpc));
-       if (IS_ERR(rpc))
-               return PTR_ERR(rpc);
-
-       gsp->internal.client.object.client = &gsp->internal.client;
-       gsp->internal.client.object.parent = NULL;
-       gsp->internal.client.object.handle = rpc->hInternalClient;
-       gsp->internal.client.gsp = gsp;
-       INIT_LIST_HEAD(&gsp->internal.client.events);
-
-       gsp->internal.device.object.client = &gsp->internal.client;
-       gsp->internal.device.object.parent = &gsp->internal.client.object;
-       gsp->internal.device.object.handle = rpc->hInternalDevice;
-
-       gsp->internal.device.subdevice.client = &gsp->internal.client;
-       gsp->internal.device.subdevice.parent = &gsp->internal.device.object;
-       gsp->internal.device.subdevice.handle = rpc->hInternalSubdevice;
-
-       gsp->bar.rm_bar1_pdb = rpc->bar1PdeBase;
-       gsp->bar.rm_bar2_pdb = rpc->bar2PdeBase;
-
-       for (int i = 0; i < rpc->fbRegionInfoParams.numFBRegions; i++) {
-               NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO *reg =
-                       &rpc->fbRegionInfoParams.fbRegion[i];
+       for (int i = 0; i < info->numFBRegions; i++) {
+               const NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO *reg = 
&info->fbRegion[i];
 
                nvkm_debug(&gsp->subdev, "fb region %d: "
                           "%016llx-%016llx rsvd:%016llx perf:%08x comp:%d 
iso:%d prot:%d\n", i,
@@ -216,10 +194,39 @@ r535_gsp_rpc_get_gsp_static_info(struct nvkm_gsp *gsp)
        }
 
        if (last_usable >= 0) {
-               u32 rsvd_base = 
rpc->fbRegionInfoParams.fbRegion[last_usable].limit + 1;
+               u32 rsvd_base = info->fbRegion[last_usable].limit + 1;
 
                gsp->fb.rsvd_size = gsp->fb.heap.addr - rsvd_base;
        }
+}
+
+static int
+r535_gsp_get_static_info(struct nvkm_gsp *gsp)
+{
+       GspStaticConfigInfo *rpc;
+
+       rpc = nvkm_gsp_rpc_rd(gsp, NV_VGPU_MSG_FUNCTION_GET_GSP_STATIC_INFO, 
sizeof(*rpc));
+       if (IS_ERR(rpc))
+               return PTR_ERR(rpc);
+
+       gsp->internal.client.object.client = &gsp->internal.client;
+       gsp->internal.client.object.parent = NULL;
+       gsp->internal.client.object.handle = rpc->hInternalClient;
+       gsp->internal.client.gsp = gsp;
+       INIT_LIST_HEAD(&gsp->internal.client.events);
+
+       gsp->internal.device.object.client = &gsp->internal.client;
+       gsp->internal.device.object.parent = &gsp->internal.client.object;
+       gsp->internal.device.object.handle = rpc->hInternalDevice;
+
+       gsp->internal.device.subdevice.client = &gsp->internal.client;
+       gsp->internal.device.subdevice.parent = &gsp->internal.device.object;
+       gsp->internal.device.subdevice.handle = rpc->hInternalSubdevice;
+
+       gsp->bar.rm_bar1_pdb = rpc->bar1PdeBase;
+       gsp->bar.rm_bar2_pdb = rpc->bar2PdeBase;
+
+       r535_gsp_get_static_info_fb(gsp, &rpc->fbRegionInfoParams);
 
        for (int gpc = 0; gpc < ARRAY_SIZE(rpc->tpcInfo); gpc++) {
                if (rpc->gpcInfo.gpcMask & BIT(gpc)) {
@@ -278,9 +285,10 @@ static int
 r535_gsp_postinit(struct nvkm_gsp *gsp)
 {
        struct nvkm_device *device = gsp->subdev.device;
+       const struct nvkm_rm_api *rmapi = gsp->rm->api;
        int ret;
 
-       ret = r535_gsp_rpc_get_gsp_static_info(gsp);
+       ret = rmapi->gsp->get_static_info(gsp);
        if (WARN_ON(ret))
                return ret;
 
@@ -2156,4 +2164,5 @@ r535_gsp_oneinit(struct nvkm_gsp *gsp)
 const struct nvkm_rm_api_gsp
 r535_gsp = {
        .set_system_info = r535_gsp_set_system_info,
+       .get_static_info = r535_gsp_get_static_info,
 };
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 4a37904f7f9c..445793d8147b 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h
@@ -28,6 +28,7 @@ struct nvkm_rm_wpr {
 struct nvkm_rm_api {
        const struct nvkm_rm_api_gsp {
                int (*set_system_info)(struct nvkm_gsp *);
+               int (*get_static_info)(struct nvkm_gsp *);
        } *gsp;
 
        const struct nvkm_rm_api_rpc {
-- 
2.49.0

Reply via email to