]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/nouveau/disp/tu102-: prepare for GSP-RM
authorBen Skeggs <bskeggs@redhat.com>
Mon, 18 Sep 2023 20:21:29 +0000 (06:21 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 31 Oct 2023 05:08:14 +0000 (15:08 +1000)
- (temporarily) disable if GSP-RM detected, will be added later
- pass "suspend" flag down to chipset-specific DISP code

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230918202149.4343-25-skeggsb@gmail.com
drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/ga102.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/tu102.c

index 39f7e7ce9f4a2130f555c3372cb0312adb0b4b7f..7356e20e5770fc61cd0d1629a30eea68791c2632 100644 (file)
@@ -105,7 +105,7 @@ nvkm_disp_fini(struct nvkm_engine *engine, bool suspend)
        struct nvkm_outp *outp;
 
        if (disp->func->fini)
-               disp->func->fini(disp);
+               disp->func->fini(disp, suspend);
 
        list_for_each_entry(outp, &disp->outps, head) {
                if (outp->func->fini)
@@ -208,6 +208,9 @@ nvkm_disp_dtor(struct nvkm_engine *engine)
                nvkm_head_del(&head);
        }
 
+       if (disp->func->dtor)
+               disp->func->dtor(disp);
+
        return data;
 }
 
index efe66ba3c61f8e49c6ce920298e8f884ee194044..d632c09d962e455a6a47f1caaf47b1cf81dd7e2e 100644 (file)
@@ -24,6 +24,7 @@
 #include "head.h"
 #include "ior.h"
 
+#include <subdev/gsp.h>
 #include <subdev/timer.h>
 
 #include <nvif/class.h>
@@ -147,5 +148,8 @@ int
 ga102_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
               struct nvkm_disp **pdisp)
 {
+       if (nvkm_gsp_rm(device->gsp))
+               return -ENODEV;
+
        return nvkm_disp_new_(&ga102_disp, device, type, inst, pdisp);
 }
index b48ead31da30e2617b6a82096f80fd8e59a7f6b3..83a1323600ae788dd917e5e38d8701aeb4150d00 100644 (file)
@@ -1154,7 +1154,7 @@ gf119_disp_intr(struct nvkm_disp *disp)
 }
 
 void
-gf119_disp_fini(struct nvkm_disp *disp)
+gf119_disp_fini(struct nvkm_disp *disp, bool suspend)
 {
        struct nvkm_device *device = disp->engine.subdev.device;
        /* disable all interrupts */
index e1634f7bca56f6b0df1f1320f657614876826d27..9fde83fe2e2f0b1b60b02d9e4adbdb58d34895fb 100644 (file)
@@ -1115,7 +1115,7 @@ gv100_disp_intr(struct nvkm_disp *disp)
 }
 
 void
-gv100_disp_fini(struct nvkm_disp *disp)
+gv100_disp_fini(struct nvkm_disp *disp, bool suspend)
 {
        struct nvkm_device *device = disp->engine.subdev.device;
        nvkm_wr32(device, 0x611db0, 0x00000000);
index 2d05e2f7e46b8f760c28fe9b999a394a756683e8..03a5f88a4b993c45b02de1df3eaea10515ee21d6 100644 (file)
@@ -1504,7 +1504,7 @@ nv50_disp_intr(struct nvkm_disp *disp)
 }
 
 void
-nv50_disp_fini(struct nvkm_disp *disp)
+nv50_disp_fini(struct nvkm_disp *disp, bool suspend)
 {
        struct nvkm_device *device = disp->engine.subdev.device;
        /* disable all interrupts */
index ec5292a8f3c8513782b886aacf60429c84a382a5..13ef71f428b826caf450cd3fae7f15ffa12dbfef 100644 (file)
@@ -15,9 +15,10 @@ int nvkm_disp_new_(const struct nvkm_disp_func *, struct nvkm_device *, enum nvk
 void nvkm_disp_vblank(struct nvkm_disp *, int head);
 
 struct nvkm_disp_func {
+       void (*dtor)(struct nvkm_disp *);
        int (*oneinit)(struct nvkm_disp *);
        int (*init)(struct nvkm_disp *);
-       void (*fini)(struct nvkm_disp *);
+       void (*fini)(struct nvkm_disp *, bool suspend);
        void (*intr)(struct nvkm_disp *);
        void (*intr_error)(struct nvkm_disp *, int chid);
 
@@ -32,7 +33,7 @@ struct nvkm_disp_func {
 
        u16 ramht_size;
 
-       const struct nvkm_sclass root;
+       struct nvkm_sclass root;
 
        struct nvkm_disp_user {
                struct nvkm_sclass base;
@@ -44,7 +45,7 @@ struct nvkm_disp_func {
 
 int nv50_disp_oneinit(struct nvkm_disp *);
 int nv50_disp_init(struct nvkm_disp *);
-void nv50_disp_fini(struct nvkm_disp *);
+void nv50_disp_fini(struct nvkm_disp *, bool suspend);
 void nv50_disp_intr(struct nvkm_disp *);
 extern const struct nvkm_enum nv50_disp_intr_error_type[];
 void nv50_disp_super(struct work_struct *);
@@ -56,12 +57,12 @@ void nv50_disp_super_2_2(struct nvkm_disp *, struct nvkm_head *);
 void nv50_disp_super_3_0(struct nvkm_disp *, struct nvkm_head *);
 
 int gf119_disp_init(struct nvkm_disp *);
-void gf119_disp_fini(struct nvkm_disp *);
+void gf119_disp_fini(struct nvkm_disp *, bool suspend);
 void gf119_disp_intr(struct nvkm_disp *);
 void gf119_disp_super(struct work_struct *);
 void gf119_disp_intr_error(struct nvkm_disp *, int);
 
-void gv100_disp_fini(struct nvkm_disp *);
+void gv100_disp_fini(struct nvkm_disp *, bool suspend);
 void gv100_disp_intr(struct nvkm_disp *);
 void gv100_disp_super(struct work_struct *);
 int gv100_disp_wndw_cnt(struct nvkm_disp *, unsigned long *);
index 19f5d3a6035eb3cc900eb58c7fb33a7c571b2ce2..02b6c9fcb973f90774d5eefb4431b4f82fd58138 100644 (file)
@@ -25,6 +25,7 @@
 #include "ior.h"
 
 #include <core/gpuobj.h>
+#include <subdev/gsp.h>
 #include <subdev/timer.h>
 
 #include <nvif/class.h>
@@ -233,5 +234,8 @@ int
 tu102_disp_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
               struct nvkm_disp **pdisp)
 {
+       if (nvkm_gsp_rm(device->gsp))
+               return -ENODEV;
+
        return nvkm_disp_new_(&tu102_disp, device, type, inst, pdisp);
 }