xref: /openbmc/linux/drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1b7019ac5SIlia Mirkin /* SPDX-License-Identifier: MIT */
29a65a38cSBen Skeggs #ifndef __NVKM_FIFO_PRIV_H__
39a65a38cSBen Skeggs #define __NVKM_FIFO_PRIV_H__
413de7f46SBen Skeggs #define nvkm_fifo(p) container_of((p), struct nvkm_fifo, engine)
59a65a38cSBen Skeggs #include <engine/fifo.h>
6923f1ff5SBen Skeggs #include <core/enum.h>
78ab849d6SBen Skeggs struct nvkm_cctx;
8f5e45689SBen Skeggs struct nvkm_cgrp;
94d60100aSBen Skeggs struct nvkm_engn;
109be9c606SBen Skeggs struct nvkm_memory;
11923f1ff5SBen Skeggs struct nvkm_runl;
1287c86024SBen Skeggs struct nvkm_runq;
138ab849d6SBen Skeggs struct nvkm_vctx;
149a65a38cSBen Skeggs 
1513de7f46SBen Skeggs struct nvkm_fifo_func {
168c18138cSBen Skeggs 	int (*chid_nr)(struct nvkm_fifo *);
17800ac1f8SBen Skeggs 	int (*chid_ctor)(struct nvkm_fifo *, int nr);
181c488ba9SBen Skeggs 	int (*runq_nr)(struct nvkm_fifo *);
19d94470e9SBen Skeggs 	int (*runl_ctor)(struct nvkm_fifo *);
208c18138cSBen Skeggs 
2113de7f46SBen Skeggs 	void (*init)(struct nvkm_fifo *);
22965c41d9SBen Skeggs 	void (*init_pbdmas)(struct nvkm_fifo *, u32 mask);
23965c41d9SBen Skeggs 
242fc71a05SBen Skeggs 	irqreturn_t (*intr)(struct nvkm_inth *);
259be9c606SBen Skeggs 	void (*intr_mmu_fault_unit)(struct nvkm_fifo *, int unit);
264d60100aSBen Skeggs 	void (*intr_ctxsw_timeout)(struct nvkm_fifo *, u32 engm);
279be9c606SBen Skeggs 
289be9c606SBen Skeggs 	const struct nvkm_fifo_func_mmu_fault {
299be9c606SBen Skeggs 		void (*recover)(struct nvkm_fifo *, struct nvkm_fault_data *);
309be9c606SBen Skeggs 		const struct nvkm_enum *access;
319be9c606SBen Skeggs 		const struct nvkm_enum *engine;
329be9c606SBen Skeggs 		const struct nvkm_enum *reason;
339be9c606SBen Skeggs 		const struct nvkm_enum *hubclient;
349be9c606SBen Skeggs 		const struct nvkm_enum *gpcclient;
35e43c872cSBen Skeggs 	} *mmu_fault;
369be9c606SBen Skeggs 
3713de7f46SBen Skeggs 	void (*pause)(struct nvkm_fifo *, unsigned long *);
3813de7f46SBen Skeggs 	void (*start)(struct nvkm_fifo *, unsigned long *);
39f5e45689SBen Skeggs 
40*7f4f35eaSBen Skeggs 	int (*nonstall_ctor)(struct nvkm_fifo *);
41d67f3b96SBen Skeggs 	const struct nvkm_event_func *nonstall;
42d67f3b96SBen Skeggs 
43d94470e9SBen Skeggs 	const struct nvkm_runl_func *runl;
441c488ba9SBen Skeggs 	const struct nvkm_runq_func *runq;
45d94470e9SBen Skeggs 	const struct nvkm_engn_func *engn;
46d94470e9SBen Skeggs 	const struct nvkm_engn_func *engn_sw;
47d94470e9SBen Skeggs 	const struct nvkm_engn_func *engn_ce;
481c488ba9SBen Skeggs 
49f5e45689SBen Skeggs 	struct nvkm_fifo_func_cgrp {
50f5e45689SBen Skeggs 		struct nvkm_sclass user;
51f5e45689SBen Skeggs 		const struct nvkm_cgrp_func *func;
52f5e45689SBen Skeggs 		bool force;
53f5e45689SBen Skeggs 	} cgrp;
54f5e45689SBen Skeggs 
55f5e45689SBen Skeggs 	struct nvkm_fifo_func_chan {
56f5e45689SBen Skeggs 		struct nvkm_sclass user;
57f5e45689SBen Skeggs 		const struct nvkm_chan_func *func;
58f5e45689SBen Skeggs 	} chan;
5913de7f46SBen Skeggs };
6013de7f46SBen Skeggs 
6106db7fdeSBen Skeggs int nvkm_fifo_new_(const struct nvkm_fifo_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
6206db7fdeSBen Skeggs 		   struct nvkm_fifo **);
638c18138cSBen Skeggs 
64800ac1f8SBen Skeggs int nv04_fifo_chid_ctor(struct nvkm_fifo *, int);
65d94470e9SBen Skeggs int nv04_fifo_runl_ctor(struct nvkm_fifo *);
66800ac1f8SBen Skeggs void nv04_fifo_init(struct nvkm_fifo *);
672fc71a05SBen Skeggs irqreturn_t nv04_fifo_intr(struct nvkm_inth *);
689a65a38cSBen Skeggs void nv04_fifo_pause(struct nvkm_fifo *, unsigned long *);
699a65a38cSBen Skeggs void nv04_fifo_start(struct nvkm_fifo *, unsigned long *);
70d94470e9SBen Skeggs extern const struct nvkm_runl_func nv04_runl;
71d94470e9SBen Skeggs extern const struct nvkm_engn_func nv04_engn;
72f5e45689SBen Skeggs extern const struct nvkm_cgrp_func nv04_cgrp;
73d3e7a439SBen Skeggs extern const struct nvkm_chan_func_inst nv04_chan_inst;
74fbe9f433SBen Skeggs extern const struct nvkm_chan_func_userd nv04_chan_userd;
753647c53bSBen Skeggs void nv04_chan_ramfc_clear(struct nvkm_chan *);
7667059b9fSBen Skeggs void nv04_chan_start(struct nvkm_chan *);
7767059b9fSBen Skeggs void nv04_chan_stop(struct nvkm_chan *);
787ac29332SBen Skeggs void nv04_eobj_ramht_del(struct nvkm_chan *, int);
79cf9518b5SBen Skeggs 
808c18138cSBen Skeggs int nv10_fifo_chid_nr(struct nvkm_fifo *);
818c18138cSBen Skeggs 
828c18138cSBen Skeggs int nv50_fifo_chid_nr(struct nvkm_fifo *);
83800ac1f8SBen Skeggs int nv50_fifo_chid_ctor(struct nvkm_fifo *, int);
84b084fff2SBen Skeggs void nv50_fifo_init(struct nvkm_fifo *);
85d94470e9SBen Skeggs extern const struct nvkm_runl_func nv50_runl;
86b084fff2SBen Skeggs int nv50_runl_update(struct nvkm_runl *);
874a492fd5SBen Skeggs int nv50_runl_wait(struct nvkm_runl *);
88d94470e9SBen Skeggs extern const struct nvkm_engn_func nv50_engn_sw;
89d3e7a439SBen Skeggs extern const struct nvkm_chan_func_inst nv50_chan_inst;
90fbe9f433SBen Skeggs extern const struct nvkm_chan_func_userd nv50_chan_userd;
9162742b5eSBen Skeggs void nv50_chan_unbind(struct nvkm_chan *);
9267059b9fSBen Skeggs void nv50_chan_start(struct nvkm_chan *);
9367059b9fSBen Skeggs void nv50_chan_stop(struct nvkm_chan *);
94acff9415SBen Skeggs void nv50_chan_preempt(struct nvkm_chan *);
957ac29332SBen Skeggs int nv50_eobj_ramht_add(struct nvkm_engn *, struct nvkm_object *, struct nvkm_chan *);
967ac29332SBen Skeggs void nv50_eobj_ramht_del(struct nvkm_chan *, int);
978c18138cSBen Skeggs 
98d67f3b96SBen Skeggs extern const struct nvkm_event_func g84_fifo_nonstall;
99d94470e9SBen Skeggs extern const struct nvkm_engn_func g84_engn;
100f5e45689SBen Skeggs extern const struct nvkm_chan_func g84_chan;
101f5e45689SBen Skeggs 
102800ac1f8SBen Skeggs int gf100_fifo_chid_ctor(struct nvkm_fifo *, int);
1031c488ba9SBen Skeggs int gf100_fifo_runq_nr(struct nvkm_fifo *);
104923f1ff5SBen Skeggs bool gf100_fifo_intr_pbdma(struct nvkm_fifo *);
105e43c872cSBen Skeggs void gf100_fifo_intr_mmu_fault(struct nvkm_fifo *);
1069be9c606SBen Skeggs void gf100_fifo_intr_mmu_fault_unit(struct nvkm_fifo *, int);
1074d60100aSBen Skeggs void gf100_fifo_intr_sched(struct nvkm_fifo *);
1084d60100aSBen Skeggs void gf100_fifo_intr_ctxsw_timeout(struct nvkm_fifo *, u32);
109e43c872cSBen Skeggs void gf100_fifo_mmu_fault_recover(struct nvkm_fifo *, struct nvkm_fault_data *);
110e43c872cSBen Skeggs extern const struct nvkm_enum gf100_fifo_mmu_fault_access[];
111d67f3b96SBen Skeggs extern const struct nvkm_event_func gf100_fifo_nonstall;
112acff9415SBen Skeggs bool gf100_runl_preempt_pending(struct nvkm_runl *);
11387c86024SBen Skeggs void gf100_runq_init(struct nvkm_runq *);
114923f1ff5SBen Skeggs bool gf100_runq_intr(struct nvkm_runq *, struct nvkm_runl *);
1154d60100aSBen Skeggs void gf100_engn_mmu_fault_trigger(struct nvkm_engn *);
1164d60100aSBen Skeggs bool gf100_engn_mmu_fault_triggered(struct nvkm_engn *);
117d94470e9SBen Skeggs extern const struct nvkm_engn_func gf100_engn_sw;
118d3e7a439SBen Skeggs extern const struct nvkm_chan_func_inst gf100_chan_inst;
119fbe9f433SBen Skeggs void gf100_chan_userd_clear(struct nvkm_chan *);
120acff9415SBen Skeggs void gf100_chan_preempt(struct nvkm_chan *);
12164f7c698SBen Skeggs 
1228c18138cSBen Skeggs int gk104_fifo_chid_nr(struct nvkm_fifo *);
123d94470e9SBen Skeggs int gk104_fifo_runl_ctor(struct nvkm_fifo *);
124fbe9f433SBen Skeggs void gk104_fifo_init(struct nvkm_fifo *);
125965c41d9SBen Skeggs void gk104_fifo_init_pbdmas(struct nvkm_fifo *, u32);
1262fc71a05SBen Skeggs irqreturn_t gk104_fifo_intr(struct nvkm_inth *);
1274a492fd5SBen Skeggs void gk104_fifo_intr_runlist(struct nvkm_fifo *);
1282fc71a05SBen Skeggs void gk104_fifo_intr_chsw(struct nvkm_fifo *);
1292fc71a05SBen Skeggs void gk104_fifo_intr_bind(struct nvkm_fifo *);
1309be9c606SBen Skeggs extern const struct nvkm_fifo_func_mmu_fault gk104_fifo_mmu_fault;
131e43c872cSBen Skeggs extern const struct nvkm_enum gk104_fifo_mmu_fault_reason[];
132e43c872cSBen Skeggs extern const struct nvkm_enum gk104_fifo_mmu_fault_hubclient[];
133e43c872cSBen Skeggs extern const struct nvkm_enum gk104_fifo_mmu_fault_gpcclient[];
134b084fff2SBen Skeggs void gk104_runl_insert_chan(struct nvkm_chan *, struct nvkm_memory *, u64);
135b084fff2SBen Skeggs void gk104_runl_commit(struct nvkm_runl *, struct nvkm_memory *, u32, int);
1364a492fd5SBen Skeggs bool gk104_runl_pending(struct nvkm_runl *);
1373a6bc9c2SBen Skeggs void gk104_runl_block(struct nvkm_runl *, u32);
1383a6bc9c2SBen Skeggs void gk104_runl_allow(struct nvkm_runl *, u32);
1394d60100aSBen Skeggs void gk104_runl_fault_clear(struct nvkm_runl *);
1401c488ba9SBen Skeggs extern const struct nvkm_runq_func gk104_runq;
14187c86024SBen Skeggs void gk104_runq_init(struct nvkm_runq *);
142923f1ff5SBen Skeggs bool gk104_runq_intr(struct nvkm_runq *, struct nvkm_runl *);
143923f1ff5SBen Skeggs extern const struct nvkm_bitfield gk104_runq_intr_0_names[];
1444d60100aSBen Skeggs bool gk104_runq_idle(struct nvkm_runq *);
145d94470e9SBen Skeggs extern const struct nvkm_engn_func gk104_engn;
1464d60100aSBen Skeggs bool gk104_engn_chsw(struct nvkm_engn *);
1474d60100aSBen Skeggs int gk104_engn_cxid(struct nvkm_engn *, bool *cgid);
1488ab849d6SBen Skeggs int gk104_ectx_ctor(struct nvkm_engn *, struct nvkm_vctx *);
149d94470e9SBen Skeggs extern const struct nvkm_engn_func gk104_engn_ce;
150fbe9f433SBen Skeggs extern const struct nvkm_chan_func_userd gk104_chan_userd;
1513647c53bSBen Skeggs extern const struct nvkm_chan_func_ramfc gk104_chan_ramfc;
15262742b5eSBen Skeggs void gk104_chan_bind(struct nvkm_chan *);
15362742b5eSBen Skeggs void gk104_chan_bind_inst(struct nvkm_chan *);
15462742b5eSBen Skeggs void gk104_chan_unbind(struct nvkm_chan *);
15567059b9fSBen Skeggs void gk104_chan_start(struct nvkm_chan *);
15667059b9fSBen Skeggs void gk104_chan_stop(struct nvkm_chan *);
1578c18138cSBen Skeggs 
158800ac1f8SBen Skeggs int gk110_fifo_chid_ctor(struct nvkm_fifo *, int);
159d94470e9SBen Skeggs extern const struct nvkm_runl_func gk110_runl;
160f5e45689SBen Skeggs extern const struct nvkm_cgrp_func gk110_cgrp;
161b084fff2SBen Skeggs void gk110_runl_insert_cgrp(struct nvkm_cgrp *, struct nvkm_memory *, u64);
162f5e45689SBen Skeggs extern const struct nvkm_chan_func gk110_chan;
163acff9415SBen Skeggs void gk110_chan_preempt(struct nvkm_chan *);
164f5e45689SBen Skeggs 
1651c488ba9SBen Skeggs extern const struct nvkm_runq_func gk208_runq;
16687c86024SBen Skeggs void gk208_runq_init(struct nvkm_runq *);
1671c488ba9SBen Skeggs 
1689be9c606SBen Skeggs void gm107_fifo_intr_mmu_fault_unit(struct nvkm_fifo *, int);
1699be9c606SBen Skeggs extern const struct nvkm_fifo_func_mmu_fault gm107_fifo_mmu_fault;
170d94470e9SBen Skeggs extern const struct nvkm_runl_func gm107_runl;
171f5e45689SBen Skeggs extern const struct nvkm_chan_func gm107_chan;
172f5e45689SBen Skeggs 
1738c18138cSBen Skeggs int gm200_fifo_chid_nr(struct nvkm_fifo *);
1741c488ba9SBen Skeggs int gm200_fifo_runq_nr(struct nvkm_fifo *);
175f5e45689SBen Skeggs 
176e43c872cSBen Skeggs extern const struct nvkm_enum gv100_fifo_mmu_fault_access[];
177e43c872cSBen Skeggs extern const struct nvkm_enum gv100_fifo_mmu_fault_reason[];
178e43c872cSBen Skeggs extern const struct nvkm_enum gv100_fifo_mmu_fault_hubclient[];
179e43c872cSBen Skeggs extern const struct nvkm_enum gv100_fifo_mmu_fault_gpcclient[];
180b084fff2SBen Skeggs void gv100_runl_insert_cgrp(struct nvkm_cgrp *, struct nvkm_memory *, u64);
181b084fff2SBen Skeggs void gv100_runl_insert_chan(struct nvkm_chan *, struct nvkm_memory *, u64);
1824d60100aSBen Skeggs void gv100_runl_preempt(struct nvkm_runl *);
1831c488ba9SBen Skeggs extern const struct nvkm_runq_func gv100_runq;
184d94470e9SBen Skeggs extern const struct nvkm_engn_func gv100_engn;
1858ab849d6SBen Skeggs void gv100_ectx_bind(struct nvkm_engn *, struct nvkm_cctx *, struct nvkm_chan *);
186d94470e9SBen Skeggs extern const struct nvkm_engn_func gv100_engn_ce;
1878ab849d6SBen Skeggs int gv100_ectx_ce_ctor(struct nvkm_engn *, struct nvkm_vctx *);
1888ab849d6SBen Skeggs void gv100_ectx_ce_bind(struct nvkm_engn *, struct nvkm_cctx *, struct nvkm_chan *);
189fbe9f433SBen Skeggs extern const struct nvkm_chan_func_userd gv100_chan_userd;
1903647c53bSBen Skeggs extern const struct nvkm_chan_func_ramfc gv100_chan_ramfc;
1911c488ba9SBen Skeggs 
1924d60100aSBen Skeggs void tu102_fifo_intr_ctxsw_timeout_info(struct nvkm_engn *, u32 info);
1939be9c606SBen Skeggs extern const struct nvkm_fifo_func_mmu_fault tu102_fifo_mmu_fault;
1949be9c606SBen Skeggs 
195*7f4f35eaSBen Skeggs int ga100_fifo_runl_ctor(struct nvkm_fifo *);
196*7f4f35eaSBen Skeggs int ga100_fifo_nonstall_ctor(struct nvkm_fifo *);
197*7f4f35eaSBen Skeggs extern const struct nvkm_event_func ga100_fifo_nonstall;
198*7f4f35eaSBen Skeggs extern const struct nvkm_runl_func ga100_runl;
199*7f4f35eaSBen Skeggs extern const struct nvkm_runq_func ga100_runq;
200*7f4f35eaSBen Skeggs extern const struct nvkm_engn_func ga100_engn;
201*7f4f35eaSBen Skeggs extern const struct nvkm_engn_func ga100_engn_ce;
202*7f4f35eaSBen Skeggs extern const struct nvkm_cgrp_func ga100_cgrp;
203*7f4f35eaSBen Skeggs extern const struct nvkm_chan_func ga100_chan;
204*7f4f35eaSBen Skeggs 
205f5e45689SBen Skeggs int nvkm_uchan_new(struct nvkm_fifo *, struct nvkm_cgrp *, const struct nvkm_oclass *,
206f5e45689SBen Skeggs 		   void *argv, u32 argc, struct nvkm_object **);
20706db7fdeSBen Skeggs int nvkm_ucgrp_new(struct nvkm_fifo *, const struct nvkm_oclass *, void *argv, u32 argc,
20806db7fdeSBen Skeggs 		   struct nvkm_object **);
2099a65a38cSBen Skeggs #endif
210