• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef __NOUVEAU_PARENT_H__
2 #define __NOUVEAU_PARENT_H__
3 
4 #include <core/device.h>
5 #include <core/object.h>
6 
7 struct nouveau_sclass {
8 	struct nouveau_sclass *sclass;
9 	struct nouveau_engine *engine;
10 	struct nouveau_oclass *oclass;
11 };
12 
13 struct nouveau_parent {
14 	struct nouveau_object base;
15 
16 	struct nouveau_sclass *sclass;
17 	u64 engine;
18 
19 	int  (*context_attach)(struct nouveau_object *,
20 			       struct nouveau_object *);
21 	int  (*context_detach)(struct nouveau_object *, bool suspend,
22 			       struct nouveau_object *);
23 
24 	int  (*object_attach)(struct nouveau_object *parent,
25 			      struct nouveau_object *object, u32 name);
26 	void (*object_detach)(struct nouveau_object *parent, int cookie);
27 };
28 
29 static inline struct nouveau_parent *
nv_parent(void * obj)30 nv_parent(void *obj)
31 {
32 #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
33 	if (unlikely(!(nv_iclass(obj, NV_PARENT_CLASS))))
34 		nv_assert("BAD CAST -> NvParent, %08x", nv_hclass(obj));
35 #endif
36 	return obj;
37 }
38 
39 #define nouveau_parent_create(p,e,c,v,s,m,d)                                   \
40 	nouveau_parent_create_((p), (e), (c), (v), (s), (m),                   \
41 			       sizeof(**d), (void **)d)
42 #define nouveau_parent_init(p)                                                 \
43 	nouveau_object_init(&(p)->base)
44 #define nouveau_parent_fini(p,s)                                               \
45 	nouveau_object_fini(&(p)->base, (s))
46 
47 int  nouveau_parent_create_(struct nouveau_object *, struct nouveau_object *,
48 			    struct nouveau_oclass *, u32 pclass,
49 			    struct nouveau_oclass *, u64 engcls,
50 			    int size, void **);
51 void nouveau_parent_destroy(struct nouveau_parent *);
52 
53 void _nouveau_parent_dtor(struct nouveau_object *);
54 #define _nouveau_parent_init nouveau_object_init
55 #define _nouveau_parent_fini nouveau_object_fini
56 
57 int nouveau_parent_sclass(struct nouveau_object *, u16 handle,
58 			  struct nouveau_object **pengine,
59 			  struct nouveau_oclass **poclass);
60 
61 #endif
62