1 #ifndef __NVKM_OBJECT_H__
2 #define __NVKM_OBJECT_H__
4 #include <core/debug.h>
8 #define NV_PARENT_CLASS 0x80000000
9 #define NV_NAMEDB_CLASS 0x40000000
10 #define NV_CLIENT_CLASS 0x20000000
11 #define NV_SUBDEV_CLASS 0x10000000
12 #define NV_ENGINE_CLASS 0x08000000
13 #define NV_MEMOBJ_CLASS 0x04000000
14 #define NV_GPUOBJ_CLASS 0x02000000
15 #define NV_ENGCTX_CLASS 0x01000000
18 const struct nvkm_object_func *func;
19 struct nvkm_client *client;
20 struct nvkm_engine *engine;
23 struct nvkm_object *parent;
24 struct nvkm_oclass *oclass;
28 #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
29 #define NVKM_OBJECT_MAGIC 0x75ef0bad
30 struct list_head list;
35 struct nvkm_object_func {
36 void *(*dtor)(struct nvkm_object *);
37 int (*init)(struct nvkm_object *);
38 int (*fini)(struct nvkm_object *, bool suspend);
39 int (*mthd)(struct nvkm_object *, u32 mthd, void *data, u32 size);
40 int (*ntfy)(struct nvkm_object *, u32 mthd, struct nvkm_event **);
41 int (*map)(struct nvkm_object *, u64 *addr, u32 *size);
42 int (*rd08)(struct nvkm_object *, u64 addr, u8 *data);
43 int (*rd16)(struct nvkm_object *, u64 addr, u16 *data);
44 int (*rd32)(struct nvkm_object *, u64 addr, u32 *data);
45 int (*wr08)(struct nvkm_object *, u64 addr, u8 data);
46 int (*wr16)(struct nvkm_object *, u64 addr, u16 data);
47 int (*wr32)(struct nvkm_object *, u64 addr, u32 data);
48 int (*bind)(struct nvkm_object *, struct nvkm_gpuobj *, int align,
49 struct nvkm_gpuobj **);
50 int (*sclass)(struct nvkm_object *, int index, struct nvkm_oclass *);
53 void nvkm_object_ctor(const struct nvkm_object_func *,
54 const struct nvkm_oclass *, struct nvkm_object *);
55 int nvkm_object_new_(const struct nvkm_object_func *,
56 const struct nvkm_oclass *, void *data, u32 size,
57 struct nvkm_object **);
58 int nvkm_object_new(const struct nvkm_oclass *, void *data, u32 size,
59 struct nvkm_object **);
60 int nvkm_object_init(struct nvkm_object *);
61 int nvkm_object_fini(struct nvkm_object *, bool suspend);
62 int nvkm_object_mthd(struct nvkm_object *, u32 mthd, void *data, u32 size);
63 int nvkm_object_ntfy(struct nvkm_object *, u32 mthd, struct nvkm_event **);
64 int nvkm_object_map(struct nvkm_object *, u64 *addr, u32 *size);
65 int nvkm_object_rd08(struct nvkm_object *, u64 addr, u8 *data);
66 int nvkm_object_rd16(struct nvkm_object *, u64 addr, u16 *data);
67 int nvkm_object_rd32(struct nvkm_object *, u64 addr, u32 *data);
68 int nvkm_object_wr08(struct nvkm_object *, u64 addr, u8 data);
69 int nvkm_object_wr16(struct nvkm_object *, u64 addr, u16 data);
70 int nvkm_object_wr32(struct nvkm_object *, u64 addr, u32 data);
71 int nvkm_object_bind(struct nvkm_object *, struct nvkm_gpuobj *, int align,
72 struct nvkm_gpuobj **);
74 static inline struct nvkm_object *
77 #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
79 struct nvkm_object *object = obj;
80 BUG_ON(object->_magic != NVKM_OBJECT_MAGIC);
86 #define nvkm_object_create(p,e,c,s,d) \
87 nvkm_object_create_((p), (e), (c), (s), sizeof(**d), (void **)d)
88 int nvkm_object_create_(struct nvkm_object *, struct nvkm_object *,
89 struct nvkm_oclass *, u32, int size, void **);
90 void nvkm_object_destroy(struct nvkm_object *);
91 int _nvkm_object_init(struct nvkm_object *);
92 int _nvkm_object_fini(struct nvkm_object *, bool suspend);
94 int _nvkm_object_ctor(struct nvkm_object *, struct nvkm_object *,
95 struct nvkm_oclass *, void *, u32,
96 struct nvkm_object **);
98 extern struct nvkm_ofuncs nvkm_object_ofuncs;
104 const struct nvkm_object_func *func;
105 int (*ctor)(const struct nvkm_oclass *, void *data, u32 size,
106 struct nvkm_object **);
111 struct nvkm_ofuncs * const ofuncs;
112 struct nvkm_omthds * const omthds;
114 int (*ctor)(const struct nvkm_oclass *, void *data, u32 size,
115 struct nvkm_object **);
116 struct nvkm_sclass base;
120 struct nvkm_client *client;
121 struct nvkm_object *parent;
122 struct nvkm_engine *engine;
125 #define nv_oclass(o) nv_object(o)->oclass
126 #define nv_hclass(o) nv_oclass(o)->handle
127 #define nv_iclass(o,i) (nv_object(o)->pclass & (i))
128 #define nv_mclass(o) nv_oclass(o)->handle
130 static inline struct nvkm_object *
131 nv_pclass(struct nvkm_object *parent, u32 oclass)
133 while (parent && !nv_iclass(parent, oclass))
134 parent = parent->parent;
141 int (*call)(struct nvkm_object *, u32, void *, u32);
145 int (*ctor)(struct nvkm_object *, struct nvkm_object *,
146 struct nvkm_oclass *, void *data, u32 size,
147 struct nvkm_object **);
148 void (*dtor)(struct nvkm_object *);
149 int (*init)(struct nvkm_object *);
150 int (*fini)(struct nvkm_object *, bool suspend);
151 int (*mthd)(struct nvkm_object *, u32, void *, u32);
152 int (*ntfy)(struct nvkm_object *, u32, struct nvkm_event **);
153 int (* map)(struct nvkm_object *, u64 *, u32 *);
154 u8 (*rd08)(struct nvkm_object *, u64 offset);
155 u16 (*rd16)(struct nvkm_object *, u64 offset);
156 u32 (*rd32)(struct nvkm_object *, u64 offset);
157 void (*wr08)(struct nvkm_object *, u64 offset, u8 data);
158 void (*wr16)(struct nvkm_object *, u64 offset, u16 data);
159 void (*wr32)(struct nvkm_object *, u64 offset, u32 data);
162 static inline struct nvkm_ofuncs *
165 return nv_oclass(obj)->ofuncs;
168 int nvkm_object_old(struct nvkm_object *, struct nvkm_object *,
169 struct nvkm_oclass *, void *, u32,
170 struct nvkm_object **);
171 void nvkm_object_ref(struct nvkm_object *, struct nvkm_object **);
172 int nvkm_object_inc(struct nvkm_object *);
173 int nvkm_object_dec(struct nvkm_object *, bool suspend);
176 nv_exec(void *obj, u32 mthd, void *data, u32 size)
178 struct nvkm_omthds *method = nv_oclass(obj)->omthds;
180 while (method && method->call) {
181 if (mthd >= method->start && mthd <= method->limit)
182 return method->call(obj, mthd, data, size);
190 nv_call(void *obj, u32 mthd, u32 data)
192 return nv_exec(obj, mthd, &data, sizeof(data));