1b7019ac5SIlia Mirkin /* SPDX-License-Identifier: MIT */
25025407bSBen Skeggs #ifndef __NVKM_OBJECT_H__
35025407bSBen Skeggs #define __NVKM_OBJECT_H__
41f474be9SBen Skeggs #include <core/oclass.h>
5cbea21e2SBen Skeggs struct nvkm_event;
6cbea21e2SBen Skeggs struct nvkm_gpuobj;
7*f43e47c0SBen Skeggs struct nvkm_uevent;
8c39f472eSBen Skeggs 
95025407bSBen Skeggs struct nvkm_object {
10cbea21e2SBen Skeggs 	const struct nvkm_object_func *func;
11cbea21e2SBen Skeggs 	struct nvkm_client *client;
12cbea21e2SBen Skeggs 	struct nvkm_engine *engine;
13fbd58ebdSBen Skeggs 	s32 oclass;
14cbea21e2SBen Skeggs 	u32 handle;
15fbd58ebdSBen Skeggs 
16fbd58ebdSBen Skeggs 	struct list_head head;
17fbd58ebdSBen Skeggs 	struct list_head tree;
18fbd58ebdSBen Skeggs 	u8  route;
19fbd58ebdSBen Skeggs 	u64 token;
20fbd58ebdSBen Skeggs 	u64 object;
21fbd58ebdSBen Skeggs 	struct rb_node node;
22c39f472eSBen Skeggs };
23c39f472eSBen Skeggs 
2401326050SBen Skeggs enum nvkm_object_map {
2501326050SBen Skeggs 	NVKM_OBJECT_MAP_IO,
2601326050SBen Skeggs 	NVKM_OBJECT_MAP_VA
2701326050SBen Skeggs };
2801326050SBen Skeggs 
29cbea21e2SBen Skeggs struct nvkm_object_func {
30cbea21e2SBen Skeggs 	void *(*dtor)(struct nvkm_object *);
31cbea21e2SBen Skeggs 	int (*init)(struct nvkm_object *);
32cbea21e2SBen Skeggs 	int (*fini)(struct nvkm_object *, bool suspend);
33cbea21e2SBen Skeggs 	int (*mthd)(struct nvkm_object *, u32 mthd, void *data, u32 size);
34cbea21e2SBen Skeggs 	int (*ntfy)(struct nvkm_object *, u32 mthd, struct nvkm_event **);
3501326050SBen Skeggs 	int (*map)(struct nvkm_object *, void *argv, u32 argc,
3601326050SBen Skeggs 		   enum nvkm_object_map *, u64 *addr, u64 *size);
378e0042d5SBen Skeggs 	int (*unmap)(struct nvkm_object *);
38cbea21e2SBen Skeggs 	int (*rd08)(struct nvkm_object *, u64 addr, u8 *data);
39cbea21e2SBen Skeggs 	int (*rd16)(struct nvkm_object *, u64 addr, u16 *data);
40cbea21e2SBen Skeggs 	int (*rd32)(struct nvkm_object *, u64 addr, u32 *data);
41cbea21e2SBen Skeggs 	int (*wr08)(struct nvkm_object *, u64 addr, u8 data);
42cbea21e2SBen Skeggs 	int (*wr16)(struct nvkm_object *, u64 addr, u16 data);
43cbea21e2SBen Skeggs 	int (*wr32)(struct nvkm_object *, u64 addr, u32 data);
44cbea21e2SBen Skeggs 	int (*bind)(struct nvkm_object *, struct nvkm_gpuobj *, int align,
45cbea21e2SBen Skeggs 		    struct nvkm_gpuobj **);
46cbea21e2SBen Skeggs 	int (*sclass)(struct nvkm_object *, int index, struct nvkm_oclass *);
47*f43e47c0SBen Skeggs 	int (*uevent)(struct nvkm_object *, void *argv, u32 argc, struct nvkm_uevent *);
48cbea21e2SBen Skeggs };
49cbea21e2SBen Skeggs 
50cbea21e2SBen Skeggs void nvkm_object_ctor(const struct nvkm_object_func *,
51cbea21e2SBen Skeggs 		      const struct nvkm_oclass *, struct nvkm_object *);
52cbea21e2SBen Skeggs int nvkm_object_new_(const struct nvkm_object_func *,
53cbea21e2SBen Skeggs 		     const struct nvkm_oclass *, void *data, u32 size,
54cbea21e2SBen Skeggs 		     struct nvkm_object **);
55cbea21e2SBen Skeggs int nvkm_object_new(const struct nvkm_oclass *, void *data, u32 size,
56cbea21e2SBen Skeggs 		    struct nvkm_object **);
57fbd58ebdSBen Skeggs void nvkm_object_del(struct nvkm_object **);
58fbd58ebdSBen Skeggs void *nvkm_object_dtor(struct nvkm_object *);
59cbea21e2SBen Skeggs int nvkm_object_init(struct nvkm_object *);
60cbea21e2SBen Skeggs int nvkm_object_fini(struct nvkm_object *, bool suspend);
61cbea21e2SBen Skeggs int nvkm_object_mthd(struct nvkm_object *, u32 mthd, void *data, u32 size);
62cbea21e2SBen Skeggs int nvkm_object_ntfy(struct nvkm_object *, u32 mthd, struct nvkm_event **);
6301326050SBen Skeggs int nvkm_object_map(struct nvkm_object *, void *argv, u32 argc,
6401326050SBen Skeggs 		    enum nvkm_object_map *, u64 *addr, u64 *size);
658e0042d5SBen Skeggs int nvkm_object_unmap(struct nvkm_object *);
66cfdc4c44SBen Skeggs int nvkm_object_rd08(struct nvkm_object *, u64 addr, u8  *data);
67cfdc4c44SBen Skeggs int nvkm_object_rd16(struct nvkm_object *, u64 addr, u16 *data);
68cfdc4c44SBen Skeggs int nvkm_object_rd32(struct nvkm_object *, u64 addr, u32 *data);
69cfdc4c44SBen Skeggs int nvkm_object_wr08(struct nvkm_object *, u64 addr, u8   data);
70cfdc4c44SBen Skeggs int nvkm_object_wr16(struct nvkm_object *, u64 addr, u16  data);
71cfdc4c44SBen Skeggs int nvkm_object_wr32(struct nvkm_object *, u64 addr, u32  data);
72cbea21e2SBen Skeggs int nvkm_object_bind(struct nvkm_object *, struct nvkm_gpuobj *, int align,
73cbea21e2SBen Skeggs 		     struct nvkm_gpuobj **);
74cfdc4c44SBen Skeggs 
75110cccffSBen Skeggs bool nvkm_object_insert(struct nvkm_object *);
76110cccffSBen Skeggs void nvkm_object_remove(struct nvkm_object *);
77110cccffSBen Skeggs struct nvkm_object *nvkm_object_search(struct nvkm_client *, u64 object,
78110cccffSBen Skeggs 				       const struct nvkm_object_func *);
79c39f472eSBen Skeggs #endif
80