xref: /openbmc/linux/drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1b7019ac5SIlia Mirkin /* SPDX-License-Identifier: MIT */
205c7145dSBen Skeggs #ifndef __NVKM_FIFO_H__
305c7145dSBen Skeggs #define __NVKM_FIFO_H__
48f0649b5SBen Skeggs #include <core/engine.h>
54246b92cSBen Skeggs #include <core/object.h>
68f0649b5SBen Skeggs #include <core/event.h>
7ddc669e2SBen Skeggs struct nvkm_fault_data;
88f0649b5SBen Skeggs 
92546db0eSBen Skeggs #define NVKM_FIFO_ENGN_NR 16
108f0649b5SBen Skeggs 
11f5e45689SBen Skeggs struct nvkm_chan {
12f5e45689SBen Skeggs 	const struct nvkm_chan_func *func;
13468fae7bSBen Skeggs 	char name[64];
14468fae7bSBen Skeggs 	struct nvkm_cgrp *cgrp;
15b084fff2SBen Skeggs 	int runq;
16468fae7bSBen Skeggs 
17d3e7a439SBen Skeggs 	struct nvkm_gpuobj *inst;
18d3e7a439SBen Skeggs 	struct nvkm_vmm *vmm;
1906db7fdeSBen Skeggs 	struct nvkm_gpuobj *push;
2006db7fdeSBen Skeggs 	int id;
21f5e45689SBen Skeggs 
22fbe9f433SBen Skeggs 	struct {
23fbe9f433SBen Skeggs 		struct nvkm_memory *mem;
24fbe9f433SBen Skeggs 		u32 base;
25fbe9f433SBen Skeggs 	} userd;
26fbe9f433SBen Skeggs 
273647c53bSBen Skeggs 	u32 ramfc_offset;
283647c53bSBen Skeggs 	struct nvkm_gpuobj *ramfc;
293647c53bSBen Skeggs 	struct nvkm_gpuobj *cache;
303647c53bSBen Skeggs 	struct nvkm_gpuobj *eng;
313647c53bSBen Skeggs 	struct nvkm_gpuobj *pgd;
323647c53bSBen Skeggs 	struct nvkm_ramht *ramht;
333647c53bSBen Skeggs 
3467059b9fSBen Skeggs 	spinlock_t lock;
3567059b9fSBen Skeggs 	atomic_t blocked;
3667059b9fSBen Skeggs 	atomic_t errored;
3767059b9fSBen Skeggs 
38f48dd293SBen Skeggs 	struct list_head cctxs;
398f0649b5SBen Skeggs 	struct list_head head;
40c39f472eSBen Skeggs };
41c39f472eSBen Skeggs 
42c358f538SBen Skeggs struct nvkm_chan *nvkm_chan_get_chid(struct nvkm_engine *, int id, unsigned long *irqflags);
43c358f538SBen Skeggs struct nvkm_chan *nvkm_chan_get_inst(struct nvkm_engine *, u64 inst, unsigned long *irqflags);
44c358f538SBen Skeggs void nvkm_chan_put(struct nvkm_chan **, unsigned long irqflags);
45c358f538SBen Skeggs 
4605c7145dSBen Skeggs struct nvkm_fifo {
478f0649b5SBen Skeggs 	const struct nvkm_fifo_func *func;
4813de7f46SBen Skeggs 	struct nvkm_engine engine;
49c39f472eSBen Skeggs 
50800ac1f8SBen Skeggs 	struct nvkm_chid *chid;
51800ac1f8SBen Skeggs 	struct nvkm_chid *cgid;
52800ac1f8SBen Skeggs 
531c488ba9SBen Skeggs 	struct list_head runqs;
54d94470e9SBen Skeggs 	struct list_head runls;
551c488ba9SBen Skeggs 
56d67f3b96SBen Skeggs 	struct {
57d67f3b96SBen Skeggs #define NVKM_FIFO_NONSTALL_EVENT BIT(0)
58d67f3b96SBen Skeggs 		struct nvkm_event event;
597f4f35eaSBen Skeggs 		struct nvkm_inth intr;
60d67f3b96SBen Skeggs 	} nonstall;
61d67f3b96SBen Skeggs 
624a492fd5SBen Skeggs 	struct {
634a492fd5SBen Skeggs 		u32 chan_msec;
644a492fd5SBen Skeggs 	} timeout;
654a492fd5SBen Skeggs 
66fbe9f433SBen Skeggs 	struct {
67fbe9f433SBen Skeggs 		struct nvkm_memory *mem;
68fbe9f433SBen Skeggs 		struct nvkm_vma *bar1;
69fbe9f433SBen Skeggs 	} userd;
70fbe9f433SBen Skeggs 
71c39f472eSBen Skeggs 	spinlock_t lock;
72a6419360SBen Skeggs 	struct mutex mutex;
73c39f472eSBen Skeggs };
74c39f472eSBen Skeggs 
75ddc669e2SBen Skeggs void nvkm_fifo_fault(struct nvkm_fifo *, struct nvkm_fault_data *);
7613de7f46SBen Skeggs void nvkm_fifo_pause(struct nvkm_fifo *, unsigned long *);
7713de7f46SBen Skeggs void nvkm_fifo_start(struct nvkm_fifo *, unsigned long *);
78*0ceceaa9SBen Skeggs bool nvkm_fifo_ctxsw_in_progress(struct nvkm_engine *);
798f0649b5SBen Skeggs 
80ab0db2bdSBen Skeggs int nv04_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
81ab0db2bdSBen Skeggs int nv10_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
82ab0db2bdSBen Skeggs int nv17_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
83ab0db2bdSBen Skeggs int nv40_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
84ab0db2bdSBen Skeggs int nv50_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
85ab0db2bdSBen Skeggs int g84_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
86d94470e9SBen Skeggs int g98_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
87ab0db2bdSBen Skeggs int gf100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
88ab0db2bdSBen Skeggs int gk104_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
89ab0db2bdSBen Skeggs int gk110_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
90ab0db2bdSBen Skeggs int gk208_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
91ab0db2bdSBen Skeggs int gk20a_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
92ab0db2bdSBen Skeggs int gm107_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
93ab0db2bdSBen Skeggs int gm200_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
94ab0db2bdSBen Skeggs int gp100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
95ab0db2bdSBen Skeggs int gv100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
96ab0db2bdSBen Skeggs int tu102_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
977f4f35eaSBen Skeggs int ga100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
9849b2dfc0SBen Skeggs int ga102_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
99c39f472eSBen Skeggs #endif
100