1c39f472eSBen Skeggs #ifndef __NOUVEAU_ENGINE_H__
2c39f472eSBen Skeggs #define __NOUVEAU_ENGINE_H__
3c39f472eSBen Skeggs 
4c39f472eSBen Skeggs #include <core/object.h>
5c39f472eSBen Skeggs #include <core/subdev.h>
6c39f472eSBen Skeggs 
7c39f472eSBen Skeggs #define NV_ENGINE_(eng,var) (NV_ENGINE_CLASS | ((var) << 8) | (eng))
8c39f472eSBen Skeggs #define NV_ENGINE(name,var)  NV_ENGINE_(NVDEV_ENGINE_##name, (var))
9c39f472eSBen Skeggs 
10c39f472eSBen Skeggs struct nouveau_engine {
11c39f472eSBen Skeggs 	struct nouveau_subdev subdev;
12c39f472eSBen Skeggs 	struct nouveau_oclass *cclass;
13c39f472eSBen Skeggs 	struct nouveau_oclass *sclass;
14c39f472eSBen Skeggs 
15c39f472eSBen Skeggs 	struct list_head contexts;
16c39f472eSBen Skeggs 	spinlock_t lock;
17c39f472eSBen Skeggs 
18c39f472eSBen Skeggs 	void (*tile_prog)(struct nouveau_engine *, int region);
19c39f472eSBen Skeggs 	int  (*tlb_flush)(struct nouveau_engine *);
20c39f472eSBen Skeggs };
21c39f472eSBen Skeggs 
22c39f472eSBen Skeggs static inline struct nouveau_engine *
23c39f472eSBen Skeggs nv_engine(void *obj)
24c39f472eSBen Skeggs {
25c39f472eSBen Skeggs #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
26c39f472eSBen Skeggs 	if (unlikely(!nv_iclass(obj, NV_ENGINE_CLASS)))
27c39f472eSBen Skeggs 		nv_assert("BAD CAST -> NvEngine, %08x", nv_hclass(obj));
28c39f472eSBen Skeggs #endif
29c39f472eSBen Skeggs 	return obj;
30c39f472eSBen Skeggs }
31c39f472eSBen Skeggs 
32c39f472eSBen Skeggs static inline int
33c39f472eSBen Skeggs nv_engidx(struct nouveau_engine *engine)
34c39f472eSBen Skeggs {
35c39f472eSBen Skeggs 	return nv_subidx(&engine->subdev);
36c39f472eSBen Skeggs }
37c39f472eSBen Skeggs 
38c39f472eSBen Skeggs struct nouveau_engine *nouveau_engine(void *obj, int idx);
39c39f472eSBen Skeggs 
40c39f472eSBen Skeggs #define nouveau_engine_create(p,e,c,d,i,f,r)                                   \
41c39f472eSBen Skeggs 	nouveau_engine_create_((p), (e), (c), (d), (i), (f),                   \
42c39f472eSBen Skeggs 			       sizeof(**r),(void **)r)
43c39f472eSBen Skeggs 
44c39f472eSBen Skeggs #define nouveau_engine_destroy(p)                                              \
45c39f472eSBen Skeggs 	nouveau_subdev_destroy(&(p)->subdev)
46c39f472eSBen Skeggs #define nouveau_engine_init(p)                                                 \
47c39f472eSBen Skeggs 	nouveau_subdev_init(&(p)->subdev)
48c39f472eSBen Skeggs #define nouveau_engine_fini(p,s)                                               \
49c39f472eSBen Skeggs 	nouveau_subdev_fini(&(p)->subdev, (s))
50c39f472eSBen Skeggs 
51c39f472eSBen Skeggs int nouveau_engine_create_(struct nouveau_object *, struct nouveau_object *,
52c39f472eSBen Skeggs 			   struct nouveau_oclass *, bool, const char *,
53c39f472eSBen Skeggs 			   const char *, int, void **);
54c39f472eSBen Skeggs 
55c39f472eSBen Skeggs #define _nouveau_engine_dtor _nouveau_subdev_dtor
56c39f472eSBen Skeggs #define _nouveau_engine_init _nouveau_subdev_init
57c39f472eSBen Skeggs #define _nouveau_engine_fini _nouveau_subdev_fini
58c39f472eSBen Skeggs 
59c39f472eSBen Skeggs #endif
60