1d94470e9SBen Skeggs #ifndef __NVKM_RUNL_H__
2d94470e9SBen Skeggs #define __NVKM_RUNL_H__
3d94470e9SBen Skeggs #include <core/os.h>
4d94470e9SBen Skeggs struct nvkm_cgrp;
5d94470e9SBen Skeggs struct nvkm_memory;
6d94470e9SBen Skeggs enum nvkm_subdev_type;
7d94470e9SBen Skeggs 
8d94470e9SBen Skeggs struct nvkm_engn {
9d94470e9SBen Skeggs 	const struct nvkm_engn_func {
10d94470e9SBen Skeggs 	} *func;
11d94470e9SBen Skeggs 	struct nvkm_runl *runl;
12d94470e9SBen Skeggs 	int id;
13d94470e9SBen Skeggs 
14d94470e9SBen Skeggs 	struct nvkm_engine *engine;
15d94470e9SBen Skeggs 
16d94470e9SBen Skeggs 	struct list_head head;
17d94470e9SBen Skeggs };
18d94470e9SBen Skeggs 
19d94470e9SBen Skeggs #define ENGN_PRINT(e,l,p,f,a...)                                                           \
20d94470e9SBen Skeggs 	RUNL_PRINT((e)->runl, l, p, "%02d[%8s]:"f, (e)->id, (e)->engine->subdev.name, ##a)
21d94470e9SBen Skeggs #define ENGN_DEBUG(e,f,a...) ENGN_PRINT((e), DEBUG,   info, " "f"\n", ##a)
22d94470e9SBen Skeggs 
23d94470e9SBen Skeggs struct nvkm_runl {
24d94470e9SBen Skeggs 	const struct nvkm_runl_func {
25d94470e9SBen Skeggs 	} *func;
26d94470e9SBen Skeggs 	struct nvkm_fifo *fifo;
27d94470e9SBen Skeggs 	int id;
28d94470e9SBen Skeggs 	u32 addr;
29d94470e9SBen Skeggs 
30d94470e9SBen Skeggs 	struct nvkm_chid *cgid;
31d94470e9SBen Skeggs 	struct nvkm_chid *chid;
32d94470e9SBen Skeggs 
33d94470e9SBen Skeggs 	struct list_head engns;
34d94470e9SBen Skeggs 
35d94470e9SBen Skeggs 	struct nvkm_runq *runq[2];
36d94470e9SBen Skeggs 	int runq_nr;
37d94470e9SBen Skeggs 
38*468fae7bSBen Skeggs 	struct list_head cgrps;
39*468fae7bSBen Skeggs 	int cgrp_nr;
40*468fae7bSBen Skeggs 	int chan_nr;
41*468fae7bSBen Skeggs 	struct mutex mutex;
42*468fae7bSBen Skeggs 
43d94470e9SBen Skeggs 	struct list_head head;
44d94470e9SBen Skeggs };
45d94470e9SBen Skeggs 
46d94470e9SBen Skeggs struct nvkm_runl *nvkm_runl_new(struct nvkm_fifo *, int runi, u32 addr, int id_nr);
47d94470e9SBen Skeggs struct nvkm_runl *nvkm_runl_get(struct nvkm_fifo *, int runi, u32 addr);
48d94470e9SBen Skeggs struct nvkm_engn *nvkm_runl_add(struct nvkm_runl *, int engi, const struct nvkm_engn_func *,
49d94470e9SBen Skeggs 				enum nvkm_subdev_type, int inst);
50d94470e9SBen Skeggs void nvkm_runl_del(struct nvkm_runl *);
51d94470e9SBen Skeggs 
52*468fae7bSBen Skeggs #define nvkm_runl_find_engn(engn,runl,cond) nvkm_list_find(engn, &(runl)->engns, head, (cond))
53*468fae7bSBen Skeggs 
54d94470e9SBen Skeggs #define nvkm_runl_foreach(runl,fifo) list_for_each_entry((runl), &(fifo)->runls, head)
55d94470e9SBen Skeggs #define nvkm_runl_foreach_engn(engn,runl) list_for_each_entry((engn), &(runl)->engns, head)
56*468fae7bSBen Skeggs #define nvkm_runl_foreach_engn_cond(engn,runl,cond) \
57*468fae7bSBen Skeggs 	nvkm_list_foreach(engn, &(runl)->engns, head, (cond))
58d94470e9SBen Skeggs 
59d94470e9SBen Skeggs #define RUNL_PRINT(r,l,p,f,a...)                                                          \
60d94470e9SBen Skeggs 	nvkm_printk__(&(r)->fifo->engine.subdev, NV_DBG_##l, p, "%06x:"f, (r)->addr, ##a)
61d94470e9SBen Skeggs #define RUNL_ERROR(r,f,a...) RUNL_PRINT((r), ERROR,    err, " "f"\n", ##a)
62d94470e9SBen Skeggs #define RUNL_DEBUG(r,f,a...) RUNL_PRINT((r), DEBUG,   info, " "f"\n", ##a)
63d94470e9SBen Skeggs #define RUNL_TRACE(r,f,a...) RUNL_PRINT((r), TRACE,   info, " "f"\n", ##a)
64d94470e9SBen Skeggs #endif
65