15025407bSBen Skeggs #ifndef __NVKM_ENGINE_H__
25025407bSBen Skeggs #define __NVKM_ENGINE_H__
3c39f472eSBen Skeggs #include <core/subdev.h>
4168c2e21SBen Skeggs struct nvkm_device_oclass; /*XXX: DEV!ENG */
5168c2e21SBen Skeggs struct nvkm_fifo_chan;
6c39f472eSBen Skeggs 
7493f189dSBen Skeggs #define NV_ENGINE_(eng,var) (((var) << 8) | (eng))
8c39f472eSBen Skeggs #define NV_ENGINE(name,var)  NV_ENGINE_(NVDEV_ENGINE_##name, (var))
9c39f472eSBen Skeggs 
105025407bSBen Skeggs struct nvkm_engine {
115025407bSBen Skeggs 	struct nvkm_subdev subdev;
12168c2e21SBen Skeggs 	const struct nvkm_engine_func *func;
13168c2e21SBen Skeggs 
14168c2e21SBen Skeggs 	int usecount;
15168c2e21SBen Skeggs 
165025407bSBen Skeggs 	struct nvkm_oclass *cclass;
175025407bSBen Skeggs 	struct nvkm_oclass *sclass;
18c39f472eSBen Skeggs 
19c39f472eSBen Skeggs 	struct list_head contexts;
20c39f472eSBen Skeggs 	spinlock_t lock;
21c39f472eSBen Skeggs 
225025407bSBen Skeggs 	void (*tile_prog)(struct nvkm_engine *, int region);
235025407bSBen Skeggs 	int  (*tlb_flush)(struct nvkm_engine *);
24c39f472eSBen Skeggs };
25c39f472eSBen Skeggs 
26168c2e21SBen Skeggs struct nvkm_engine_func {
27168c2e21SBen Skeggs 	void *(*dtor)(struct nvkm_engine *);
28168c2e21SBen Skeggs 	int (*oneinit)(struct nvkm_engine *);
29168c2e21SBen Skeggs 	int (*init)(struct nvkm_engine *);
30168c2e21SBen Skeggs 	int (*fini)(struct nvkm_engine *, bool suspend);
31168c2e21SBen Skeggs 	void (*intr)(struct nvkm_engine *);
32168c2e21SBen Skeggs 
33168c2e21SBen Skeggs 	struct {
34168c2e21SBen Skeggs 		int (*sclass)(struct nvkm_oclass *, int index,
35168c2e21SBen Skeggs 			      const struct nvkm_device_oclass **);
36168c2e21SBen Skeggs 	} base;
37168c2e21SBen Skeggs 
38168c2e21SBen Skeggs 	struct {
39168c2e21SBen Skeggs 		int (*cclass)(struct nvkm_fifo_chan *,
40168c2e21SBen Skeggs 			      const struct nvkm_oclass *,
41168c2e21SBen Skeggs 			      struct nvkm_object **);
42168c2e21SBen Skeggs 		int (*sclass)(struct nvkm_oclass *, int index);
43168c2e21SBen Skeggs 	} fifo;
44168c2e21SBen Skeggs 
45168c2e21SBen Skeggs 	struct nvkm_sclass sclass[];
46168c2e21SBen Skeggs };
47168c2e21SBen Skeggs 
48168c2e21SBen Skeggs int nvkm_engine_ctor(const struct nvkm_engine_func *, struct nvkm_device *,
49168c2e21SBen Skeggs 		     int index, u32 pmc_enable, bool enable,
50168c2e21SBen Skeggs 		     struct nvkm_engine *);
51168c2e21SBen Skeggs int nvkm_engine_new_(const struct nvkm_engine_func *, struct nvkm_device *,
52168c2e21SBen Skeggs 		     int index, u32 pmc_enable, bool enable,
53168c2e21SBen Skeggs 		     struct nvkm_engine **);
54168c2e21SBen Skeggs struct nvkm_engine *nvkm_engine_ref(struct nvkm_engine *);
55168c2e21SBen Skeggs void nvkm_engine_unref(struct nvkm_engine **);
56168c2e21SBen Skeggs 
575025407bSBen Skeggs static inline struct nvkm_engine *
58c39f472eSBen Skeggs nv_engine(void *obj)
59c39f472eSBen Skeggs {
60c39f472eSBen Skeggs #if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
6153003941SBen Skeggs 	BUG_ON(!nv_iclass(obj, NV_ENGINE_CLASS));
62c39f472eSBen Skeggs #endif
63c39f472eSBen Skeggs 	return obj;
64c39f472eSBen Skeggs }
65c39f472eSBen Skeggs 
66c39f472eSBen Skeggs static inline int
675025407bSBen Skeggs nv_engidx(struct nvkm_engine *engine)
68c39f472eSBen Skeggs {
69c39f472eSBen Skeggs 	return nv_subidx(&engine->subdev);
70c39f472eSBen Skeggs }
71c39f472eSBen Skeggs 
725025407bSBen Skeggs struct nvkm_engine *nvkm_engine(void *obj, int idx);
73c39f472eSBen Skeggs 
745025407bSBen Skeggs #define nvkm_engine_create(p,e,c,d,i,f,r)                                   \
755025407bSBen Skeggs 	nvkm_engine_create_((p), (e), (c), (d), (i), (f),                   \
76c39f472eSBen Skeggs 			       sizeof(**r),(void **)r)
77c39f472eSBen Skeggs 
785025407bSBen Skeggs #define nvkm_engine_destroy(p)                                              \
795025407bSBen Skeggs 	nvkm_subdev_destroy(&(p)->subdev)
8089c651e2SBen Skeggs #define nvkm_engine_init_old(p)                                                \
813a8c3400SBen Skeggs 	nvkm_subdev_init_old(&(p)->subdev)
8289c651e2SBen Skeggs #define nvkm_engine_fini_old(p,s)                                              \
833a8c3400SBen Skeggs 	nvkm_subdev_fini_old(&(p)->subdev, (s))
84c39f472eSBen Skeggs 
855025407bSBen Skeggs int nvkm_engine_create_(struct nvkm_object *, struct nvkm_object *,
865025407bSBen Skeggs 			   struct nvkm_oclass *, bool, const char *,
87c39f472eSBen Skeggs 			   const char *, int, void **);
88c39f472eSBen Skeggs 
895025407bSBen Skeggs #define _nvkm_engine_dtor _nvkm_subdev_dtor
905025407bSBen Skeggs #define _nvkm_engine_init _nvkm_subdev_init
915025407bSBen Skeggs #define _nvkm_engine_fini _nvkm_subdev_fini
929ace404bSBen Skeggs 
939ace404bSBen Skeggs #include <core/device.h>
94c39f472eSBen Skeggs #endif
95