[PATCH 2/6] nouveau/gsp: make libos init per-gsp version.

Dave Airlie <[email protected]> Wed, 29 Jul 2026 14:15:26 +1000
Newsgroups org.freedesktop.lists.nouveau,org.freedesktop.lists.dri-devel
Message-ID <[email protected]>
From: Dave Airlie <[email protected]>

This makes it a per-gsp thing, but just adds r570 as a copy of r535
for now.

r570 will be enhanced next.

Signed-off-by: Dave Airlie <[email protected]>
---
 .../drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c | 23 ++-----
 .../drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c | 68 +++++++++++++++++++
 .../nvkm/subdev/gsp/rm/r570/nvrm/gsp.h        | 23 +++++++
 .../gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h   | 16 +++++
 4 files changed, 114 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c b/driver=
s/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c
index f4f4142ec8d0..8e1ad2e79d3e 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
@@ -1205,7 +1205,7 @@ r535_gsp_set_rmargs(struct nvkm_gsp *gsp, bool resume=
)
 =09}
 }
=20
-static int
+int
 r535_gsp_rmargs_init(struct nvkm_gsp *gsp, bool resume)
 {
 =09int ret;
@@ -1362,7 +1362,7 @@ static struct dentry *create_debugfs(struct nvkm_gsp =
*gsp, const char *name,
  * r535_gsp_booter_load() is called, so that if GSP-RM fails to initialize=
,
  * there could still be a log to capture.
  */
-static void
+void
 r535_gsp_libos_debugfs_init(struct nvkm_gsp *gsp)
 {
 =09struct device *dev =3D gsp->subdev.device->dev;
@@ -1433,17 +1433,6 @@ r535_gsp_libos_debugfs_init(struct nvkm_gsp *gsp)
=20
 #endif
=20
-static inline u64
-r535_gsp_libos_id8(const char *name)
-{
-=09u64 id =3D 0;
-
-=09for (int i =3D 0; i < sizeof(id) && *name; i++, name++)
-=09=09id =3D (id << 8) | *name;
-
-=09return id;
-}
-
 /**
  * create_pte_array() - creates a PTE array of a physically contiguous buf=
fer
  * @ptes: pointer to the array
@@ -1461,7 +1450,8 @@ r535_gsp_libos_id8(const char *name)
  *
  * See memdescGetPhysAddrsForGpu()
  */
-static void create_pte_array(u64 *ptes, dma_addr_t addr, size_t size)
+void
+r535_gsp_create_pte_array(u64 *ptes, dma_addr_t addr, size_t size)
 {
 =09unsigned int num_pages =3D DIV_ROUND_UP_ULL(size, GSP_PAGE_SIZE);
 =09unsigned int i;
@@ -1488,7 +1478,7 @@ gsp_fill_libos_entry(struct nvkm_gsp *gsp,
 =09arg->size =3D mem->size;
 =09arg->kind =3D LIBOS_MEMORY_REGION_CONTIGUOUS;
 =09arg->loc  =3D LIBOS_MEMORY_REGION_LOC_SYSMEM;
-=09create_pte_array(mem->data + sizeof(u64), mem->addr, mem->size);
+=09r535_gsp_create_pte_array(mem->data + sizeof(u64), mem->addr, mem->size=
);
 =09return 0;
 }
=20
@@ -2187,7 +2177,7 @@ r535_gsp_oneinit(struct nvkm_gsp *gsp)
 =09/* Release FW images - we've copied them to DMA buffers now. */
 =09nvkm_gsp_dtor_fws(gsp);
=20
-=09ret =3D r535_gsp_libos_init(gsp);
+=09ret =3D rmapi->gsp->libos_init(gsp);
 =09if (WARN_ON(ret))
 =09=09return ret;
=20
@@ -2206,6 +2196,7 @@ r535_gsp_oneinit(struct nvkm_gsp *gsp)
=20
 const struct nvkm_rm_api_gsp
 r535_gsp =3D {
+=09.libos_init =3D r535_gsp_libos_init,
 =09.set_rmargs =3D r535_gsp_set_rmargs,
 =09.set_system_info =3D r535_gsp_set_system_info,
 =09.get_static_info =3D r535_gsp_get_static_info,
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c b/driver=
s/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c
index 996941c668ba..64011430f4c0 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c
@@ -205,8 +205,76 @@ r570_gsp_set_rmargs(struct nvkm_gsp *gsp, bool resume)
 =09args->bDmemStack =3D 1;
 }
=20
+static int
+gsp_fill_libos_entry(struct nvkm_gsp *gsp,
+=09=09     LibosMemoryRegionInitArgument *arg,
+=09=09     size_t size,
+=09=09     struct nvkm_gsp_mem *mem,
+=09=09     const char *name)
+{
+=09int ret;
+
+=09ret =3D nvkm_gsp_mem_ctor(gsp, size, mem);
+=09if (ret)
+=09=09return ret;
+
+=09arg->id8  =3D r535_gsp_libos_id8(name);
+=09arg->pa   =3D mem->addr;
+=09arg->size =3D mem->size;
+=09arg->kind =3D LIBOS_MEMORY_REGION_CONTIGUOUS;
+=09arg->loc  =3D LIBOS_MEMORY_REGION_LOC_SYSMEM;
+=09r535_gsp_create_pte_array(mem->data + sizeof(u64), mem->addr, mem->size=
);
+=09return 0;
+}
+
+/**
+ * r570_gsp_libos_init() -- create the libos arguments structure
+ * @gsp: gsp pointer
+ */
+static int
+r570_gsp_libos_init(struct nvkm_gsp *gsp)
+{
+=09LibosMemoryRegionInitArgument *args;
+=09int ret;
+
+=09ret =3D nvkm_gsp_mem_ctor(gsp, 0x1000, &gsp->libos);
+=09if (ret)
+=09=09return ret;
+
+=09args =3D gsp->libos.data;
+
+=09ret =3D gsp_fill_libos_entry(gsp, &args[0], 0x10000, &gsp->loginit, "LO=
GINIT");
+=09if (ret)
+=09=09return ret;
+
+=09ret =3D gsp_fill_libos_entry(gsp, &args[1], 0x10000, &gsp->logintr, "LO=
GINTR");
+=09if (ret)
+=09=09return ret;
+
+=09ret =3D gsp_fill_libos_entry(gsp, &args[2], 0x10000, &gsp->logrm, "LOGR=
M");
+=09if (ret)
+=09=09return ret;
+
+=09ret =3D r535_gsp_rmargs_init(gsp, false);
+=09if (ret)
+=09=09return ret;
+
+=09args[3].id8  =3D r535_gsp_libos_id8("RMARGS");
+=09args[3].pa   =3D gsp->rmargs.addr;
+=09args[3].size =3D gsp->rmargs.size;
+=09args[3].kind =3D LIBOS_MEMORY_REGION_CONTIGUOUS;
+=09args[3].loc  =3D LIBOS_MEMORY_REGION_LOC_SYSMEM;
+
+#ifdef CONFIG_DEBUG_FS
+=09r535_gsp_libos_debugfs_init(gsp);
+#endif
+
+=09return 0;
+}
+
 const struct nvkm_rm_api_gsp
 r570_gsp =3D {
+=09.libos_init =3D r570_gsp_libos_init,
 =09.set_rmargs =3D r570_gsp_set_rmargs,
 =09.set_system_info =3D r570_gsp_set_system_info,
 =09.get_static_info =3D r570_gsp_get_static_info,
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/gsp.h b/d=
rivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/gsp.h
index b6075021e74f..23c30cbdefff 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/gsp.h
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/nvrm/gsp.h
@@ -523,6 +523,29 @@ typedef struct
=20
 #define NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_3            (0x00000003=
U)
=20
+typedef NvU64 LibosAddress;
+
+typedef struct
+{
+    LibosAddress          id8;  // Id tag.
+    LibosAddress          pa;   // Physical address.
+    LibosAddress          size; // Size of memory area.
+    NvU8                  kind; // See LibosMemoryRegionKind above.
+    NvU8                  loc;  // See LibosMemoryRegionLoc above.
+} LibosMemoryRegionInitArgument;
+
+typedef enum {
+    LIBOS_MEMORY_REGION_NONE,
+    LIBOS_MEMORY_REGION_CONTIGUOUS,
+    LIBOS_MEMORY_REGION_RADIX3
+} LibosMemoryRegionKind;
+
+typedef enum {
+    LIBOS_MEMORY_REGION_LOC_NONE,
+    LIBOS_MEMORY_REGION_LOC_SYSMEM,
+    LIBOS_MEMORY_REGION_LOC_FB
+} LibosMemoryRegionLoc;
+
 typedef struct
 {
     // Magic for verification by secure ucode
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 a9af94adf9ef..cc9f33202673 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h
@@ -32,6 +32,7 @@ struct nvkm_rm_wpr {
=20
 struct nvkm_rm_api {
 =09const struct nvkm_rm_api_gsp {
+=09=09int (*libos_init)(struct nvkm_gsp *);
 =09=09void (*set_rmargs)(struct nvkm_gsp *, bool resume);
 =09=09int (*set_system_info)(struct nvkm_gsp *);
 =09=09int (*get_static_info)(struct nvkm_gsp *);
@@ -144,6 +145,9 @@ void r535_gsp_acpi_caps(acpi_handle, CAPS_METHOD_DATA *=
);
 struct NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS;
 void r535_gsp_get_static_info_fb(struct nvkm_gsp *,
 =09=09=09=09 const struct NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS *);
+void r535_gsp_create_pte_array(u64 *ptes, dma_addr_t addr, size_t size);
+int r535_gsp_rmargs_init(struct nvkm_gsp *gsp, bool resume);
+void r535_gsp_libos_debugfs_init(struct nvkm_gsp *gsp);
 extern const struct nvkm_rm_api_rpc r535_rpc;
 extern const struct nvkm_rm_api_ctrl r535_ctrl;
 extern const struct nvkm_rm_api_alloc r535_alloc;
@@ -188,4 +192,16 @@ extern const struct nvkm_rm_api_gr r570_gr;
 int r570_gr_gpc_mask(struct nvkm_gsp *, u32 *mask);
 int r570_gr_tpc_mask(struct nvkm_gsp *, int gpc, u32 *mask);
 extern const struct nvkm_rm_api_engine r570_ofa;
+
+static inline u64
+r535_gsp_libos_id8(const char *name)
+{
+=09u64 id =3D 0;
+
+=09for (int i =3D 0; i < sizeof(id) && *name; i++, name++)
+=09=09id =3D (id << 8) | *name;
+
+=09return id;
+}
+
 #endif
--=20
2.55.0