OSDN Git Service

drm/nouveau/acr: allow module to load when HSFW(s) are missing
authorBen Skeggs <bskeggs@redhat.com>
Tue, 16 Jun 2020 00:47:07 +0000 (10:47 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 24 Jul 2020 08:50:48 +0000 (18:50 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/subdev/acr/gm200.c
drivers/gpu/drm/nouveau/nvkm/subdev/acr/gm20b.c
drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp102.c
drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp108.c
drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp10b.c
drivers/gpu/drm/nouveau/nvkm/subdev/acr/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/acr/tu102.c

index 9a63940..74ffcf1 100644 (file)
 #include <nvfw/acr.h>
 #include <nvfw/flcn.h>
 
+const struct nvkm_acr_func
+gm200_acr = {
+};
+
+int
+gm200_acr_nofw(struct nvkm_acr *acr, int ver, const struct nvkm_acr_fwif *fwif)
+{
+       nvkm_warn(&acr->subdev, "firmware unavailable\n");
+       return 0;
+}
+
 int
 gm200_acr_init(struct nvkm_acr *acr)
 {
@@ -425,7 +436,7 @@ gm200_acr_load_fwif[] = {
 };
 
 static const struct nvkm_acr_func
-gm200_acr = {
+gm200_acr_0 = {
        .load = gm200_acr_load_fwif,
        .unload = gm200_acr_unload_fwif,
        .wpr_parse = gm200_acr_wpr_parse,
@@ -459,7 +470,8 @@ gm200_acr_load(struct nvkm_acr *acr, int ver, const struct nvkm_acr_fwif *fwif)
 
 static const struct nvkm_acr_fwif
 gm200_acr_fwif[] = {
-       { 0, gm200_acr_load, &gm200_acr },
+       {  0, gm200_acr_load, &gm200_acr_0 },
+       { -1, gm200_acr_nofw, &gm200_acr },
        {}
 };
 
index 034a6ed..b1ecc58 100644 (file)
@@ -123,7 +123,8 @@ gm20b_acr_load(struct nvkm_acr *acr, int ver, const struct nvkm_acr_fwif *fwif)
 
 static const struct nvkm_acr_fwif
 gm20b_acr_fwif[] = {
-       { 0, gm20b_acr_load, &gm20b_acr },
+       {  0, gm20b_acr_load, &gm20b_acr },
+       { -1, gm200_acr_nofw, &gm200_acr },
        {}
 };
 
index 49e11c4..80eb9d8 100644 (file)
@@ -270,7 +270,8 @@ gp102_acr_load(struct nvkm_acr *acr, int ver, const struct nvkm_acr_fwif *fwif)
 
 static const struct nvkm_acr_fwif
 gp102_acr_fwif[] = {
-       { 0, gp102_acr_load, &gp102_acr },
+       {  0, gp102_acr_load, &gp102_acr },
+       { -1, gm200_acr_nofw, &gm200_acr },
        {}
 };
 
index f10dc91..67a7c14 100644 (file)
@@ -100,7 +100,8 @@ gp108_acr = {
 
 static const struct nvkm_acr_fwif
 gp108_acr_fwif[] = {
-       { 0, gp102_acr_load, &gp108_acr },
+       {  0, gp102_acr_load, &gp108_acr },
+       { -1, gm200_acr_nofw, &gm200_acr },
        {}
 };
 
index 39de642..8249f0d 100644 (file)
@@ -46,7 +46,8 @@ gp10b_acr = {
 
 static const struct nvkm_acr_fwif
 gp10b_acr_fwif[] = {
-       { 0, gm20b_acr_load, &gp10b_acr },
+       {  0, gm20b_acr_load, &gp10b_acr },
+       { -1, gm200_acr_nofw, &gm200_acr },
        {}
 };
 
index d8ba728..9c10879 100644 (file)
@@ -10,6 +10,7 @@ struct nvkm_acr_fwif {
        const struct nvkm_acr_func *func;
 };
 
+int gm200_acr_nofw(struct nvkm_acr *, int, const struct nvkm_acr_fwif *);
 int gm20b_acr_load(struct nvkm_acr *, int, const struct nvkm_acr_fwif *);
 int gp102_acr_load(struct nvkm_acr *, int, const struct nvkm_acr_fwif *);
 
@@ -29,6 +30,7 @@ struct nvkm_acr_func {
        void (*fini)(struct nvkm_acr *);
 };
 
+extern const struct nvkm_acr_func gm200_acr;
 int gm200_acr_wpr_parse(struct nvkm_acr *);
 u32 gm200_acr_wpr_layout(struct nvkm_acr *);
 int gm200_acr_wpr_build(struct nvkm_acr *, struct nvkm_acr_lsf *);
index d28d8f3..c4981bc 100644 (file)
@@ -219,6 +219,7 @@ tu102_acr_load(struct nvkm_acr *acr, int version,
 static const struct nvkm_acr_fwif
 tu102_acr_fwif[] = {
        {  0, tu102_acr_load, &tu102_acr },
+       { -1, gm200_acr_nofw, &gm200_acr },
        {}
 };