| 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 * |
| 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 | |