OSDN Git Service

drm/nouveau/subdev: implement support for new-style nvkm_subdev
[uclinux-h8/linux.git] / drivers / gpu / drm / nouveau / include / nvkm / core / object.h
1 #ifndef __NVKM_OBJECT_H__
2 #define __NVKM_OBJECT_H__
3 #include <core/os.h>
4 #include <core/debug.h>
5 struct nvkm_event;
6 struct nvkm_gpuobj;
7
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
16
17 struct nvkm_object {
18         const struct nvkm_object_func *func;
19         struct nvkm_client *client;
20         struct nvkm_engine *engine;
21         u32 oclass_name;
22         u32 handle;
23         struct nvkm_object *parent;
24         struct nvkm_oclass *oclass;
25         u32 pclass;
26         atomic_t refcount;
27         atomic_t usecount;
28 #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
29 #define NVKM_OBJECT_MAGIC 0x75ef0bad
30         struct list_head list;
31         u32 _magic;
32 #endif
33 };
34
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 *);
51 };
52
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 **);
73
74 static inline struct nvkm_object *
75 nv_object(void *obj)
76 {
77 #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
78         if (likely(obj)) {
79                 struct nvkm_object *object = obj;
80                 BUG_ON(object->_magic != NVKM_OBJECT_MAGIC);
81         }
82 #endif
83         return obj;
84 }
85
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);
93
94 int _nvkm_object_ctor(struct nvkm_object *, struct nvkm_object *,
95                          struct nvkm_oclass *, void *, u32,
96                          struct nvkm_object **);
97
98 extern struct nvkm_ofuncs nvkm_object_ofuncs;
99
100 struct nvkm_sclass {
101         int minver;
102         int maxver;
103         s32 oclass;
104         const struct nvkm_object_func *func;
105         int (*ctor)(const struct nvkm_oclass *, void *data, u32 size,
106                     struct nvkm_object **);
107 };
108
109 struct nvkm_oclass {
110         s32 handle;
111         struct nvkm_ofuncs * const ofuncs;
112         struct nvkm_omthds * const omthds;
113
114         int (*ctor)(const struct nvkm_oclass *, void *data, u32 size,
115                     struct nvkm_object **);
116         struct nvkm_sclass base;
117         const void *priv;
118         const void *engn;
119         u64 object;
120         struct nvkm_client *client;
121         struct nvkm_object *parent;
122         struct nvkm_engine *engine;
123 };
124
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
129
130 static inline struct nvkm_object *
131 nv_pclass(struct nvkm_object *parent, u32 oclass)
132 {
133         while (parent && !nv_iclass(parent, oclass))
134                 parent = parent->parent;
135         return parent;
136 }
137
138 struct nvkm_omthds {
139         u32 start;
140         u32 limit;
141         int (*call)(struct nvkm_object *, u32, void *, u32);
142 };
143
144 struct nvkm_ofuncs {
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);
160 };
161
162 static inline struct nvkm_ofuncs *
163 nv_ofuncs(void *obj)
164 {
165         return nv_oclass(obj)->ofuncs;
166 }
167
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);
174
175 static inline int
176 nv_exec(void *obj, u32 mthd, void *data, u32 size)
177 {
178         struct nvkm_omthds *method = nv_oclass(obj)->omthds;
179
180         while (method && method->call) {
181                 if (mthd >= method->start && mthd <= method->limit)
182                         return method->call(obj, mthd, data, size);
183                 method++;
184         }
185
186         return -EINVAL;
187 }
188
189 static inline int
190 nv_call(void *obj, u32 mthd, u32 data)
191 {
192         return nv_exec(obj, mthd, &data, sizeof(data));
193 }
194 #endif