Skip to content

Commit e8b3627

Browse files
committed
nouveau: don't attempt fwsec on sb on newer platforms.
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: da67179 ("drm/nouveau/gsp: Allocate fwsec-sb at boot") Cc: <[email protected]> # v6.16+ Cc: Lyude Paul <[email protected]> Cc: Timur Tabi <[email protected]> Tested-by: Matthew Schwartz <[email protected]> Tested-by: Christopher Snowhill <[email protected]> Reviewed-by: Lyude Paul <[email protected]> Signed-off-by: Dave Airlie <[email protected]> Link: https://patch.msgid.link/[email protected]
1 parent 2fc0434 commit e8b3627

7 files changed

Lines changed: 49 additions & 9 deletions

File tree

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ad102.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ ad102_gsp = {
3030

3131
.booter.ctor = ga102_gsp_booter_ctor,
3232

33+
.fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor,
34+
.fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor,
35+
3336
.dtor = r535_gsp_dtor,
3437
.oneinit = tu102_gsp_oneinit,
3538
.init = tu102_gsp_init,

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/fwsec.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -337,18 +337,12 @@ nvkm_gsp_fwsec_sb(struct nvkm_gsp *gsp)
337337
}
338338

339339
int
340-
nvkm_gsp_fwsec_sb_ctor(struct nvkm_gsp *gsp)
340+
nvkm_gsp_fwsec_sb_init(struct nvkm_gsp *gsp)
341341
{
342342
return nvkm_gsp_fwsec_init(gsp, &gsp->fws.falcon.sb, "fwsec-sb",
343343
NVFW_FALCON_APPIF_DMEMMAPPER_CMD_SB);
344344
}
345345

346-
void
347-
nvkm_gsp_fwsec_sb_dtor(struct nvkm_gsp *gsp)
348-
{
349-
nvkm_falcon_fw_dtor(&gsp->fws.falcon.sb);
350-
}
351-
352346
int
353347
nvkm_gsp_fwsec_frts(struct nvkm_gsp *gsp)
354348
{

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga100.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ ga100_gsp = {
4747

4848
.booter.ctor = tu102_gsp_booter_ctor,
4949

50+
.fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor,
51+
.fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor,
52+
5053
.dtor = r535_gsp_dtor,
5154
.oneinit = tu102_gsp_oneinit,
5255
.init = tu102_gsp_init,

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga102.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ ga102_gsp_r535 = {
158158

159159
.booter.ctor = ga102_gsp_booter_ctor,
160160

161+
.fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor,
162+
.fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor,
163+
161164
.dtor = r535_gsp_dtor,
162165
.oneinit = tu102_gsp_oneinit,
163166
.init = tu102_gsp_init,

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/priv.h

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@ enum nvkm_acr_lsf_id;
77

88
int nvkm_gsp_fwsec_frts(struct nvkm_gsp *);
99

10-
int nvkm_gsp_fwsec_sb_ctor(struct nvkm_gsp *);
1110
int nvkm_gsp_fwsec_sb(struct nvkm_gsp *);
12-
void nvkm_gsp_fwsec_sb_dtor(struct nvkm_gsp *);
11+
int nvkm_gsp_fwsec_sb_init(struct nvkm_gsp *gsp);
1312

1413
struct nvkm_gsp_fwif {
1514
int version;
@@ -52,6 +51,11 @@ struct nvkm_gsp_func {
5251
struct nvkm_falcon *, struct nvkm_falcon_fw *);
5352
} booter;
5453

54+
struct {
55+
int (*ctor)(struct nvkm_gsp *);
56+
void (*dtor)(struct nvkm_gsp *);
57+
} fwsec_sb;
58+
5559
void (*dtor)(struct nvkm_gsp *);
5660
int (*oneinit)(struct nvkm_gsp *);
5761
int (*init)(struct nvkm_gsp *);
@@ -67,6 +71,8 @@ extern const struct nvkm_falcon_func tu102_gsp_flcn;
6771
extern const struct nvkm_falcon_fw_func tu102_gsp_fwsec;
6872
int tu102_gsp_booter_ctor(struct nvkm_gsp *, const char *, const struct firmware *,
6973
struct nvkm_falcon *, struct nvkm_falcon_fw *);
74+
int tu102_gsp_fwsec_sb_ctor(struct nvkm_gsp *);
75+
void tu102_gsp_fwsec_sb_dtor(struct nvkm_gsp *);
7076
int tu102_gsp_oneinit(struct nvkm_gsp *);
7177
int tu102_gsp_init(struct nvkm_gsp *);
7278
int tu102_gsp_fini(struct nvkm_gsp *, bool suspend);
@@ -91,5 +97,18 @@ int r535_gsp_fini(struct nvkm_gsp *, bool suspend);
9197
int nvkm_gsp_new_(const struct nvkm_gsp_fwif *, struct nvkm_device *, enum nvkm_subdev_type, int,
9298
struct nvkm_gsp **);
9399

100+
static inline int nvkm_gsp_fwsec_sb_ctor(struct nvkm_gsp *gsp)
101+
{
102+
if (gsp->func->fwsec_sb.ctor)
103+
return gsp->func->fwsec_sb.ctor(gsp);
104+
return 0;
105+
}
106+
107+
static inline void nvkm_gsp_fwsec_sb_dtor(struct nvkm_gsp *gsp)
108+
{
109+
if (gsp->func->fwsec_sb.dtor)
110+
gsp->func->fwsec_sb.dtor(gsp);
111+
}
112+
94113
extern const struct nvkm_gsp_func gv100_gsp;
95114
#endif

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,18 @@
3030
#include <nvfw/fw.h>
3131
#include <nvfw/hs.h>
3232

33+
int
34+
tu102_gsp_fwsec_sb_ctor(struct nvkm_gsp *gsp)
35+
{
36+
return nvkm_gsp_fwsec_sb_init(gsp);
37+
}
38+
39+
void
40+
tu102_gsp_fwsec_sb_dtor(struct nvkm_gsp *gsp)
41+
{
42+
nvkm_falcon_fw_dtor(&gsp->fws.falcon.sb);
43+
}
44+
3345
static int
3446
tu102_gsp_booter_unload(struct nvkm_gsp *gsp, u32 mbox0, u32 mbox1)
3547
{
@@ -370,6 +382,9 @@ tu102_gsp = {
370382

371383
.booter.ctor = tu102_gsp_booter_ctor,
372384

385+
.fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor,
386+
.fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor,
387+
373388
.dtor = r535_gsp_dtor,
374389
.oneinit = tu102_gsp_oneinit,
375390
.init = tu102_gsp_init,

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu116.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ tu116_gsp = {
3030

3131
.booter.ctor = tu102_gsp_booter_ctor,
3232

33+
.fwsec_sb.ctor = tu102_gsp_fwsec_sb_ctor,
34+
.fwsec_sb.dtor = tu102_gsp_fwsec_sb_dtor,
35+
3336
.dtor = r535_gsp_dtor,
3437
.oneinit = tu102_gsp_oneinit,
3538
.init = tu102_gsp_init,

0 commit comments

Comments
 (0)