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