1b7019ac5SIlia Mirkin /* SPDX-License-Identifier: MIT */ 2f5e45689SBen Skeggs #ifndef __NVKM_CHAN_H__ 3f5e45689SBen Skeggs #define __NVKM_CHAN_H__ 4f5e45689SBen Skeggs #include <engine/fifo.h> 5*06db7fdeSBen Skeggs struct nvkm_dmaobj; 6f48dd293SBen Skeggs struct nvkm_engn; 7*06db7fdeSBen Skeggs struct nvkm_runl; 89a65a38cSBen Skeggs 9800ac1f8SBen Skeggs extern const struct nvkm_event_func nvkm_chan_event; 10800ac1f8SBen Skeggs 11f48dd293SBen Skeggs struct nvkm_cctx { 12f48dd293SBen Skeggs struct nvkm_vctx *vctx; 13f48dd293SBen Skeggs refcount_t refs; 14f48dd293SBen Skeggs refcount_t uses; 15f48dd293SBen Skeggs 16f48dd293SBen Skeggs struct list_head head; 17f48dd293SBen Skeggs }; 18f48dd293SBen Skeggs 19f5e45689SBen Skeggs struct nvkm_chan_func { 20d3e7a439SBen Skeggs const struct nvkm_chan_func_inst { 21d3e7a439SBen Skeggs u32 size; 22d3e7a439SBen Skeggs bool zero; 23d3e7a439SBen Skeggs bool vmm; 24d3e7a439SBen Skeggs } *inst; 25d3e7a439SBen Skeggs 26fbe9f433SBen Skeggs const struct nvkm_chan_func_userd { 27fbe9f433SBen Skeggs int bar; 28fbe9f433SBen Skeggs u32 base; 29fbe9f433SBen Skeggs u32 size; 30fbe9f433SBen Skeggs void (*clear)(struct nvkm_chan *); 31fbe9f433SBen Skeggs } *userd; 32fbe9f433SBen Skeggs 333647c53bSBen Skeggs const struct nvkm_chan_func_ramfc { 343647c53bSBen Skeggs const struct nvkm_ramfc_layout { 353647c53bSBen Skeggs unsigned bits:6; 363647c53bSBen Skeggs unsigned ctxs:5; 373647c53bSBen Skeggs unsigned ctxp:8; 383647c53bSBen Skeggs unsigned regs:5; 393647c53bSBen Skeggs unsigned regp; 403647c53bSBen Skeggs } *layout; 413647c53bSBen Skeggs int (*write)(struct nvkm_chan *, u64 offset, u64 length, u32 devm, bool priv); 423647c53bSBen Skeggs void (*clear)(struct nvkm_chan *); 433647c53bSBen Skeggs bool ctxdma; 443647c53bSBen Skeggs u32 devm; 453647c53bSBen Skeggs bool priv; 463647c53bSBen Skeggs } *ramfc; 473647c53bSBen Skeggs 4862742b5eSBen Skeggs void (*bind)(struct nvkm_chan *); 4962742b5eSBen Skeggs void (*unbind)(struct nvkm_chan *); 5067059b9fSBen Skeggs void (*start)(struct nvkm_chan *); 5167059b9fSBen Skeggs void (*stop)(struct nvkm_chan *); 52acff9415SBen Skeggs void (*preempt)(struct nvkm_chan *); 5367059b9fSBen Skeggs u32 (*doorbell_handle)(struct nvkm_chan *); 548f0649b5SBen Skeggs }; 559a65a38cSBen Skeggs 56*06db7fdeSBen Skeggs int nvkm_chan_new_(const struct nvkm_chan_func *, struct nvkm_runl *, int runq, struct nvkm_cgrp *, 57*06db7fdeSBen Skeggs const char *name, bool priv, u32 devm, struct nvkm_vmm *, struct nvkm_dmaobj *, 58*06db7fdeSBen Skeggs u64 offset, u64 length, struct nvkm_memory *userd, u64 userd_bar1, 59*06db7fdeSBen Skeggs struct nvkm_chan **); 60f5e45689SBen Skeggs void nvkm_chan_del(struct nvkm_chan **); 6167059b9fSBen Skeggs void nvkm_chan_allow(struct nvkm_chan *); 6267059b9fSBen Skeggs void nvkm_chan_block(struct nvkm_chan *); 6367059b9fSBen Skeggs void nvkm_chan_error(struct nvkm_chan *, bool preempt); 64b084fff2SBen Skeggs void nvkm_chan_insert(struct nvkm_chan *); 65b084fff2SBen Skeggs void nvkm_chan_remove(struct nvkm_chan *, bool preempt); 66b084fff2SBen Skeggs void nvkm_chan_remove_locked(struct nvkm_chan *); 67acff9415SBen Skeggs int nvkm_chan_preempt(struct nvkm_chan *, bool wait); 68acff9415SBen Skeggs int nvkm_chan_preempt_locked(struct nvkm_chan *, bool wait); 69f48dd293SBen Skeggs int nvkm_chan_cctx_get(struct nvkm_chan *, struct nvkm_engn *, struct nvkm_cctx **, 70f48dd293SBen Skeggs struct nvkm_client * /*TODO: remove need for this */); 71f48dd293SBen Skeggs void nvkm_chan_cctx_put(struct nvkm_chan *, struct nvkm_cctx **); 728ab849d6SBen Skeggs void nvkm_chan_cctx_bind(struct nvkm_chan *, struct nvkm_engn *, struct nvkm_cctx *); 739a65a38cSBen Skeggs 74468fae7bSBen Skeggs #define CHAN_PRCLI(c,l,p,f,a...) CGRP_PRINT((c)->cgrp, l, p, "%04x:[%s]"f, (c)->id, (c)->name, ##a) 75468fae7bSBen Skeggs #define CHAN_PRINT(c,l,p,f,a...) CGRP_PRINT((c)->cgrp, l, p, "%04x:"f, (c)->id, ##a) 76468fae7bSBen Skeggs #define CHAN_ERROR(c,f,a...) CHAN_PRCLI((c), ERROR, err, " "f"\n", ##a) 77468fae7bSBen Skeggs #define CHAN_TRACE(c,f,a...) CHAN_PRINT((c), TRACE, info, " "f"\n", ##a) 789a65a38cSBen Skeggs #endif 79