1#ifndef __NVKM_PARENT_H__ 2#define __NVKM_PARENT_H__ 3#include <core/object.h> 4 5struct nvkm_sclass { 6 struct nvkm_sclass *sclass; 7 struct nvkm_engine *engine; 8 struct nvkm_oclass *oclass; 9}; 10 11struct nvkm_parent { 12 struct nvkm_object object; 13 14 struct nvkm_sclass *sclass; 15 u64 engine; 16 17 int (*context_attach)(struct nvkm_object *, struct nvkm_object *); 18 int (*context_detach)(struct nvkm_object *, bool suspend, 19 struct nvkm_object *); 20 21 int (*object_attach)(struct nvkm_object *parent, 22 struct nvkm_object *object, u32 name); 23 void (*object_detach)(struct nvkm_object *parent, int cookie); 24}; 25 26static inline struct nvkm_parent * 27nv_parent(void *obj) 28{ 29#if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA 30 if (unlikely(!(nv_iclass(obj, NV_PARENT_CLASS)))) 31 nv_assert("BAD CAST -> NvParent, %08x", nv_hclass(obj)); 32#endif 33 return obj; 34} 35 36#define nvkm_parent_create(p,e,c,v,s,m,d) \ 37 nvkm_parent_create_((p), (e), (c), (v), (s), (m), \ 38 sizeof(**d), (void **)d) 39#define nvkm_parent_init(p) \ 40 nvkm_object_init(&(p)->object) 41#define nvkm_parent_fini(p,s) \ 42 nvkm_object_fini(&(p)->object, (s)) 43 44int nvkm_parent_create_(struct nvkm_object *, struct nvkm_object *, 45 struct nvkm_oclass *, u32 pclass, 46 struct nvkm_oclass *, u64 engcls, 47 int size, void **); 48void nvkm_parent_destroy(struct nvkm_parent *); 49 50void _nvkm_parent_dtor(struct nvkm_object *); 51#define _nvkm_parent_init nvkm_object_init 52#define _nvkm_parent_fini nvkm_object_fini 53 54int nvkm_parent_sclass(struct nvkm_object *, u16 handle, 55 struct nvkm_object **pengine, 56 struct nvkm_oclass **poclass); 57int nvkm_parent_lclass(struct nvkm_object *, u32 *, int); 58#endif 59