Skip to content

Commit 8f8a4dc

Browse files
committed
nouveau: add a third state to the fini handler.
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: 53dac06 ("drm/nouveau/gsp: add support for 570.144") Cc: <[email protected]> Reviewed-by: Lyude Paul <[email protected]> Tested-by: Lyude Paul <[email protected]> Signed-off-by: Dave Airlie <[email protected]> Link: https://patch.msgid.link/[email protected]
1 parent 90caca3 commit 8f8a4dc

56 files changed

Lines changed: 139 additions & 84 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

drivers/gpu/drm/nouveau/include/nvif/client.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ struct nvif_client {
1111

1212
int nvif_client_ctor(struct nvif_client *parent, const char *name, struct nvif_client *);
1313
void nvif_client_dtor(struct nvif_client *);
14-
int nvif_client_suspend(struct nvif_client *);
14+
int nvif_client_suspend(struct nvif_client *, bool);
1515
int nvif_client_resume(struct nvif_client *);
1616

1717
/*XXX*/

drivers/gpu/drm/nouveau/include/nvif/driver.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ struct nvif_driver {
88
const char *name;
99
int (*init)(const char *name, u64 device, const char *cfg,
1010
const char *dbg, void **priv);
11-
int (*suspend)(void *priv);
11+
int (*suspend)(void *priv, bool runtime);
1212
int (*resume)(void *priv);
1313
int (*ioctl)(void *priv, void *data, u32 size, void **hack);
1414
void __iomem *(*map)(void *priv, u64 handle, u32 size);

drivers/gpu/drm/nouveau/include/nvkm/core/device.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#ifndef __NVKM_DEVICE_H__
33
#define __NVKM_DEVICE_H__
44
#include <core/oclass.h>
5+
#include <core/suspend_state.h>
56
#include <core/intr.h>
67
enum nvkm_subdev_type;
78

@@ -93,7 +94,7 @@ struct nvkm_device_func {
9394
void *(*dtor)(struct nvkm_device *);
9495
int (*preinit)(struct nvkm_device *);
9596
int (*init)(struct nvkm_device *);
96-
void (*fini)(struct nvkm_device *, bool suspend);
97+
void (*fini)(struct nvkm_device *, enum nvkm_suspend_state suspend);
9798
int (*irq)(struct nvkm_device *);
9899
resource_size_t (*resource_addr)(struct nvkm_device *, enum nvkm_bar_id);
99100
resource_size_t (*resource_size)(struct nvkm_device *, enum nvkm_bar_id);

drivers/gpu/drm/nouveau/include/nvkm/core/engine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ struct nvkm_engine_func {
2020
int (*oneinit)(struct nvkm_engine *);
2121
int (*info)(struct nvkm_engine *, u64 mthd, u64 *data);
2222
int (*init)(struct nvkm_engine *);
23-
int (*fini)(struct nvkm_engine *, bool suspend);
23+
int (*fini)(struct nvkm_engine *, enum nvkm_suspend_state suspend);
2424
int (*reset)(struct nvkm_engine *);
2525
int (*nonstall)(struct nvkm_engine *);
2626
void (*intr)(struct nvkm_engine *);

drivers/gpu/drm/nouveau/include/nvkm/core/object.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#ifndef __NVKM_OBJECT_H__
33
#define __NVKM_OBJECT_H__
44
#include <core/oclass.h>
5+
#include <core/suspend_state.h>
56
struct nvkm_event;
67
struct nvkm_gpuobj;
78
struct nvkm_uevent;
@@ -27,7 +28,7 @@ enum nvkm_object_map {
2728
struct nvkm_object_func {
2829
void *(*dtor)(struct nvkm_object *);
2930
int (*init)(struct nvkm_object *);
30-
int (*fini)(struct nvkm_object *, bool suspend);
31+
int (*fini)(struct nvkm_object *, enum nvkm_suspend_state suspend);
3132
int (*mthd)(struct nvkm_object *, u32 mthd, void *data, u32 size);
3233
int (*ntfy)(struct nvkm_object *, u32 mthd, struct nvkm_event **);
3334
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,
4950
void nvkm_object_del(struct nvkm_object **);
5051
void *nvkm_object_dtor(struct nvkm_object *);
5152
int nvkm_object_init(struct nvkm_object *);
52-
int nvkm_object_fini(struct nvkm_object *, bool suspend);
53+
int nvkm_object_fini(struct nvkm_object *, enum nvkm_suspend_state);
5354
int nvkm_object_mthd(struct nvkm_object *, u32 mthd, void *data, u32 size);
5455
int nvkm_object_ntfy(struct nvkm_object *, u32 mthd, struct nvkm_event **);
5556
int nvkm_object_map(struct nvkm_object *, void *argv, u32 argc,

drivers/gpu/drm/nouveau/include/nvkm/core/oproxy.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ struct nvkm_oproxy {
1313
struct nvkm_oproxy_func {
1414
void (*dtor[2])(struct nvkm_oproxy *);
1515
int (*init[2])(struct nvkm_oproxy *);
16-
int (*fini[2])(struct nvkm_oproxy *, bool suspend);
16+
int (*fini[2])(struct nvkm_oproxy *, enum nvkm_suspend_state suspend);
1717
};
1818

1919
void nvkm_oproxy_ctor(const struct nvkm_oproxy_func *,

drivers/gpu/drm/nouveau/include/nvkm/core/subdev.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ struct nvkm_subdev_func {
4040
int (*oneinit)(struct nvkm_subdev *);
4141
int (*info)(struct nvkm_subdev *, u64 mthd, u64 *data);
4242
int (*init)(struct nvkm_subdev *);
43-
int (*fini)(struct nvkm_subdev *, bool suspend);
43+
int (*fini)(struct nvkm_subdev *, enum nvkm_suspend_state suspend);
4444
void (*intr)(struct nvkm_subdev *);
4545
};
4646

@@ -65,7 +65,7 @@ void nvkm_subdev_unref(struct nvkm_subdev *);
6565
int nvkm_subdev_preinit(struct nvkm_subdev *);
6666
int nvkm_subdev_oneinit(struct nvkm_subdev *);
6767
int nvkm_subdev_init(struct nvkm_subdev *);
68-
int nvkm_subdev_fini(struct nvkm_subdev *, bool suspend);
68+
int nvkm_subdev_fini(struct nvkm_subdev *, enum nvkm_suspend_state suspend);
6969
int nvkm_subdev_info(struct nvkm_subdev *, u64, u64 *);
7070
void nvkm_subdev_intr(struct nvkm_subdev *);
7171

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/* SPDX-License-Identifier: MIT */
2+
#ifndef __NVKM_SUSPEND_STATE_H__
3+
#define __NVKM_SUSPEND_STATE_H__
4+
5+
enum nvkm_suspend_state {
6+
NVKM_POWEROFF,
7+
NVKM_SUSPEND,
8+
NVKM_RUNTIME_SUSPEND,
9+
};
10+
11+
#endif

drivers/gpu/drm/nouveau/nouveau_drm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -983,7 +983,7 @@ nouveau_do_suspend(struct nouveau_drm *drm, bool runtime)
983983
}
984984

985985
NV_DEBUG(drm, "suspending object tree...\n");
986-
ret = nvif_client_suspend(&drm->_client);
986+
ret = nvif_client_suspend(&drm->_client, runtime);
987987
if (ret)
988988
goto fail_client;
989989

drivers/gpu/drm/nouveau/nouveau_nvif.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,16 @@ nvkm_client_resume(void *priv)
6262
}
6363

6464
static int
65-
nvkm_client_suspend(void *priv)
65+
nvkm_client_suspend(void *priv, bool runtime)
6666
{
6767
struct nvkm_client *client = priv;
68-
return nvkm_object_fini(&client->object, true);
68+
enum nvkm_suspend_state state;
69+
70+
if (runtime)
71+
state = NVKM_RUNTIME_SUSPEND;
72+
else
73+
state = NVKM_SUSPEND;
74+
return nvkm_object_fini(&client->object, state);
6975
}
7076

7177
static int

0 commit comments

Comments
 (0)