On 1/1/26 8:18 PM, Dave Airlie wrote: > From: Dave Airlie <[email protected]> > > The changes to always loads fwsec sb causes problems on newer GPUs > which don't use this path. > > Add hooks and pass through the device specific layers. > > Fixes: da67179e5538 ("drm/nouveau/gsp: Allocate fwsec-sb at boot")
Closes: https://lore.kernel.org/nouveau/[email protected]/ Tested-by: Matthew Schwartz <[email protected]> Thanks, Matt > Cc: <[email protected]> # v6.16+ > Cc: Lyude Paul <[email protected]> > Cc: Timur Tabi <[email protected]> > Signed-off-by: Dave Airlie <[email protected]> > --- > .../gpu/drm/nouveau/nvkm/subdev/gsp/ad102.c | 3 +++ > .../gpu/drm/nouveau/nvkm/subdev/gsp/fwsec.c | 12 +++------- > .../gpu/drm/nouveau/nvkm/subdev/gsp/ga100.c | 3 +++ > .../gpu/drm/nouveau/nvkm/subdev/gsp/ga102.c | 3 +++ > .../gpu/drm/nouveau/nvkm/subdev/gsp/priv.h | 23 +++++++++++++++++-- > .../gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c | 15 ++++++++++++ > .../gpu/drm/nouveau/nvkm/subdev/gsp/tu116.c | 3 +++ > 7 files changed, 51 insertions(+), 11 deletions(-) > > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ad102.c > b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ad102.c > index 35d1fcef520bf..b3e994386334d 100644 > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ad102.c > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ad102.c > @@ -29,6 +29,9 @@ ad102_gsp = { > .sig_section = ".fwsignature_ad10x", > > .booter.ctor = ga102_gsp_booter_ctor, > + > + .fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor, > + .fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor, > > .dtor = r535_gsp_dtor, > .oneinit = tu102_gsp_oneinit, > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/fwsec.c > b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/fwsec.c > index 5037602466604..8d4f40a443ce4 100644 > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/fwsec.c > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/fwsec.c > @@ -337,16 +337,10 @@ nvkm_gsp_fwsec_sb(struct nvkm_gsp *gsp) > } > > int > -nvkm_gsp_fwsec_sb_ctor(struct nvkm_gsp *gsp) > +nvkm_gsp_fwsec_sb_init(struct nvkm_gsp *gsp) > { > - return nvkm_gsp_fwsec_init(gsp, &gsp->fws.falcon.sb, "fwsec-sb", > - NVFW_FALCON_APPIF_DMEMMAPPER_CMD_SB); > -} > - > -void > -nvkm_gsp_fwsec_sb_dtor(struct nvkm_gsp *gsp) > -{ > - nvkm_falcon_fw_dtor(&gsp->fws.falcon.sb); > + return nvkm_gsp_fwsec_init(gsp, &gsp->fws.falcon.sb, "fwsec-sb", > + NVFW_FALCON_APPIF_DMEMMAPPER_CMD_SB); > } > > int > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga100.c > b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga100.c > index d201e8697226b..27a13aeccd3cb 100644 > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga100.c > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga100.c > @@ -47,6 +47,9 @@ ga100_gsp = { > > .booter.ctor = tu102_gsp_booter_ctor, > > + .fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor, > + .fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor, > + > .dtor = r535_gsp_dtor, > .oneinit = tu102_gsp_oneinit, > .init = tu102_gsp_init, > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga102.c > b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga102.c > index 917f7e2f6c466..a59fb74ef6315 100644 > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga102.c > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga102.c > @@ -158,6 +158,9 @@ ga102_gsp_r535 = { > > .booter.ctor = ga102_gsp_booter_ctor, > > + .fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor, > + .fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor, > + > .dtor = r535_gsp_dtor, > .oneinit = tu102_gsp_oneinit, > .init = tu102_gsp_init, > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/priv.h > b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/priv.h > index 86bdd203bc107..9dd66a2e38017 100644 > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/priv.h > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/priv.h > @@ -7,9 +7,8 @@ enum nvkm_acr_lsf_id; > > int nvkm_gsp_fwsec_frts(struct nvkm_gsp *); > > -int nvkm_gsp_fwsec_sb_ctor(struct nvkm_gsp *); > int nvkm_gsp_fwsec_sb(struct nvkm_gsp *); > -void nvkm_gsp_fwsec_sb_dtor(struct nvkm_gsp *); > +int nvkm_gsp_fwsec_sb_init(struct nvkm_gsp *gsp); > > struct nvkm_gsp_fwif { > int version; > @@ -52,6 +51,11 @@ struct nvkm_gsp_func { > struct nvkm_falcon *, struct nvkm_falcon_fw *); > } booter; > > + struct { > + int (*ctor)(struct nvkm_gsp *); > + void (*dtor)(struct nvkm_gsp *); > + } fwsec_sb; > + > void (*dtor)(struct nvkm_gsp *); > int (*oneinit)(struct nvkm_gsp *); > int (*init)(struct nvkm_gsp *); > @@ -67,6 +71,8 @@ extern const struct nvkm_falcon_func tu102_gsp_flcn; > extern const struct nvkm_falcon_fw_func tu102_gsp_fwsec; > int tu102_gsp_booter_ctor(struct nvkm_gsp *, const char *, const struct > firmware *, > struct nvkm_falcon *, struct nvkm_falcon_fw *); > +int tu102_gsp_fwsec_sb_ctor(struct nvkm_gsp *); > +void tu102_gsp_fwsec_sb_dtor(struct nvkm_gsp *); > int tu102_gsp_oneinit(struct nvkm_gsp *); > int tu102_gsp_init(struct nvkm_gsp *); > int tu102_gsp_fini(struct nvkm_gsp *, bool suspend); > @@ -91,5 +97,18 @@ int r535_gsp_fini(struct nvkm_gsp *, bool suspend); > int nvkm_gsp_new_(const struct nvkm_gsp_fwif *, struct nvkm_device *, enum > nvkm_subdev_type, int, > struct nvkm_gsp **); > > +static inline int nvkm_gsp_fwsec_sb_ctor(struct nvkm_gsp *gsp) > +{ > + if (gsp->func->fwsec_sb.ctor) > + return gsp->func->fwsec_sb.ctor(gsp); > + return 0; > +} > + > +static inline void nvkm_gsp_fwsec_sb_dtor(struct nvkm_gsp *gsp) > +{ > + if (gsp->func->fwsec_sb.dtor) > + gsp->func->fwsec_sb.dtor(gsp); > +} > + > extern const struct nvkm_gsp_func gv100_gsp; > #endif > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c > b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c > index 81e56da0474a1..04b642a1f7305 100644 > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c > @@ -30,6 +30,18 @@ > #include <nvfw/fw.h> > #include <nvfw/hs.h> > > +int > +tu102_gsp_fwsec_sb_ctor(struct nvkm_gsp *gsp) > +{ > + return nvkm_gsp_fwsec_sb_init(gsp); > +} > + > +void > +tu102_gsp_fwsec_sb_dtor(struct nvkm_gsp *gsp) > +{ > + nvkm_falcon_fw_dtor(&gsp->fws.falcon.sb); > +} > + > static int > tu102_gsp_booter_unload(struct nvkm_gsp *gsp, u32 mbox0, u32 mbox1) > { > @@ -370,6 +382,9 @@ tu102_gsp = { > > .booter.ctor = tu102_gsp_booter_ctor, > > + .fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor, > + .fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor, > + > .dtor = r535_gsp_dtor, > .oneinit = tu102_gsp_oneinit, > .init = tu102_gsp_init, > diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu116.c > b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu116.c > index 97eb046c25d07..58cf258424218 100644 > --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu116.c > +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu116.c > @@ -30,6 +30,9 @@ tu116_gsp = { > > .booter.ctor = tu102_gsp_booter_ctor, > > + .fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor, > + .fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor, > + > .dtor = r535_gsp_dtor, > .oneinit = tu102_gsp_oneinit, > .init = tu102_gsp_init,
