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/drivers/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)
        }
 }
 
-static int
+int
 r535_gsp_rmargs_init(struct nvkm_gsp *gsp, bool resume)
 {
        int 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)
 {
        struct device *dev = gsp->subdev.device->dev;
@@ -1433,17 +1433,6 @@ r535_gsp_libos_debugfs_init(struct nvkm_gsp *gsp)
 
 #endif
 
-static inline u64
-r535_gsp_libos_id8(const char *name)
-{
-       u64 id = 0;
-
-       for (int i = 0; i < sizeof(id) && *name; i++, name++)
-               id = (id << 8) | *name;
-
-       return id;
-}
-
 /**
  * create_pte_array() - creates a PTE array of a physically contiguous buffer
  * @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)
 {
        unsigned int num_pages = DIV_ROUND_UP_ULL(size, GSP_PAGE_SIZE);
        unsigned int i;
@@ -1488,7 +1478,7 @@ gsp_fill_libos_entry(struct nvkm_gsp *gsp,
        arg->size = mem->size;
        arg->kind = LIBOS_MEMORY_REGION_CONTIGUOUS;
        arg->loc  = LIBOS_MEMORY_REGION_LOC_SYSMEM;
-       create_pte_array(mem->data + sizeof(u64), mem->addr, mem->size);
+       r535_gsp_create_pte_array(mem->data + sizeof(u64), mem->addr, 
mem->size);
        return 0;
 }
 
@@ -2187,7 +2177,7 @@ r535_gsp_oneinit(struct nvkm_gsp *gsp)
        /* Release FW images - we've copied them to DMA buffers now. */
        nvkm_gsp_dtor_fws(gsp);
 
-       ret = r535_gsp_libos_init(gsp);
+       ret = rmapi->gsp->libos_init(gsp);
        if (WARN_ON(ret))
                return ret;
 
@@ -2206,6 +2196,7 @@ r535_gsp_oneinit(struct nvkm_gsp *gsp)
 
 const struct nvkm_rm_api_gsp
 r535_gsp = {
+       .libos_init = r535_gsp_libos_init,
        .set_rmargs = r535_gsp_set_rmargs,
        .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/r570/gsp.c 
b/drivers/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)
        args->bDmemStack = 1;
 }
 
+static int
+gsp_fill_libos_entry(struct nvkm_gsp *gsp,
+                    LibosMemoryRegionInitArgument *arg,
+                    size_t size,
+                    struct nvkm_gsp_mem *mem,
+                    const char *name)
+{
+       int ret;
+
+       ret = nvkm_gsp_mem_ctor(gsp, size, mem);
+       if (ret)
+               return ret;
+
+       arg->id8  = r535_gsp_libos_id8(name);
+       arg->pa   = mem->addr;
+       arg->size = mem->size;
+       arg->kind = LIBOS_MEMORY_REGION_CONTIGUOUS;
+       arg->loc  = LIBOS_MEMORY_REGION_LOC_SYSMEM;
+       r535_gsp_create_pte_array(mem->data + sizeof(u64), mem->addr, 
mem->size);
+       return 0;
+}
+
+/**
+ * r570_gsp_libos_init() -- create the libos arguments structure
+ * @gsp: gsp pointer
+ */
+static int
+r570_gsp_libos_init(struct nvkm_gsp *gsp)
+{
+       LibosMemoryRegionInitArgument *args;
+       int ret;
+
+       ret = nvkm_gsp_mem_ctor(gsp, 0x1000, &gsp->libos);
+       if (ret)
+               return ret;
+
+       args = gsp->libos.data;
+
+       ret = gsp_fill_libos_entry(gsp, &args[0], 0x10000, &gsp->loginit, 
"LOGINIT");
+       if (ret)
+               return ret;
+
+       ret = gsp_fill_libos_entry(gsp, &args[1], 0x10000, &gsp->logintr, 
"LOGINTR");
+       if (ret)
+               return ret;
+
+       ret = gsp_fill_libos_entry(gsp, &args[2], 0x10000, &gsp->logrm, 
"LOGRM");
+       if (ret)
+               return ret;
+
+       ret = r535_gsp_rmargs_init(gsp, false);
+       if (ret)
+               return ret;
+
+       args[3].id8  = r535_gsp_libos_id8("RMARGS");
+       args[3].pa   = gsp->rmargs.addr;
+       args[3].size = gsp->rmargs.size;
+       args[3].kind = LIBOS_MEMORY_REGION_CONTIGUOUS;
+       args[3].loc  = LIBOS_MEMORY_REGION_LOC_SYSMEM;
+
+#ifdef CONFIG_DEBUG_FS
+       r535_gsp_libos_debugfs_init(gsp);
+#endif
+
+       return 0;
+}
+
 const struct nvkm_rm_api_gsp
 r570_gsp = {
+       .libos_init = r570_gsp_libos_init,
        .set_rmargs = r570_gsp_set_rmargs,
        .set_system_info = r570_gsp_set_system_info,
        .get_static_info = r570_gsp_get_static_info,
diff --git 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
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
 
 #define NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_3            (0x00000003U)
 
+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 {
 
 struct nvkm_rm_api {
        const struct nvkm_rm_api_gsp {
+               int (*libos_init)(struct nvkm_gsp *);
                void (*set_rmargs)(struct nvkm_gsp *, bool resume);
                int (*set_system_info)(struct nvkm_gsp *);
                int (*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 *,
                                 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)
+{
+       u64 id = 0;
+
+       for (int i = 0; i < sizeof(id) && *name; i++, name++)
+               id = (id << 8) | *name;
+
+       return id;
+}
+
 #endif
-- 
2.55.0

Reply via email to