[PATCH 6/6] nouveau: set wpr boost flags like open driver does.
Dave Airlie <[email protected]> Wed, 29 Jul 2026 14:15:30 +1000
| Newsgroups | org.freedesktop.lists.nouveau,org.freedesktop.lists.dri-devel |
|---|---|
| Message-ID | <[email protected]> |
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/driver= s/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) =09=09sr->sysmemAddrOfSuspendResumeData =3D gsp->sr.radix3.lvl0.addr; =09=09sr->sizeOfSuspendResumeData =3D len; =20 +=09=09if (gsp->rm->api->gsp->set_sr_boost_flags) +=09=09=09gsp->rm->api->gsp->set_sr_boost_flags(gsp, sr, gsp->wpr_meta.data= ); + =09=09ret =3D rm->api->fbsr->suspend(gsp, suspend =3D=3D NVKM_RUNTIME_SUSP= END); =09=09if (ret) { =09=09=09nvkm_gsp_mem_dtor(&gsp->sr.meta); 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 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) =09return 0; } =20 +static void +r570_gsp_set_wpr_boost_flags(struct nvkm_gsp *gsp, void *data) +{ +=09GspFwWprMeta *meta =3D data; +=09meta->flags =3D GSP_FW_FLAGS_CLOCK_BOOST; +} + +static void +r570_gsp_set_sr_boost_flags(struct nvkm_gsp *gsp, void *sr_ptr, void *meta= _ptr) +{ +=09GspFwWprMeta *meta =3D meta_ptr; +=09GspFwSRMeta *sr =3D sr_ptr; +=09sr->flags =3D meta->flags; +} + 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_wpr_boost_flags =3D r570_gsp_set_wpr_boost_flags, +=09.set_sr_boost_flags =3D r570_gsp_set_sr_boost_flags, =09.set_system_info =3D r570_gsp_set_system_info, =09.get_static_info =3D r570_gsp_get_static_info, =09.xlat_mc_engine_idx =3D r570_gsp_xlat_mc_engine_idx, 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 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 =20 #define GSP_FW_WPR_META_REVISION 1 =20 +#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 { =09const struct nvkm_rm_api_gsp { =09=09int (*libos_init)(struct nvkm_gsp *); =09=09void (*set_rmargs)(struct nvkm_gsp *, bool resume); +=09=09void (*set_wpr_boost_flags)(struct nvkm_gsp *, void *meta); +=09=09void (*set_sr_boost_flags)(struct nvkm_gsp *, void *sr, void *meta); =09=09int (*set_system_info)(struct nvkm_gsp *); =09=09int (*get_static_info)(struct nvkm_gsp *); =09=09bool (*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) =09meta->magic =3D GSP_FW_WPR_META_MAGIC; =09meta->revision =3D GSP_FW_WPR_META_REVISION; =20 +=09if (gsp->rm->api->gsp->set_wpr_boost_flags) +=09=09gsp->rm->api->gsp->set_wpr_boost_flags(gsp, meta); =09meta->sysmemAddrOfRadix3Elf =3D gsp->radix3.lvl0.addr; =09meta->sizeOfRadix3Elf =3D gsp->fb.wpr2.elf.size; =20 --=20 2.55.0