]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nouveau: add a third state to the fini handler.
authorDave Airlie <airlied@redhat.com>
Tue, 3 Feb 2026 05:21:12 +0000 (15:21 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 4 Feb 2026 02:17:43 +0000 (12:17 +1000)
This is just refactoring to allow the lower layers to distinguish
between suspend and runtime suspend.

GSP 570 needs to set a flag with the GPU is going into GCOFF,
this flag taken from the opengpu driver is set whenever runtime
suspend is enterning GCOFF but not for normal suspend paths.

This just refactors the code, a subsequent patch use the information.

Fixes: 53dac0623853 ("drm/nouveau/gsp: add support for 570.144")
Cc: <stable@vger.kernel.org>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Tested-by: Lyude Paul <lyude@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Link: https://patch.msgid.link/20260203052431.2219998-3-airlied@gmail.com
56 files changed:
drivers/gpu/drm/nouveau/include/nvif/client.h
drivers/gpu/drm/nouveau/include/nvif/driver.h
drivers/gpu/drm/nouveau/include/nvkm/core/device.h
drivers/gpu/drm/nouveau/include/nvkm/core/engine.h
drivers/gpu/drm/nouveau/include/nvkm/core/object.h
drivers/gpu/drm/nouveau/include/nvkm/core/oproxy.h
drivers/gpu/drm/nouveau/include/nvkm/core/subdev.h
drivers/gpu/drm/nouveau/include/nvkm/core/suspend_state.h [new file with mode: 0644]
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/nouveau/nouveau_nvif.c
drivers/gpu/drm/nouveau/nvif/client.c
drivers/gpu/drm/nouveau/nvkm/core/engine.c
drivers/gpu/drm/nouveau/nvkm/core/ioctl.c
drivers/gpu/drm/nouveau/nvkm/core/object.c
drivers/gpu/drm/nouveau/nvkm/core/oproxy.c
drivers/gpu/drm/nouveau/nvkm/core/subdev.c
drivers/gpu/drm/nouveau/nvkm/core/uevent.c
drivers/gpu/drm/nouveau/nvkm/engine/ce/ga100.c
drivers/gpu/drm/nouveau/nvkm/engine/ce/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
drivers/gpu/drm/nouveau/nvkm/engine/device/pci.c
drivers/gpu/drm/nouveau/nvkm/engine/device/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/device/user.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/base.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/chan.c
drivers/gpu/drm/nouveau/nvkm/engine/falcon.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/uchan.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/base.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv04.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv10.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.c
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv44.c
drivers/gpu/drm/nouveau/nvkm/engine/sec2/base.c
drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c
drivers/gpu/drm/nouveau/nvkm/subdev/acr/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/clk/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/fault/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/fault/user.c
drivers/gpu/drm/nouveau/nvkm/subdev/gpio/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/gh100.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/tu102.c
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c

index 03f1d564eb124df6b89f2c7acfb7cc10190ca177..b698c74306f8fe162238419e16f2b62301c6c1c8 100644 (file)
@@ -11,7 +11,7 @@ struct nvif_client {
 
 int  nvif_client_ctor(struct nvif_client *parent, const char *name, struct nvif_client *);
 void nvif_client_dtor(struct nvif_client *);
-int  nvif_client_suspend(struct nvif_client *);
+int  nvif_client_suspend(struct nvif_client *, bool);
 int  nvif_client_resume(struct nvif_client *);
 
 /*XXX*/
index 7b08ff769039a3f6e65889761335c1955673fb34..61c8a177b28fdc000348449dae52bc4a776ccc8c 100644 (file)
@@ -8,7 +8,7 @@ struct nvif_driver {
        const char *name;
        int (*init)(const char *name, u64 device, const char *cfg,
                    const char *dbg, void **priv);
-       int (*suspend)(void *priv);
+       int (*suspend)(void *priv, bool runtime);
        int (*resume)(void *priv);
        int (*ioctl)(void *priv, void *data, u32 size, void **hack);
        void __iomem *(*map)(void *priv, u64 handle, u32 size);
index 99579e7b937605c7d5273740edff79c12e7a9367..954a89d43bada14cc90f0c6349f28803d11ae0f4 100644 (file)
@@ -2,6 +2,7 @@
 #ifndef __NVKM_DEVICE_H__
 #define __NVKM_DEVICE_H__
 #include <core/oclass.h>
+#include <core/suspend_state.h>
 #include <core/intr.h>
 enum nvkm_subdev_type;
 
@@ -93,7 +94,7 @@ struct nvkm_device_func {
        void *(*dtor)(struct nvkm_device *);
        int (*preinit)(struct nvkm_device *);
        int (*init)(struct nvkm_device *);
-       void (*fini)(struct nvkm_device *, bool suspend);
+       void (*fini)(struct nvkm_device *, enum nvkm_suspend_state suspend);
        int (*irq)(struct nvkm_device *);
        resource_size_t (*resource_addr)(struct nvkm_device *, enum nvkm_bar_id);
        resource_size_t (*resource_size)(struct nvkm_device *, enum nvkm_bar_id);
index 738899fcf30b6a206f10b20b9be016e4952173e4..1e97be6c65644eea885253b3dc1a377529f65700 100644 (file)
@@ -20,7 +20,7 @@ struct nvkm_engine_func {
        int (*oneinit)(struct nvkm_engine *);
        int (*info)(struct nvkm_engine *, u64 mthd, u64 *data);
        int (*init)(struct nvkm_engine *);
-       int (*fini)(struct nvkm_engine *, bool suspend);
+       int (*fini)(struct nvkm_engine *, enum nvkm_suspend_state suspend);
        int (*reset)(struct nvkm_engine *);
        int (*nonstall)(struct nvkm_engine *);
        void (*intr)(struct nvkm_engine *);
index 10107ef3ca49ef3c13fff306b2dc5f4e9f8400ce..54d356154274f9c60fa626724668af703a0ababd 100644 (file)
@@ -2,6 +2,7 @@
 #ifndef __NVKM_OBJECT_H__
 #define __NVKM_OBJECT_H__
 #include <core/oclass.h>
+#include <core/suspend_state.h>
 struct nvkm_event;
 struct nvkm_gpuobj;
 struct nvkm_uevent;
@@ -27,7 +28,7 @@ enum nvkm_object_map {
 struct nvkm_object_func {
        void *(*dtor)(struct nvkm_object *);
        int (*init)(struct nvkm_object *);
-       int (*fini)(struct nvkm_object *, bool suspend);
+       int (*fini)(struct nvkm_object *, enum nvkm_suspend_state suspend);
        int (*mthd)(struct nvkm_object *, u32 mthd, void *data, u32 size);
        int (*ntfy)(struct nvkm_object *, u32 mthd, struct nvkm_event **);
        int (*map)(struct nvkm_object *, void *argv, u32 argc,
@@ -49,7 +50,7 @@ int nvkm_object_new(const struct nvkm_oclass *, void *data, u32 size,
 void nvkm_object_del(struct nvkm_object **);
 void *nvkm_object_dtor(struct nvkm_object *);
 int nvkm_object_init(struct nvkm_object *);
-int nvkm_object_fini(struct nvkm_object *, bool suspend);
+int nvkm_object_fini(struct nvkm_object *, enum nvkm_suspend_state);
 int nvkm_object_mthd(struct nvkm_object *, u32 mthd, void *data, u32 size);
 int nvkm_object_ntfy(struct nvkm_object *, u32 mthd, struct nvkm_event **);
 int nvkm_object_map(struct nvkm_object *, void *argv, u32 argc,
index 0e70a9afba33d4566ca0555ae53fc3035ee6e60c..cf66aee4d111d224deea8310a1811ec863ba2dfe 100644 (file)
@@ -13,7 +13,7 @@ struct nvkm_oproxy {
 struct nvkm_oproxy_func {
        void (*dtor[2])(struct nvkm_oproxy *);
        int  (*init[2])(struct nvkm_oproxy *);
-       int  (*fini[2])(struct nvkm_oproxy *, bool suspend);
+       int  (*fini[2])(struct nvkm_oproxy *, enum nvkm_suspend_state suspend);
 };
 
 void nvkm_oproxy_ctor(const struct nvkm_oproxy_func *,
index bce6e1ba09ea048f8416abff99888001bfd3bc95..bd6b1b658e40f3e31d4fc370326473a080436231 100644 (file)
@@ -40,7 +40,7 @@ struct nvkm_subdev_func {
        int (*oneinit)(struct nvkm_subdev *);
        int (*info)(struct nvkm_subdev *, u64 mthd, u64 *data);
        int (*init)(struct nvkm_subdev *);
-       int (*fini)(struct nvkm_subdev *, bool suspend);
+       int (*fini)(struct nvkm_subdev *, enum nvkm_suspend_state suspend);
        void (*intr)(struct nvkm_subdev *);
 };
 
@@ -65,7 +65,7 @@ void nvkm_subdev_unref(struct nvkm_subdev *);
 int  nvkm_subdev_preinit(struct nvkm_subdev *);
 int  nvkm_subdev_oneinit(struct nvkm_subdev *);
 int  nvkm_subdev_init(struct nvkm_subdev *);
-int  nvkm_subdev_fini(struct nvkm_subdev *, bool suspend);
+int  nvkm_subdev_fini(struct nvkm_subdev *, enum nvkm_suspend_state suspend);
 int  nvkm_subdev_info(struct nvkm_subdev *, u64, u64 *);
 void nvkm_subdev_intr(struct nvkm_subdev *);
 
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/core/suspend_state.h b/drivers/gpu/drm/nouveau/include/nvkm/core/suspend_state.h
new file mode 100644 (file)
index 0000000..134120f
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: MIT */
+#ifndef __NVKM_SUSPEND_STATE_H__
+#define __NVKM_SUSPEND_STATE_H__
+
+enum nvkm_suspend_state {
+       NVKM_POWEROFF,
+       NVKM_SUSPEND,
+       NVKM_RUNTIME_SUSPEND,
+};
+
+#endif
index 1527b801f013aacf82af96382c4be9320a595d50..dc469e571c0aa41fdbf590520dd58f1f3b86711d 100644 (file)
@@ -983,7 +983,7 @@ nouveau_do_suspend(struct nouveau_drm *drm, bool runtime)
        }
 
        NV_DEBUG(drm, "suspending object tree...\n");
-       ret = nvif_client_suspend(&drm->_client);
+       ret = nvif_client_suspend(&drm->_client, runtime);
        if (ret)
                goto fail_client;
 
index adb802421fda588855cf8cb312c3dcfc09716f2d..eeb4ebbc16bf6ae2345a9e715a37eea0700e3283 100644 (file)
@@ -62,10 +62,16 @@ nvkm_client_resume(void *priv)
 }
 
 static int
-nvkm_client_suspend(void *priv)
+nvkm_client_suspend(void *priv, bool runtime)
 {
        struct nvkm_client *client = priv;
-       return nvkm_object_fini(&client->object, true);
+       enum nvkm_suspend_state state;
+
+       if (runtime)
+               state = NVKM_RUNTIME_SUSPEND;
+       else
+               state = NVKM_SUSPEND;
+       return nvkm_object_fini(&client->object, state);
 }
 
 static int
index fdf5054ed7d83ca93bd94781ccb17120ca4ed38a..36d3c99786bd5ce7fb19d1b61fc26f870ae79dc6 100644 (file)
@@ -30,9 +30,9 @@
 #include <nvif/if0000.h>
 
 int
-nvif_client_suspend(struct nvif_client *client)
+nvif_client_suspend(struct nvif_client *client, bool runtime)
 {
-       return client->driver->suspend(client->object.priv);
+       return client->driver->suspend(client->object.priv, runtime);
 }
 
 int
index 36a31e9eea228eaec5269431daedd697c96cb50f..5bf62940d7be1e6d20e20d16a897e6535c30cace 100644 (file)
@@ -41,7 +41,7 @@ nvkm_engine_reset(struct nvkm_engine *engine)
        if (engine->func->reset)
                return engine->func->reset(engine);
 
-       nvkm_subdev_fini(&engine->subdev, false);
+       nvkm_subdev_fini(&engine->subdev, NVKM_POWEROFF);
        return nvkm_subdev_init(&engine->subdev);
 }
 
@@ -98,7 +98,7 @@ nvkm_engine_info(struct nvkm_subdev *subdev, u64 mthd, u64 *data)
 }
 
 static int
-nvkm_engine_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_engine_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_engine *engine = nvkm_engine(subdev);
        if (engine->func->fini)
index 45051a1249dacaa7c5fdff59c530730093711751..b8fc9be678515fb798d88f0ae692240220684714 100644 (file)
@@ -141,7 +141,7 @@ nvkm_ioctl_new(struct nvkm_client *client,
                        }
                        ret = -EEXIST;
                }
-               nvkm_object_fini(object, false);
+               nvkm_object_fini(object, NVKM_POWEROFF);
        }
 
        nvkm_object_del(&object);
@@ -160,7 +160,7 @@ nvkm_ioctl_del(struct nvkm_client *client,
        nvif_ioctl(object, "delete size %d\n", size);
        if (!(ret = nvif_unvers(ret, &data, &size, args->none))) {
                nvif_ioctl(object, "delete\n");
-               nvkm_object_fini(object, false);
+               nvkm_object_fini(object, NVKM_POWEROFF);
                nvkm_object_del(&object);
        }
 
index 390c265cf8af42ff6cbefe7b9d16a1d069630c04..af9f00f74c2886ef3e0a99e7be6c18b2e63ccf88 100644 (file)
@@ -142,13 +142,25 @@ nvkm_object_bind(struct nvkm_object *object, struct nvkm_gpuobj *gpuobj,
 }
 
 int
-nvkm_object_fini(struct nvkm_object *object, bool suspend)
+nvkm_object_fini(struct nvkm_object *object, enum nvkm_suspend_state suspend)
 {
-       const char *action = suspend ? "suspend" : "fini";
+       const char *action;
        struct nvkm_object *child;
        s64 time;
        int ret;
 
+       switch (suspend) {
+       case NVKM_POWEROFF:
+       default:
+               action = "fini";
+               break;
+       case NVKM_SUSPEND:
+               action = "suspend";
+               break;
+       case NVKM_RUNTIME_SUSPEND:
+               action = "runtime";
+               break;
+       }
        nvif_debug(object, "%s children...\n", action);
        time = ktime_to_us(ktime_get());
        list_for_each_entry_reverse(child, &object->tree, head) {
@@ -212,11 +224,11 @@ nvkm_object_init(struct nvkm_object *object)
 
 fail_child:
        list_for_each_entry_continue_reverse(child, &object->tree, head)
-               nvkm_object_fini(child, false);
+               nvkm_object_fini(child, NVKM_POWEROFF);
 fail:
        nvif_error(object, "init failed with %d\n", ret);
        if (object->func->fini)
-               object->func->fini(object, false);
+               object->func->fini(object, NVKM_POWEROFF);
        return ret;
 }
 
index 5db80d1780f08950d341c9d7bae1537fb88c1739..7c9edf7527686fdc21099cbb7f381bacb457e1e7 100644 (file)
@@ -87,7 +87,7 @@ nvkm_oproxy_uevent(struct nvkm_object *object, void *argv, u32 argc,
 }
 
 static int
-nvkm_oproxy_fini(struct nvkm_object *object, bool suspend)
+nvkm_oproxy_fini(struct nvkm_object *object, enum nvkm_suspend_state suspend)
 {
        struct nvkm_oproxy *oproxy = nvkm_oproxy(object);
        int ret;
index 6c20e827a069a5059ad34a3472b7f97bcd1f8f8e..b7045d1c841586adb8074d4625813a97cd777d89 100644 (file)
@@ -51,12 +51,24 @@ nvkm_subdev_info(struct nvkm_subdev *subdev, u64 mthd, u64 *data)
 }
 
 int
-nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_subdev_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_device *device = subdev->device;
-       const char *action = suspend ? "suspend" : subdev->use.enabled ? "fini" : "reset";
+       const char *action;
        s64 time;
 
+       switch (suspend) {
+       case NVKM_POWEROFF:
+       default:
+               action = subdev->use.enabled ? "fini" : "reset";
+               break;
+       case NVKM_SUSPEND:
+               action = "suspend";
+               break;
+       case NVKM_RUNTIME_SUSPEND:
+               action = "runtime";
+               break;
+       }
        nvkm_trace(subdev, "%s running...\n", action);
        time = ktime_to_us(ktime_get());
 
@@ -186,7 +198,7 @@ void
 nvkm_subdev_unref(struct nvkm_subdev *subdev)
 {
        if (refcount_dec_and_mutex_lock(&subdev->use.refcount, &subdev->use.mutex)) {
-               nvkm_subdev_fini(subdev, false);
+               nvkm_subdev_fini(subdev, NVKM_POWEROFF);
                mutex_unlock(&subdev->use.mutex);
        }
 }
index cc254c390a571989c17565a1f32cced9d5c7f434..46beb6e470ee3607d8cbeecdb91823d92bcb3038 100644 (file)
@@ -73,7 +73,7 @@ nvkm_uevent_mthd(struct nvkm_object *object, u32 mthd, void *argv, u32 argc)
 }
 
 static int
-nvkm_uevent_fini(struct nvkm_object *object, bool suspend)
+nvkm_uevent_fini(struct nvkm_object *object, enum nvkm_suspend_state suspend)
 {
        struct nvkm_uevent *uevent = nvkm_uevent(object);
 
index 1c0c6013870602f935430227ae9367d86dcabe0d..1a3caf69760827c6253f2e87fffd26282277d307 100644 (file)
@@ -46,7 +46,7 @@ ga100_ce_nonstall(struct nvkm_engine *engine)
 }
 
 int
-ga100_ce_fini(struct nvkm_engine *engine, bool suspend)
+ga100_ce_fini(struct nvkm_engine *engine, enum nvkm_suspend_state suspend)
 {
        nvkm_inth_block(&engine->subdev.inth);
        return 0;
index 34fd2657134b81b18b9607417eb5b9a33e7d6f84..f07b458533104333d410caacd14dfbfcd24fb5ad 100644 (file)
@@ -14,7 +14,7 @@ extern const struct nvkm_object_func gv100_ce_cclass;
 
 int ga100_ce_oneinit(struct nvkm_engine *);
 int ga100_ce_init(struct nvkm_engine *);
-int ga100_ce_fini(struct nvkm_engine *, bool);
+int ga100_ce_fini(struct nvkm_engine *, enum nvkm_suspend_state);
 int ga100_ce_nonstall(struct nvkm_engine *);
 
 u32 gb202_ce_grce_mask(struct nvkm_device *);
index 2517b65d8faad9947244707f540eb281ad7652e4..b101e14f841e03798c82d237104481975356c072 100644 (file)
@@ -2936,13 +2936,25 @@ nvkm_device_engine(struct nvkm_device *device, int type, int inst)
 }
 
 int
-nvkm_device_fini(struct nvkm_device *device, bool suspend)
+nvkm_device_fini(struct nvkm_device *device, enum nvkm_suspend_state suspend)
 {
-       const char *action = suspend ? "suspend" : "fini";
+       const char *action;
        struct nvkm_subdev *subdev;
        int ret;
        s64 time;
 
+       switch (suspend) {
+       case NVKM_POWEROFF:
+       default:
+               action = "fini";
+               break;
+       case NVKM_SUSPEND:
+               action = "suspend";
+               break;
+       case NVKM_RUNTIME_SUSPEND:
+               action = "runtime";
+               break;
+       }
        nvdev_trace(device, "%s running...\n", action);
        time = ktime_to_us(ktime_get());
 
@@ -3032,7 +3044,7 @@ nvkm_device_init(struct nvkm_device *device)
        if (ret)
                return ret;
 
-       nvkm_device_fini(device, false);
+       nvkm_device_fini(device, NVKM_POWEROFF);
 
        nvdev_trace(device, "init running...\n");
        time = ktime_to_us(ktime_get());
@@ -3060,9 +3072,9 @@ nvkm_device_init(struct nvkm_device *device)
 
 fail_subdev:
        list_for_each_entry_from(subdev, &device->subdev, head)
-               nvkm_subdev_fini(subdev, false);
+               nvkm_subdev_fini(subdev, NVKM_POWEROFF);
 fail:
-       nvkm_device_fini(device, false);
+       nvkm_device_fini(device, NVKM_POWEROFF);
 
        nvdev_error(device, "init failed with %d\n", ret);
        return ret;
index 8f0261a0d618bf9995b379179743b1df4934b144..4c29b60460d48d6f0a0086b6599fdceb1bacfda6 100644 (file)
@@ -1605,10 +1605,10 @@ nvkm_device_pci_irq(struct nvkm_device *device)
 }
 
 static void
-nvkm_device_pci_fini(struct nvkm_device *device, bool suspend)
+nvkm_device_pci_fini(struct nvkm_device *device, enum nvkm_suspend_state suspend)
 {
        struct nvkm_device_pci *pdev = nvkm_device_pci(device);
-       if (suspend) {
+       if (suspend != NVKM_POWEROFF) {
                pci_disable_device(pdev->pdev);
                pdev->suspend = true;
        }
index 75ee7506d4432b6c93a9e53b993bed55e788b149..d0c40f0342442d134b281c2c8a526dacbbbcbef0 100644 (file)
@@ -56,5 +56,5 @@ int  nvkm_device_ctor(const struct nvkm_device_func *,
                      const char *name, const char *cfg, const char *dbg,
                      struct nvkm_device *);
 int  nvkm_device_init(struct nvkm_device *);
-int  nvkm_device_fini(struct nvkm_device *, bool suspend);
+int  nvkm_device_fini(struct nvkm_device *, enum nvkm_suspend_state suspend);
 #endif
index 58191b7a0494efbfbfcbb5b3cbaba360132a9477..32ff3181f47b679110eb5e70c60c3649f5cbc5e2 100644 (file)
@@ -218,7 +218,7 @@ nvkm_udevice_map(struct nvkm_object *object, void *argv, u32 argc,
 }
 
 static int
-nvkm_udevice_fini(struct nvkm_object *object, bool suspend)
+nvkm_udevice_fini(struct nvkm_object *object, enum nvkm_suspend_state suspend)
 {
        struct nvkm_udevice *udev = nvkm_udevice(object);
        struct nvkm_device *device = udev->device;
index b24eb1e560bc7c7935392c747cab4eec0e31c739..84745f60912e0b2ead733f1a5c230eb646275687 100644 (file)
@@ -99,13 +99,13 @@ nvkm_disp_intr(struct nvkm_engine *engine)
 }
 
 static int
-nvkm_disp_fini(struct nvkm_engine *engine, bool suspend)
+nvkm_disp_fini(struct nvkm_engine *engine, enum nvkm_suspend_state suspend)
 {
        struct nvkm_disp *disp = nvkm_disp(engine);
        struct nvkm_outp *outp;
 
        if (disp->func->fini)
-               disp->func->fini(disp, suspend);
+               disp->func->fini(disp, suspend != NVKM_POWEROFF);
 
        list_for_each_entry(outp, &disp->outps, head) {
                if (outp->func->fini)
index 9b84e357d3544ed5cc5c4d3b3260f85d07cd0323..57a62a2de7c7daadc5562d38bc9004abee946bac 100644 (file)
@@ -128,7 +128,7 @@ nvkm_disp_chan_child_get(struct nvkm_object *object, int index, struct nvkm_ocla
 }
 
 static int
-nvkm_disp_chan_fini(struct nvkm_object *object, bool suspend)
+nvkm_disp_chan_fini(struct nvkm_object *object, enum nvkm_suspend_state suspend)
 {
        struct nvkm_disp_chan *chan = nvkm_disp_chan(object);
 
index fd5ee9f0af360c93b117ef1c4affe7ac8b55ba48..cf8e356867b4fcc1fc2b8285e26d75235e6d2a0a 100644 (file)
@@ -93,13 +93,13 @@ nvkm_falcon_intr(struct nvkm_engine *engine)
 }
 
 static int
-nvkm_falcon_fini(struct nvkm_engine *engine, bool suspend)
+nvkm_falcon_fini(struct nvkm_engine *engine, enum nvkm_suspend_state suspend)
 {
        struct nvkm_falcon *falcon = nvkm_falcon(engine);
        struct nvkm_device *device = falcon->engine.subdev.device;
        const u32 base = falcon->addr;
 
-       if (!suspend) {
+       if (suspend == NVKM_POWEROFF) {
                nvkm_memory_unref(&falcon->core);
                if (falcon->external) {
                        vfree(falcon->data.data);
index 6fd4e60634fbe407572826d843f0a20775defa00..1561287a32f208612a68b703174d35a07492bb8a 100644 (file)
@@ -122,7 +122,7 @@ nvkm_fifo_class_get(struct nvkm_oclass *oclass, int index, const struct nvkm_dev
 }
 
 static int
-nvkm_fifo_fini(struct nvkm_engine *engine, bool suspend)
+nvkm_fifo_fini(struct nvkm_engine *engine, enum nvkm_suspend_state suspend)
 {
        struct nvkm_fifo *fifo = nvkm_fifo(engine);
        struct nvkm_runl *runl;
index 52420a1edca52ab283acbad32c799cbc04136e6b..c978b97e10c64aacd0eb47855c043757484e9ec5 100644 (file)
@@ -72,7 +72,7 @@ struct nvkm_uobj {
 };
 
 static int
-nvkm_uchan_object_fini_1(struct nvkm_oproxy *oproxy, bool suspend)
+nvkm_uchan_object_fini_1(struct nvkm_oproxy *oproxy, enum nvkm_suspend_state suspend)
 {
        struct nvkm_uobj *uobj = container_of(oproxy, typeof(*uobj), oproxy);
        struct nvkm_chan *chan = uobj->chan;
@@ -87,7 +87,7 @@ nvkm_uchan_object_fini_1(struct nvkm_oproxy *oproxy, bool suspend)
                nvkm_chan_cctx_bind(chan, ectx->engn, NULL);
 
                if (refcount_dec_and_test(&ectx->uses))
-                       nvkm_object_fini(ectx->object, false);
+                       nvkm_object_fini(ectx->object, NVKM_POWEROFF);
                mutex_unlock(&chan->cgrp->mutex);
        }
 
@@ -269,7 +269,7 @@ nvkm_uchan_map(struct nvkm_object *object, void *argv, u32 argc,
 }
 
 static int
-nvkm_uchan_fini(struct nvkm_object *object, bool suspend)
+nvkm_uchan_fini(struct nvkm_object *object, enum nvkm_suspend_state suspend)
 {
        struct nvkm_chan *chan = nvkm_uchan(object)->chan;
 
index f5e68f09df768d4486fb1909e40e8a2dcdf1024d..cd4908b1b4dfff9dc7c1a58c0248c9af9e21795c 100644 (file)
@@ -168,11 +168,11 @@ nvkm_gr_init(struct nvkm_engine *engine)
 }
 
 static int
-nvkm_gr_fini(struct nvkm_engine *engine, bool suspend)
+nvkm_gr_fini(struct nvkm_engine *engine, enum nvkm_suspend_state suspend)
 {
        struct nvkm_gr *gr = nvkm_gr(engine);
        if (gr->func->fini)
-               return gr->func->fini(gr, suspend);
+               return gr->func->fini(gr, suspend != NVKM_POWEROFF);
        return 0;
 }
 
index 3ea447f6a45b51b9097ee26e506b36b5d57c89ba..3608215f0f11c8ad35221d9311bdda82589c3f7e 100644 (file)
@@ -2330,7 +2330,7 @@ gf100_gr_reset(struct nvkm_gr *base)
 
        WARN_ON(gf100_gr_fecs_halt_pipeline(gr));
 
-       subdev->func->fini(subdev, false);
+       subdev->func->fini(subdev, NVKM_POWEROFF);
        nvkm_mc_disable(device, subdev->type, subdev->inst);
        if (gr->func->gpccs.reset)
                gr->func->gpccs.reset(gr);
index ca822f07b63e9ef41276b68fd1f95c66e38acfc6..82937df8b8c0d276aa26c7bf0c77bd3963f4eac2 100644 (file)
@@ -1158,7 +1158,7 @@ nv04_gr_chan_dtor(struct nvkm_object *object)
 }
 
 static int
-nv04_gr_chan_fini(struct nvkm_object *object, bool suspend)
+nv04_gr_chan_fini(struct nvkm_object *object, enum nvkm_suspend_state suspend)
 {
        struct nv04_gr_chan *chan = nv04_gr_chan(object);
        struct nv04_gr *gr = chan->gr;
index 92ef7c9b29101cc726e0a6b4dee5b71019f0d778..fcb4e4fce83f7abe51e6d4fbdbeed5f345ee19a5 100644 (file)
@@ -951,7 +951,7 @@ nv10_gr_context_switch(struct nv10_gr *gr)
 }
 
 static int
-nv10_gr_chan_fini(struct nvkm_object *object, bool suspend)
+nv10_gr_chan_fini(struct nvkm_object *object, enum nvkm_suspend_state suspend)
 {
        struct nv10_gr_chan *chan = nv10_gr_chan(object);
        struct nv10_gr *gr = chan->gr;
index 13407fafe94797e2d3d0f45d865512c5099268c4..ab57b3b40228e89e05c74aa6dba0b041247689ba 100644 (file)
@@ -27,7 +27,7 @@ nv20_gr_chan_init(struct nvkm_object *object)
 }
 
 int
-nv20_gr_chan_fini(struct nvkm_object *object, bool suspend)
+nv20_gr_chan_fini(struct nvkm_object *object, enum nvkm_suspend_state suspend)
 {
        struct nv20_gr_chan *chan = nv20_gr_chan(object);
        struct nv20_gr *gr = chan->gr;
index c0d2be53413e0dbdde1c2c88d6fba624c4af3ac2..786c7832f7acdbf21785e84e0c2668a257238a99 100644 (file)
@@ -31,5 +31,5 @@ struct nv20_gr_chan {
 
 void *nv20_gr_chan_dtor(struct nvkm_object *);
 int nv20_gr_chan_init(struct nvkm_object *);
-int nv20_gr_chan_fini(struct nvkm_object *, bool);
+int nv20_gr_chan_fini(struct nvkm_object *, enum nvkm_suspend_state);
 #endif
index b609b0150ba14002340fc9d79327296154815cd0..e3e797cf30349e0d2145b97372bf673a2d1c80b5 100644 (file)
@@ -89,7 +89,7 @@ nv40_gr_chan_bind(struct nvkm_object *object, struct nvkm_gpuobj *parent,
 }
 
 static int
-nv40_gr_chan_fini(struct nvkm_object *object, bool suspend)
+nv40_gr_chan_fini(struct nvkm_object *object, enum nvkm_suspend_state suspend)
 {
        struct nv40_gr_chan *chan = nv40_gr_chan(object);
        struct nv40_gr *gr = chan->gr;
@@ -101,7 +101,7 @@ nv40_gr_chan_fini(struct nvkm_object *object, bool suspend)
        nvkm_mask(device, 0x400720, 0x00000001, 0x00000000);
 
        if (nvkm_rd32(device, 0x40032c) == inst) {
-               if (suspend) {
+               if (suspend != NVKM_POWEROFF) {
                        nvkm_wr32(device, 0x400720, 0x00000000);
                        nvkm_wr32(device, 0x400784, inst);
                        nvkm_mask(device, 0x400310, 0x00000020, 0x00000020);
index 4b1374adbda3a1dc61a1b3514fda6a38ec361d22..38146f9cc81c4e472d89a3bb018c4f029445cd7d 100644 (file)
@@ -65,7 +65,7 @@ nv44_mpeg_chan_bind(struct nvkm_object *object, struct nvkm_gpuobj *parent,
 }
 
 static int
-nv44_mpeg_chan_fini(struct nvkm_object *object, bool suspend)
+nv44_mpeg_chan_fini(struct nvkm_object *object, enum nvkm_suspend_state suspend)
 {
 
        struct nv44_mpeg_chan *chan = nv44_mpeg_chan(object);
index f2c60da5d1e86fc32f40d41b8f303585b6c51516..3e4d6a680ee954ea09e42a309596302170710b42 100644 (file)
@@ -37,7 +37,7 @@ nvkm_sec2_finimsg(void *priv, struct nvfw_falcon_msg *hdr)
 }
 
 static int
-nvkm_sec2_fini(struct nvkm_engine *engine, bool suspend)
+nvkm_sec2_fini(struct nvkm_engine *engine, enum nvkm_suspend_state suspend)
 {
        struct nvkm_sec2 *sec2 = nvkm_sec2(engine);
        struct nvkm_subdev *subdev = &sec2->engine.subdev;
index f7d3ba0afb556495979eced21bb8137bd6dbe737..910a5bb2d191dbcc58372eec2ab0d09557bf6226 100644 (file)
@@ -76,7 +76,7 @@ nvkm_xtensa_intr(struct nvkm_engine *engine)
 }
 
 static int
-nvkm_xtensa_fini(struct nvkm_engine *engine, bool suspend)
+nvkm_xtensa_fini(struct nvkm_engine *engine, enum nvkm_suspend_state suspend)
 {
        struct nvkm_xtensa *xtensa = nvkm_xtensa(engine);
        struct nvkm_device *device = xtensa->engine.subdev.device;
@@ -85,7 +85,7 @@ nvkm_xtensa_fini(struct nvkm_engine *engine, bool suspend)
        nvkm_wr32(device, base + 0xd84, 0); /* INTR_EN */
        nvkm_wr32(device, base + 0xd94, 0); /* FIFO_CTRL */
 
-       if (!suspend)
+       if (suspend == NVKM_POWEROFF)
                nvkm_memory_unref(&xtensa->gpu_fw);
        return 0;
 }
index 9b8ca4e898f903661eb588843698ca11e0d7c200..13d829593180c6956928f28c386dbce7d2ce0cf4 100644 (file)
@@ -182,7 +182,7 @@ nvkm_acr_managed_falcon(struct nvkm_device *device, enum nvkm_acr_lsf_id id)
 }
 
 static int
-nvkm_acr_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_acr_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        if (!subdev->use.enabled)
                return 0;
index 91bc53be97ffc228c243e675c039b8c53bdb8aab..7dee55bf9ada9e8e3c523cfbb25de0a3bd0e3071 100644 (file)
@@ -90,7 +90,7 @@ nvkm_bar_bar2_init(struct nvkm_device *device)
 }
 
 static int
-nvkm_bar_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_bar_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_bar *bar = nvkm_bar(subdev);
 
index 178dc56909c2742fcf824323752307d6b74ef318..71420f81714b35f4109a50e0f85ee9575a85fa01 100644 (file)
@@ -577,7 +577,7 @@ nvkm_clk_read(struct nvkm_clk *clk, enum nv_clk_src src)
 }
 
 static int
-nvkm_clk_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_clk_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_clk *clk = nvkm_clk(subdev);
        flush_work(&clk->work);
index 3d9319c319c647febcd24aa903306ddbfe7d91a1..ad5ec9ee1294dbd0da67bdbd82a797480c648cc3 100644 (file)
@@ -67,11 +67,11 @@ nvkm_devinit_post(struct nvkm_devinit *init)
 }
 
 static int
-nvkm_devinit_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_devinit_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_devinit *init = nvkm_devinit(subdev);
        /* force full reinit on resume */
-       if (suspend)
+       if (suspend != NVKM_POWEROFF)
                init->post = true;
        return 0;
 }
index b53ac9a2552fa76c26127e97a9f88a202ecbf8cf..d8d32bb5bcd9e70738543493cdef7dc76cbab95c 100644 (file)
@@ -51,7 +51,7 @@ nvkm_fault_intr(struct nvkm_subdev *subdev)
 }
 
 static int
-nvkm_fault_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_fault_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_fault *fault = nvkm_fault(subdev);
        if (fault->func->fini)
index cd2fbc0472d8e7ad2cccb3ca741318b6d152bce7..8ab052d18e5d36eead18d7946e967f25226b5588 100644 (file)
@@ -56,7 +56,7 @@ nvkm_ufault_map(struct nvkm_object *object, void *argv, u32 argc,
 }
 
 static int
-nvkm_ufault_fini(struct nvkm_object *object, bool suspend)
+nvkm_ufault_fini(struct nvkm_object *object, enum nvkm_suspend_state suspend)
 {
        struct nvkm_fault_buffer *buffer = nvkm_fault_buffer(object);
        buffer->fault->func->buffer.fini(buffer);
index b196baa376dcdb008a1a6a5f6ec0f2674d9688d3..b2c34878a68f6396b9f5efd79453ccdcea5ee4bc 100644 (file)
@@ -144,7 +144,7 @@ nvkm_gpio_intr(struct nvkm_subdev *subdev)
 }
 
 static int
-nvkm_gpio_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_gpio_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_gpio *gpio = nvkm_gpio(subdev);
        u32 mask = (1ULL << gpio->func->lines) - 1;
index 7ccb4176106653e5068a584bee32d6b9dfcecf97..30cb843ba35cdd2259f2b819fb442e72810d6338 100644 (file)
@@ -48,7 +48,7 @@ nvkm_gsp_intr_stall(struct nvkm_gsp *gsp, enum nvkm_subdev_type type, int inst)
 }
 
 static int
-nvkm_gsp_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_gsp_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_gsp *gsp = nvkm_gsp(subdev);
 
index b0dd5fce7bad369aaca94371dd9a83503a0e3301..88436a264177994ee27be3ff126b20ecef885283 100644 (file)
@@ -17,7 +17,7 @@
 #include <nvhw/ref/gh100/dev_riscv_pri.h>
 
 int
-gh100_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
+gh100_gsp_fini(struct nvkm_gsp *gsp, enum nvkm_suspend_state suspend)
 {
        struct nvkm_falcon *falcon = &gsp->falcon;
        int ret, time = 4000;
index 9dd66a2e38017b5a6af1ecf76f8c32a16abf0192..71b7203bef5073f820979fa067396fa9604fb3bf 100644 (file)
@@ -59,7 +59,7 @@ struct nvkm_gsp_func {
        void (*dtor)(struct nvkm_gsp *);
        int (*oneinit)(struct nvkm_gsp *);
        int (*init)(struct nvkm_gsp *);
-       int (*fini)(struct nvkm_gsp *, bool suspend);
+       int (*fini)(struct nvkm_gsp *, enum nvkm_suspend_state suspend);
        int (*reset)(struct nvkm_gsp *);
 
        struct {
@@ -75,7 +75,7 @@ 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);
+int tu102_gsp_fini(struct nvkm_gsp *, enum nvkm_suspend_state suspend);
 int tu102_gsp_reset(struct nvkm_gsp *);
 u64 tu102_gsp_wpr_heap_size(struct nvkm_gsp *);
 
@@ -87,12 +87,12 @@ int ga102_gsp_reset(struct nvkm_gsp *);
 
 int gh100_gsp_oneinit(struct nvkm_gsp *);
 int gh100_gsp_init(struct nvkm_gsp *);
-int gh100_gsp_fini(struct nvkm_gsp *, bool suspend);
+int gh100_gsp_fini(struct nvkm_gsp *, enum nvkm_suspend_state suspend);
 
 void r535_gsp_dtor(struct nvkm_gsp *);
 int r535_gsp_oneinit(struct nvkm_gsp *);
 int r535_gsp_init(struct nvkm_gsp *);
-int r535_gsp_fini(struct nvkm_gsp *, bool suspend);
+int r535_gsp_fini(struct nvkm_gsp *, enum nvkm_suspend_state suspend);
 
 int nvkm_gsp_new_(const struct nvkm_gsp_fwif *, struct nvkm_device *, enum nvkm_subdev_type, int,
                  struct nvkm_gsp **);
index 6e7af2f737b746716ff9da903b0ac2e58d667dcc..2f028a30e07db23f7f02b3343f599130c1d1da15 100644 (file)
@@ -1721,7 +1721,7 @@ r535_gsp_sr_data_size(struct nvkm_gsp *gsp)
 }
 
 int
-r535_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
+r535_gsp_fini(struct nvkm_gsp *gsp, enum nvkm_suspend_state suspend)
 {
        struct nvkm_rm *rm = gsp->rm;
        int ret;
index 04b642a1f73051228e0160d65e7dd9d41311aad6..19cb269e7a2659c77c6384b4583af966f6c99f90 100644 (file)
@@ -161,7 +161,7 @@ tu102_gsp_reset(struct nvkm_gsp *gsp)
 }
 
 int
-tu102_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
+tu102_gsp_fini(struct nvkm_gsp *gsp, enum nvkm_suspend_state suspend)
 {
        u32 mbox0 = 0xff, mbox1 = 0xff;
        int ret;
index 7ec17e8435a13649fde59c4146b17fc22e6937a8..454bb21815a2720e807677d52ef7164adaa3ccb6 100644 (file)
@@ -135,7 +135,7 @@ nvkm_i2c_intr(struct nvkm_subdev *subdev)
 }
 
 static int
-nvkm_i2c_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_i2c_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_i2c *i2c = nvkm_i2c(subdev);
        struct nvkm_i2c_pad *pad;
index 2f55bab8e132ff626bf100e4120c18e183e0e6ba..6b9ed61684a0273b7ef274511293cd7e9b965d4d 100644 (file)
@@ -176,7 +176,7 @@ nvkm_instmem_boot(struct nvkm_instmem *imem)
 }
 
 static int
-nvkm_instmem_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_instmem_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_instmem *imem = nvkm_instmem(subdev);
        int ret;
index 6867934256a768f58205a948f79222d223d89005..0f3e0d324a529c018f95f7223b65b347887f00cb 100644 (file)
@@ -74,7 +74,7 @@ nvkm_pci_rom_shadow(struct nvkm_pci *pci, bool shadow)
 }
 
 static int
-nvkm_pci_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_pci_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_pci *pci = nvkm_pci(subdev);
 
index 8f2f50ad4ded1f5026c016391b2618e13523c03e..9e9004ec4588b87c1a30acec5933d31e02002cb4 100644 (file)
@@ -77,7 +77,7 @@ nvkm_pmu_intr(struct nvkm_subdev *subdev)
 }
 
 static int
-nvkm_pmu_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_pmu_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_pmu *pmu = nvkm_pmu(subdev);
 
index fc5ee118e91067ff5568e566ada85c77d166c24e..1510aba339560b4d99940332235cd19c80c049e7 100644 (file)
@@ -341,15 +341,15 @@ nvkm_therm_intr(struct nvkm_subdev *subdev)
 }
 
 static int
-nvkm_therm_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_therm_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_therm *therm = nvkm_therm(subdev);
 
        if (therm->func->fini)
                therm->func->fini(therm);
 
-       nvkm_therm_fan_fini(therm, suspend);
-       nvkm_therm_sensor_fini(therm, suspend);
+       nvkm_therm_fan_fini(therm, suspend != NVKM_POWEROFF);
+       nvkm_therm_sensor_fini(therm, suspend != NVKM_POWEROFF);
 
        if (suspend) {
                therm->suspend = therm->mode;
index 8b0da0c062685d7f22e1558937e33255a5469998..a5c3c282b5d077a959bb54868c0363aae7949619 100644 (file)
@@ -149,7 +149,7 @@ nvkm_timer_intr(struct nvkm_subdev *subdev)
 }
 
 static int
-nvkm_timer_fini(struct nvkm_subdev *subdev, bool suspend)
+nvkm_timer_fini(struct nvkm_subdev *subdev, enum nvkm_suspend_state suspend)
 {
        struct nvkm_timer *tmr = nvkm_timer(subdev);
        tmr->func->alarm_fini(tmr);