mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 12:31:52 -04:00
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: da67179e55 ("drm/nouveau/gsp: Allocate fwsec-sb at boot")
Cc: <stable@vger.kernel.org> # v6.16+
Cc: Lyude Paul <lyude@redhat.com>
Cc: Timur Tabi <ttabi@nvidia.com>
Tested-by: Matthew Schwartz <matthew.schwartz@linux.dev>
Tested-by: Christopher Snowhill <chris@kode54.net>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Link: https://patch.msgid.link/20260102041829.2748009-1-airlied@gmail.com
This commit is contained in:
@@ -30,6 +30,9 @@ ad102_gsp = {
|
||||
|
||||
.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,
|
||||
|
||||
@@ -337,18 +337,12 @@ 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);
|
||||
}
|
||||
|
||||
int
|
||||
nvkm_gsp_fwsec_frts(struct nvkm_gsp *gsp)
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user