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