1d94470e9SBen Skeggs #ifndef __NVKM_RUNL_H__ 2d94470e9SBen Skeggs #define __NVKM_RUNL_H__ 37f4f35eaSBen Skeggs #include <core/intr.h> 48ab849d6SBen Skeggs struct nvkm_cctx; 5d94470e9SBen Skeggs struct nvkm_cgrp; 6b084fff2SBen Skeggs struct nvkm_chan; 7d94470e9SBen Skeggs struct nvkm_memory; 87ac29332SBen Skeggs struct nvkm_object; 98ab849d6SBen Skeggs struct nvkm_vctx; 10d94470e9SBen Skeggs enum nvkm_subdev_type; 11d94470e9SBen Skeggs 12d94470e9SBen Skeggs struct nvkm_engn { 13d94470e9SBen Skeggs const struct nvkm_engn_func { 14*55e1a599SBen Skeggs int (*nonstall)(struct nvkm_engn *); 154d60100aSBen Skeggs bool (*chsw)(struct nvkm_engn *); 164d60100aSBen Skeggs int (*cxid)(struct nvkm_engn *, bool *cgid); 174d60100aSBen Skeggs void (*mmu_fault_trigger)(struct nvkm_engn *); 184d60100aSBen Skeggs bool (*mmu_fault_triggered)(struct nvkm_engn *); 198ab849d6SBen Skeggs int (*ctor)(struct nvkm_engn *, struct nvkm_vctx *); 208ab849d6SBen Skeggs void (*bind)(struct nvkm_engn *, struct nvkm_cctx *, struct nvkm_chan *); 217ac29332SBen Skeggs int (*ramht_add)(struct nvkm_engn *, struct nvkm_object *, struct nvkm_chan *); 227ac29332SBen Skeggs void (*ramht_del)(struct nvkm_chan *, int hash); 23d94470e9SBen Skeggs } *func; 24d94470e9SBen Skeggs struct nvkm_runl *runl; 25d94470e9SBen Skeggs int id; 26d94470e9SBen Skeggs 27d94470e9SBen Skeggs struct nvkm_engine *engine; 28d94470e9SBen Skeggs 29e43c872cSBen Skeggs int fault; 30e43c872cSBen Skeggs 31d94470e9SBen Skeggs struct list_head head; 32d94470e9SBen Skeggs }; 33d94470e9SBen Skeggs 34d94470e9SBen Skeggs #define ENGN_PRINT(e,l,p,f,a...) \ 35d94470e9SBen Skeggs RUNL_PRINT((e)->runl, l, p, "%02d[%8s]:"f, (e)->id, (e)->engine->subdev.name, ##a) 36d94470e9SBen Skeggs #define ENGN_DEBUG(e,f,a...) ENGN_PRINT((e), DEBUG, info, " "f"\n", ##a) 37d94470e9SBen Skeggs 38d94470e9SBen Skeggs struct nvkm_runl { 39d94470e9SBen Skeggs const struct nvkm_runl_func { 407f4f35eaSBen Skeggs void (*init)(struct nvkm_runl *); 417f4f35eaSBen Skeggs void (*fini)(struct nvkm_runl *); 42b084fff2SBen Skeggs int runqs; 43b084fff2SBen Skeggs u8 size; 44b084fff2SBen Skeggs int (*update)(struct nvkm_runl *); 45b084fff2SBen Skeggs void (*insert_cgrp)(struct nvkm_cgrp *, struct nvkm_memory *, u64 offset); 46b084fff2SBen Skeggs void (*insert_chan)(struct nvkm_chan *, struct nvkm_memory *, u64 offset); 47b084fff2SBen Skeggs void (*commit)(struct nvkm_runl *, struct nvkm_memory *, u32 start, int count); 484a492fd5SBen Skeggs int (*wait)(struct nvkm_runl *); 494a492fd5SBen Skeggs bool (*pending)(struct nvkm_runl *); 503a6bc9c2SBen Skeggs void (*block)(struct nvkm_runl *, u32 engm); 513a6bc9c2SBen Skeggs void (*allow)(struct nvkm_runl *, u32 engm); 524d60100aSBen Skeggs void (*fault_clear)(struct nvkm_runl *); 534d60100aSBen Skeggs void (*preempt)(struct nvkm_runl *); 54acff9415SBen Skeggs bool (*preempt_pending)(struct nvkm_runl *); 55d94470e9SBen Skeggs } *func; 56d94470e9SBen Skeggs struct nvkm_fifo *fifo; 57d94470e9SBen Skeggs int id; 58d94470e9SBen Skeggs u32 addr; 597f4f35eaSBen Skeggs u32 chan; 607f4f35eaSBen Skeggs u16 doorbell; 61d94470e9SBen Skeggs 62d94470e9SBen Skeggs struct nvkm_chid *cgid; 6367059b9fSBen Skeggs #define NVKM_CHAN_EVENT_ERRORED BIT(0) 64d94470e9SBen Skeggs struct nvkm_chid *chid; 65d94470e9SBen Skeggs 66d94470e9SBen Skeggs struct list_head engns; 67d94470e9SBen Skeggs 68d94470e9SBen Skeggs struct nvkm_runq *runq[2]; 69d94470e9SBen Skeggs int runq_nr; 70d94470e9SBen Skeggs 717f4f35eaSBen Skeggs struct nvkm_inth inth; 727f4f35eaSBen Skeggs 73*55e1a599SBen Skeggs struct { 74*55e1a599SBen Skeggs int vector; 75*55e1a599SBen Skeggs struct nvkm_inth inth; 76*55e1a599SBen Skeggs } nonstall; 77*55e1a599SBen Skeggs 78468fae7bSBen Skeggs struct list_head cgrps; 79468fae7bSBen Skeggs int cgrp_nr; 80468fae7bSBen Skeggs int chan_nr; 81b084fff2SBen Skeggs atomic_t changed; 82b084fff2SBen Skeggs struct nvkm_memory *mem; 83b084fff2SBen Skeggs u32 offset; 84468fae7bSBen Skeggs struct mutex mutex; 85468fae7bSBen Skeggs 863a6bc9c2SBen Skeggs int blocked; 873a6bc9c2SBen Skeggs 884d60100aSBen Skeggs struct work_struct work; 894d60100aSBen Skeggs atomic_t rc_triggered; 904d60100aSBen Skeggs atomic_t rc_pending; 914d60100aSBen Skeggs 92d94470e9SBen Skeggs struct list_head head; 93d94470e9SBen Skeggs }; 94d94470e9SBen Skeggs 95d94470e9SBen Skeggs struct nvkm_runl *nvkm_runl_new(struct nvkm_fifo *, int runi, u32 addr, int id_nr); 96d94470e9SBen Skeggs struct nvkm_runl *nvkm_runl_get(struct nvkm_fifo *, int runi, u32 addr); 97d94470e9SBen Skeggs struct nvkm_engn *nvkm_runl_add(struct nvkm_runl *, int engi, const struct nvkm_engn_func *, 98d94470e9SBen Skeggs enum nvkm_subdev_type, int inst); 99d94470e9SBen Skeggs void nvkm_runl_del(struct nvkm_runl *); 1004d60100aSBen Skeggs void nvkm_runl_fini(struct nvkm_runl *); 1013a6bc9c2SBen Skeggs void nvkm_runl_block(struct nvkm_runl *); 1023a6bc9c2SBen Skeggs void nvkm_runl_allow(struct nvkm_runl *); 103b084fff2SBen Skeggs void nvkm_runl_update_locked(struct nvkm_runl *, bool wait); 1044a492fd5SBen Skeggs bool nvkm_runl_update_pending(struct nvkm_runl *); 105acff9415SBen Skeggs int nvkm_runl_preempt_wait(struct nvkm_runl *); 106d94470e9SBen Skeggs 1074d60100aSBen Skeggs void nvkm_runl_rc_engn(struct nvkm_runl *, struct nvkm_engn *); 1084d60100aSBen Skeggs void nvkm_runl_rc_cgrp(struct nvkm_cgrp *); 1094d60100aSBen Skeggs 1104d60100aSBen Skeggs struct nvkm_cgrp *nvkm_runl_cgrp_get_cgid(struct nvkm_runl *, int cgid, unsigned long *irqflags); 111c358f538SBen Skeggs struct nvkm_chan *nvkm_runl_chan_get_chid(struct nvkm_runl *, int chid, unsigned long *irqflags); 112c358f538SBen Skeggs struct nvkm_chan *nvkm_runl_chan_get_inst(struct nvkm_runl *, u64 inst, unsigned long *irqflags); 113c358f538SBen Skeggs 114468fae7bSBen Skeggs #define nvkm_runl_find_engn(engn,runl,cond) nvkm_list_find(engn, &(runl)->engns, head, (cond)) 115468fae7bSBen Skeggs 1164a492fd5SBen Skeggs #define nvkm_runl_first(fifo) list_first_entry(&(fifo)->runls, struct nvkm_runl, head) 117d94470e9SBen Skeggs #define nvkm_runl_foreach(runl,fifo) list_for_each_entry((runl), &(fifo)->runls, head) 1184a492fd5SBen Skeggs #define nvkm_runl_foreach_cond(runl,fifo,cond) nvkm_list_foreach(runl, &(fifo)->runls, head, (cond)) 119d94470e9SBen Skeggs #define nvkm_runl_foreach_engn(engn,runl) list_for_each_entry((engn), &(runl)->engns, head) 120468fae7bSBen Skeggs #define nvkm_runl_foreach_engn_cond(engn,runl,cond) \ 121468fae7bSBen Skeggs nvkm_list_foreach(engn, &(runl)->engns, head, (cond)) 1224d60100aSBen Skeggs #define nvkm_runl_foreach_cgrp(cgrp,runl) list_for_each_entry((cgrp), &(runl)->cgrps, head) 1234d60100aSBen Skeggs #define nvkm_runl_foreach_cgrp_safe(cgrp,gtmp,runl) \ 1244d60100aSBen Skeggs list_for_each_entry_safe((cgrp), (gtmp), &(runl)->cgrps, head) 125d94470e9SBen Skeggs 126d94470e9SBen Skeggs #define RUNL_PRINT(r,l,p,f,a...) \ 127d94470e9SBen Skeggs nvkm_printk__(&(r)->fifo->engine.subdev, NV_DBG_##l, p, "%06x:"f, (r)->addr, ##a) 128d94470e9SBen Skeggs #define RUNL_ERROR(r,f,a...) RUNL_PRINT((r), ERROR, err, " "f"\n", ##a) 129d94470e9SBen Skeggs #define RUNL_DEBUG(r,f,a...) RUNL_PRINT((r), DEBUG, info, " "f"\n", ##a) 130d94470e9SBen Skeggs #define RUNL_TRACE(r,f,a...) RUNL_PRINT((r), TRACE, info, " "f"\n", ##a) 131d94470e9SBen Skeggs #endif 132