2e5266fa75841b4fb54370f102feb42e5ade3931
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / nouveau / include / nvkm / core / parent.h
1 #ifndef __NVKM_PARENT_H__
2 #define __NVKM_PARENT_H__
3 #include <core/object.h>
4
5 struct nvkm_parent {
6         struct nvkm_object object;
7
8         struct nvkm_oclass *sclass;
9         u64 engine;
10
11         int  (*context_attach)(struct nvkm_object *, struct nvkm_object *);
12         int  (*context_detach)(struct nvkm_object *, bool suspend,
13                                struct nvkm_object *);
14
15         int  (*object_attach)(struct nvkm_object *parent,
16                               struct nvkm_object *object, u32 name);
17         void (*object_detach)(struct nvkm_object *parent, int cookie);
18 };
19
20 static inline struct nvkm_parent *
21 nv_parent(void *obj)
22 {
23 #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
24         BUG_ON(!(nv_iclass(obj, NV_PARENT_CLASS)));
25 #endif
26         return obj;
27 }
28
29 #define nvkm_parent_create(p,e,c,v,s,m,d)                                   \
30         nvkm_parent_create_((p), (e), (c), (v), (s), (m),                   \
31                                sizeof(**d), (void **)d)
32 #define nvkm_parent_init(p)                                                 \
33         nvkm_object_init(&(p)->object)
34 #define nvkm_parent_fini(p,s)                                               \
35         nvkm_object_fini(&(p)->object, (s))
36
37 int  nvkm_parent_create_(struct nvkm_object *, struct nvkm_object *,
38                             struct nvkm_oclass *, u32 pclass,
39                             struct nvkm_oclass *, u64 engcls,
40                             int size, void **);
41 void nvkm_parent_destroy(struct nvkm_parent *);
42
43 void _nvkm_parent_dtor(struct nvkm_object *);
44 #define _nvkm_parent_init nvkm_object_init
45 #define _nvkm_parent_fini nvkm_object_fini
46
47 int nvkm_parent_sclass(struct nvkm_object *, u16 handle,
48                        struct nvkm_object **pengine,
49                        struct nvkm_oclass **poclass);
50 int nvkm_parent_lclass(struct nvkm_object *, u32 *, int);
51 #endif