From: Dave Airlie <[email protected]>

I think this might just boot GSP faster, but maybe it has some
other effects. This is only set on Turing/Ampere/Ada.

This corresponds to what the openrm drivers does.

Signed-off-by: Dave Airlie <[email protected]>
---
 .../drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c   |  3 +++
 .../drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c   | 17 +++++++++++++++++
 .../nouveau/nvkm/subdev/gsp/rm/r570/nvrm/gsp.h  |  7 +++++++
 drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h |  2 ++
 drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c |  2 ++
 5 files changed, 31 insertions(+)

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 77a5a1882472..6f1a934a6afe 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
@@ -1740,6 +1740,9 @@ r535_gsp_fini(struct nvkm_gsp *gsp, enum 
nvkm_suspend_state suspend)
                sr->sysmemAddrOfSuspendResumeData = gsp->sr.radix3.lvl0.addr;
                sr->sizeOfSuspendResumeData = len;
 
+               if (gsp->rm->api->gsp->set_sr_boost_flags)
+                       gsp->rm->api->gsp->set_sr_boost_flags(gsp, sr, 
gsp->wpr_meta.data);
+
                ret = rm->api->fbsr->suspend(gsp, suspend == 
NVKM_RUNTIME_SUSPEND);
                if (ret) {
                        nvkm_gsp_mem_dtor(&gsp->sr.meta);
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 857eda1e7439..5ff886485774 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
@@ -290,10 +290,27 @@ r570_gsp_libos_init(struct nvkm_gsp *gsp)
        return 0;
 }
 
+static void
+r570_gsp_set_wpr_boost_flags(struct nvkm_gsp *gsp, void *data)
+{
+       GspFwWprMeta *meta = data;
+       meta->flags = GSP_FW_FLAGS_CLOCK_BOOST;
+}
+
+static void
+r570_gsp_set_sr_boost_flags(struct nvkm_gsp *gsp, void *sr_ptr, void *meta_ptr)
+{
+       GspFwWprMeta *meta = meta_ptr;
+       GspFwSRMeta *sr = sr_ptr;
+       sr->flags = meta->flags;
+}
+
 const struct nvkm_rm_api_gsp
 r570_gsp = {
        .libos_init = r570_gsp_libos_init,
        .set_rmargs = r570_gsp_set_rmargs,
+       .set_wpr_boost_flags = r570_gsp_set_wpr_boost_flags,
+       .set_sr_boost_flags = r570_gsp_set_sr_boost_flags,
        .set_system_info = r570_gsp_set_system_info,
        .get_static_info = r570_gsp_get_static_info,
        .xlat_mc_engine_idx = r570_gsp_xlat_mc_engine_idx,
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 23c30cbdefff..895ed3b85c31 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
@@ -494,6 +494,13 @@ typedef struct
 
 #define GSP_FW_WPR_META_REVISION  1
 
+#define GSP_FW_FLAGS                                       8:0
+#define GSP_FW_FLAGS_CLOCK_BOOST                           BIT(0)
+#define GSP_FW_FLAGS_RECOVERY_MARGIN_PRESENT               BIT(1)
+#define GSP_FW_FLAGS_PPCIE_ENABLED                         BIT(2)
+#define GSP_FW_FLAGS_MULTI_GPU_NVLE_ENABLED                BIT(3)
+#define GSP_FW_FLAGS_SCAN_RECOVERY_MARGIN                  BIT(4)
+
 typedef struct {
     NvU64 sharedMemPhysAddr;
     NvU32 pageTableEntryCount;
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 b71ba74eec12..e8231a589e56 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h
@@ -48,6 +48,8 @@ struct nvkm_rm_api {
        const struct nvkm_rm_api_gsp {
                int (*libos_init)(struct nvkm_gsp *);
                void (*set_rmargs)(struct nvkm_gsp *, bool resume);
+               void (*set_wpr_boost_flags)(struct nvkm_gsp *, void *meta);
+               void (*set_sr_boost_flags)(struct nvkm_gsp *, void *sr, void 
*meta);
                int (*set_system_info)(struct nvkm_gsp *);
                int (*get_static_info)(struct nvkm_gsp *);
                bool (*xlat_mc_engine_idx)(u32 mc_engine_idx, enum 
nvkm_subdev_type *, int *inst);
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c 
b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c
index 11a37963bd4e..5cb65fc0dc9f 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c
@@ -224,6 +224,8 @@ tu102_gsp_wpr_meta_init(struct nvkm_gsp *gsp)
        meta->magic = GSP_FW_WPR_META_MAGIC;
        meta->revision = GSP_FW_WPR_META_REVISION;
 
+       if (gsp->rm->api->gsp->set_wpr_boost_flags)
+               gsp->rm->api->gsp->set_wpr_boost_flags(gsp, meta);
        meta->sysmemAddrOfRadix3Elf = gsp->radix3.lvl0.addr;
        meta->sizeOfRadix3Elf = gsp->fb.wpr2.elf.size;
 
-- 
2.55.0

Reply via email to