1d94470e9SBen Skeggs #ifndef __NVKM_RUNL_H__
2d94470e9SBen Skeggs #define __NVKM_RUNL_H__
3d94470e9SBen Skeggs #include <core/os.h>
4d94470e9SBen Skeggs struct nvkm_cgrp;
5*b084fff2SBen Skeggs struct nvkm_chan;
6d94470e9SBen Skeggs struct nvkm_memory;
7d94470e9SBen Skeggs enum nvkm_subdev_type;
8d94470e9SBen Skeggs 
9d94470e9SBen Skeggs struct nvkm_engn {
10d94470e9SBen Skeggs 	const struct nvkm_engn_func {
114d60100aSBen Skeggs 		bool (*chsw)(struct nvkm_engn *);
124d60100aSBen Skeggs 		int (*cxid)(struct nvkm_engn *, bool *cgid);
134d60100aSBen Skeggs 		void (*mmu_fault_trigger)(struct nvkm_engn *);
144d60100aSBen Skeggs 		bool (*mmu_fault_triggered)(struct nvkm_engn *);
15d94470e9SBen Skeggs 	} *func;
16d94470e9SBen Skeggs 	struct nvkm_runl *runl;
17d94470e9SBen Skeggs 	int id;
18d94470e9SBen Skeggs 
19d94470e9SBen Skeggs 	struct nvkm_engine *engine;
20d94470e9SBen Skeggs 
21e43c872cSBen Skeggs 	int fault;
22e43c872cSBen Skeggs 
23d94470e9SBen Skeggs 	struct list_head head;
24d94470e9SBen Skeggs };
25d94470e9SBen Skeggs 
26d94470e9SBen Skeggs #define ENGN_PRINT(e,l,p,f,a...)                                                           \
27d94470e9SBen Skeggs 	RUNL_PRINT((e)->runl, l, p, "%02d[%8s]:"f, (e)->id, (e)->engine->subdev.name, ##a)
28d94470e9SBen Skeggs #define ENGN_DEBUG(e,f,a...) ENGN_PRINT((e), DEBUG,   info, " "f"\n", ##a)
29d94470e9SBen Skeggs 
30d94470e9SBen Skeggs struct nvkm_runl {
31d94470e9SBen Skeggs 	const struct nvkm_runl_func {
32*b084fff2SBen Skeggs 		int runqs;
33*b084fff2SBen Skeggs 		u8 size;
34*b084fff2SBen Skeggs 		int (*update)(struct nvkm_runl *);
35*b084fff2SBen Skeggs 		void (*insert_cgrp)(struct nvkm_cgrp *, struct nvkm_memory *, u64 offset);
36*b084fff2SBen Skeggs 		void (*insert_chan)(struct nvkm_chan *, struct nvkm_memory *, u64 offset);
37*b084fff2SBen Skeggs 		void (*commit)(struct nvkm_runl *, struct nvkm_memory *, u32 start, int count);
384a492fd5SBen Skeggs 		int (*wait)(struct nvkm_runl *);
394a492fd5SBen Skeggs 		bool (*pending)(struct nvkm_runl *);
403a6bc9c2SBen Skeggs 		void (*block)(struct nvkm_runl *, u32 engm);
413a6bc9c2SBen Skeggs 		void (*allow)(struct nvkm_runl *, u32 engm);
424d60100aSBen Skeggs 		void (*fault_clear)(struct nvkm_runl *);
434d60100aSBen Skeggs 		void (*preempt)(struct nvkm_runl *);
44acff9415SBen Skeggs 		bool (*preempt_pending)(struct nvkm_runl *);
45d94470e9SBen Skeggs 	} *func;
46d94470e9SBen Skeggs 	struct nvkm_fifo *fifo;
47d94470e9SBen Skeggs 	int id;
48d94470e9SBen Skeggs 	u32 addr;
49d94470e9SBen Skeggs 
50d94470e9SBen Skeggs 	struct nvkm_chid *cgid;
5167059b9fSBen Skeggs #define NVKM_CHAN_EVENT_ERRORED BIT(0)
52d94470e9SBen Skeggs 	struct nvkm_chid *chid;
53d94470e9SBen Skeggs 
54d94470e9SBen Skeggs 	struct list_head engns;
55d94470e9SBen Skeggs 
56d94470e9SBen Skeggs 	struct nvkm_runq *runq[2];
57d94470e9SBen Skeggs 	int runq_nr;
58d94470e9SBen Skeggs 
59468fae7bSBen Skeggs 	struct list_head cgrps;
60468fae7bSBen Skeggs 	int cgrp_nr;
61468fae7bSBen Skeggs 	int chan_nr;
62*b084fff2SBen Skeggs 	atomic_t changed;
63*b084fff2SBen Skeggs 	struct nvkm_memory *mem;
64*b084fff2SBen Skeggs 	u32 offset;
65468fae7bSBen Skeggs 	struct mutex mutex;
66468fae7bSBen Skeggs 
673a6bc9c2SBen Skeggs 	int blocked;
683a6bc9c2SBen Skeggs 
694d60100aSBen Skeggs 	struct work_struct work;
704d60100aSBen Skeggs 	atomic_t rc_triggered;
714d60100aSBen Skeggs 	atomic_t rc_pending;
724d60100aSBen Skeggs 
73d94470e9SBen Skeggs 	struct list_head head;
74d94470e9SBen Skeggs };
75d94470e9SBen Skeggs 
76d94470e9SBen Skeggs struct nvkm_runl *nvkm_runl_new(struct nvkm_fifo *, int runi, u32 addr, int id_nr);
77d94470e9SBen Skeggs struct nvkm_runl *nvkm_runl_get(struct nvkm_fifo *, int runi, u32 addr);
78d94470e9SBen Skeggs struct nvkm_engn *nvkm_runl_add(struct nvkm_runl *, int engi, const struct nvkm_engn_func *,
79d94470e9SBen Skeggs 				enum nvkm_subdev_type, int inst);
80d94470e9SBen Skeggs void nvkm_runl_del(struct nvkm_runl *);
814d60100aSBen Skeggs void nvkm_runl_fini(struct nvkm_runl *);
823a6bc9c2SBen Skeggs void nvkm_runl_block(struct nvkm_runl *);
833a6bc9c2SBen Skeggs void nvkm_runl_allow(struct nvkm_runl *);
84*b084fff2SBen Skeggs void nvkm_runl_update_locked(struct nvkm_runl *, bool wait);
854a492fd5SBen Skeggs bool nvkm_runl_update_pending(struct nvkm_runl *);
86acff9415SBen Skeggs int nvkm_runl_preempt_wait(struct nvkm_runl *);
87d94470e9SBen Skeggs 
884d60100aSBen Skeggs void nvkm_runl_rc_engn(struct nvkm_runl *, struct nvkm_engn *);
894d60100aSBen Skeggs void nvkm_runl_rc_cgrp(struct nvkm_cgrp *);
904d60100aSBen Skeggs 
914d60100aSBen Skeggs struct nvkm_cgrp *nvkm_runl_cgrp_get_cgid(struct nvkm_runl *, int cgid, unsigned long *irqflags);
92c358f538SBen Skeggs struct nvkm_chan *nvkm_runl_chan_get_chid(struct nvkm_runl *, int chid, unsigned long *irqflags);
93c358f538SBen Skeggs struct nvkm_chan *nvkm_runl_chan_get_inst(struct nvkm_runl *, u64 inst, unsigned long *irqflags);
94c358f538SBen Skeggs 
95468fae7bSBen Skeggs #define nvkm_runl_find_engn(engn,runl,cond) nvkm_list_find(engn, &(runl)->engns, head, (cond))
96468fae7bSBen Skeggs 
974a492fd5SBen Skeggs #define nvkm_runl_first(fifo) list_first_entry(&(fifo)->runls, struct nvkm_runl, head)
98d94470e9SBen Skeggs #define nvkm_runl_foreach(runl,fifo) list_for_each_entry((runl), &(fifo)->runls, head)
994a492fd5SBen Skeggs #define nvkm_runl_foreach_cond(runl,fifo,cond) nvkm_list_foreach(runl, &(fifo)->runls, head, (cond))
100d94470e9SBen Skeggs #define nvkm_runl_foreach_engn(engn,runl) list_for_each_entry((engn), &(runl)->engns, head)
101468fae7bSBen Skeggs #define nvkm_runl_foreach_engn_cond(engn,runl,cond) \
102468fae7bSBen Skeggs 	nvkm_list_foreach(engn, &(runl)->engns, head, (cond))
1034d60100aSBen Skeggs #define nvkm_runl_foreach_cgrp(cgrp,runl) list_for_each_entry((cgrp), &(runl)->cgrps, head)
1044d60100aSBen Skeggs #define nvkm_runl_foreach_cgrp_safe(cgrp,gtmp,runl) \
1054d60100aSBen Skeggs 	list_for_each_entry_safe((cgrp), (gtmp), &(runl)->cgrps, head)
106d94470e9SBen Skeggs 
107d94470e9SBen Skeggs #define RUNL_PRINT(r,l,p,f,a...)                                                          \
108d94470e9SBen Skeggs 	nvkm_printk__(&(r)->fifo->engine.subdev, NV_DBG_##l, p, "%06x:"f, (r)->addr, ##a)
109d94470e9SBen Skeggs #define RUNL_ERROR(r,f,a...) RUNL_PRINT((r), ERROR,    err, " "f"\n", ##a)
110d94470e9SBen Skeggs #define RUNL_DEBUG(r,f,a...) RUNL_PRINT((r), DEBUG,   info, " "f"\n", ##a)
111d94470e9SBen Skeggs #define RUNL_TRACE(r,f,a...) RUNL_PRINT((r), TRACE,   info, " "f"\n", ##a)
112d94470e9SBen Skeggs #endif
113