#ifndef __NVKM_PARENT_H__ #define __NVKM_PARENT_H__ #include struct nvkm_sclass { struct nvkm_sclass *sclass; struct nvkm_engine *engine; struct nvkm_oclass *oclass; }; struct nvkm_parent { struct nvkm_object object; struct nvkm_sclass *sclass; u64 engine; int (*context_attach)(struct nvkm_object *, struct nvkm_object *); int (*context_detach)(struct nvkm_object *, bool suspend, struct nvkm_object *); int (*object_attach)(struct nvkm_object *parent, struct nvkm_object *object, u32 name); void (*object_detach)(struct nvkm_object *parent, int cookie); }; static inline struct nvkm_parent * nv_parent(void *obj) { #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA if (unlikely(!(nv_iclass(obj, NV_PARENT_CLASS)))) nv_assert("BAD CAST -> NvParent, %08x", nv_hclass(obj)); #endif return obj; } #define nvkm_parent_create(p,e,c,v,s,m,d) \ nvkm_parent_create_((p), (e), (c), (v), (s), (m), \ sizeof(**d), (void **)d) #define nvkm_parent_init(p) \ nvkm_object_init(&(p)->object) #define nvkm_parent_fini(p,s) \ nvkm_object_fini(&(p)->object, (s)) int nvkm_parent_create_(struct nvkm_object *, struct nvkm_object *, struct nvkm_oclass *, u32 pclass, struct nvkm_oclass *, u64 engcls, int size, void **); void nvkm_parent_destroy(struct nvkm_parent *); void _nvkm_parent_dtor(struct nvkm_object *); #define _nvkm_parent_init nvkm_object_init #define _nvkm_parent_fini nvkm_object_fini int nvkm_parent_sclass(struct nvkm_object *, u16 handle, struct nvkm_object **pengine, struct nvkm_oclass **poclass); int nvkm_parent_lclass(struct nvkm_object *, u32 *, int); #endif