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 
16e43c872cSBen Skeggs 	int fault;
17e43c872cSBen Skeggs 
18d94470e9SBen Skeggs 	struct list_head head;
19d94470e9SBen Skeggs };
20d94470e9SBen Skeggs 
21d94470e9SBen Skeggs #define ENGN_PRINT(e,l,p,f,a...)                                                           \
22d94470e9SBen Skeggs 	RUNL_PRINT((e)->runl, l, p, "%02d[%8s]:"f, (e)->id, (e)->engine->subdev.name, ##a)
23d94470e9SBen Skeggs #define ENGN_DEBUG(e,f,a...) ENGN_PRINT((e), DEBUG,   info, " "f"\n", ##a)
24d94470e9SBen Skeggs 
25d94470e9SBen Skeggs struct nvkm_runl {
26d94470e9SBen Skeggs 	const struct nvkm_runl_func {
274a492fd5SBen Skeggs 		int (*wait)(struct nvkm_runl *);
284a492fd5SBen Skeggs 		bool (*pending)(struct nvkm_runl *);
293a6bc9c2SBen Skeggs 		void (*block)(struct nvkm_runl *, u32 engm);
303a6bc9c2SBen Skeggs 		void (*allow)(struct nvkm_runl *, u32 engm);
31*acff9415SBen Skeggs 		bool (*preempt_pending)(struct nvkm_runl *);
32d94470e9SBen Skeggs 	} *func;
33d94470e9SBen Skeggs 	struct nvkm_fifo *fifo;
34d94470e9SBen Skeggs 	int id;
35d94470e9SBen Skeggs 	u32 addr;
36d94470e9SBen Skeggs 
37d94470e9SBen Skeggs 	struct nvkm_chid *cgid;
3867059b9fSBen Skeggs #define NVKM_CHAN_EVENT_ERRORED BIT(0)
39d94470e9SBen Skeggs 	struct nvkm_chid *chid;
40d94470e9SBen Skeggs 
41d94470e9SBen Skeggs 	struct list_head engns;
42d94470e9SBen Skeggs 
43d94470e9SBen Skeggs 	struct nvkm_runq *runq[2];
44d94470e9SBen Skeggs 	int runq_nr;
45d94470e9SBen Skeggs 
46468fae7bSBen Skeggs 	struct list_head cgrps;
47468fae7bSBen Skeggs 	int cgrp_nr;
48468fae7bSBen Skeggs 	int chan_nr;
49468fae7bSBen Skeggs 	struct mutex mutex;
50468fae7bSBen Skeggs 
513a6bc9c2SBen Skeggs 	int blocked;
523a6bc9c2SBen Skeggs 
53d94470e9SBen Skeggs 	struct list_head head;
54d94470e9SBen Skeggs };
55d94470e9SBen Skeggs 
56d94470e9SBen Skeggs struct nvkm_runl *nvkm_runl_new(struct nvkm_fifo *, int runi, u32 addr, int id_nr);
57d94470e9SBen Skeggs struct nvkm_runl *nvkm_runl_get(struct nvkm_fifo *, int runi, u32 addr);
58d94470e9SBen Skeggs struct nvkm_engn *nvkm_runl_add(struct nvkm_runl *, int engi, const struct nvkm_engn_func *,
59d94470e9SBen Skeggs 				enum nvkm_subdev_type, int inst);
60d94470e9SBen Skeggs void nvkm_runl_del(struct nvkm_runl *);
613a6bc9c2SBen Skeggs void nvkm_runl_block(struct nvkm_runl *);
623a6bc9c2SBen Skeggs void nvkm_runl_allow(struct nvkm_runl *);
634a492fd5SBen Skeggs bool nvkm_runl_update_pending(struct nvkm_runl *);
64*acff9415SBen Skeggs int nvkm_runl_preempt_wait(struct nvkm_runl *);
65d94470e9SBen Skeggs 
66c358f538SBen Skeggs struct nvkm_chan *nvkm_runl_chan_get_chid(struct nvkm_runl *, int chid, unsigned long *irqflags);
67c358f538SBen Skeggs struct nvkm_chan *nvkm_runl_chan_get_inst(struct nvkm_runl *, u64 inst, unsigned long *irqflags);
68c358f538SBen Skeggs 
69468fae7bSBen Skeggs #define nvkm_runl_find_engn(engn,runl,cond) nvkm_list_find(engn, &(runl)->engns, head, (cond))
70468fae7bSBen Skeggs 
714a492fd5SBen Skeggs #define nvkm_runl_first(fifo) list_first_entry(&(fifo)->runls, struct nvkm_runl, head)
72d94470e9SBen Skeggs #define nvkm_runl_foreach(runl,fifo) list_for_each_entry((runl), &(fifo)->runls, head)
734a492fd5SBen Skeggs #define nvkm_runl_foreach_cond(runl,fifo,cond) nvkm_list_foreach(runl, &(fifo)->runls, head, (cond))
74d94470e9SBen Skeggs #define nvkm_runl_foreach_engn(engn,runl) list_for_each_entry((engn), &(runl)->engns, head)
75468fae7bSBen Skeggs #define nvkm_runl_foreach_engn_cond(engn,runl,cond) \
76468fae7bSBen Skeggs 	nvkm_list_foreach(engn, &(runl)->engns, head, (cond))
77d94470e9SBen Skeggs 
78d94470e9SBen Skeggs #define RUNL_PRINT(r,l,p,f,a...)                                                          \
79d94470e9SBen Skeggs 	nvkm_printk__(&(r)->fifo->engine.subdev, NV_DBG_##l, p, "%06x:"f, (r)->addr, ##a)
80d94470e9SBen Skeggs #define RUNL_ERROR(r,f,a...) RUNL_PRINT((r), ERROR,    err, " "f"\n", ##a)
81d94470e9SBen Skeggs #define RUNL_DEBUG(r,f,a...) RUNL_PRINT((r), DEBUG,   info, " "f"\n", ##a)
82d94470e9SBen Skeggs #define RUNL_TRACE(r,f,a...) RUNL_PRINT((r), TRACE,   info, " "f"\n", ##a)
83d94470e9SBen Skeggs #endif
84