1 /* SPDX-License-Identifier: MIT */
2 #ifndef __NVKM_FIFO_H__
3 #define __NVKM_FIFO_H__
4 #include <core/engine.h>
5 #include <core/object.h>
6 #include <core/event.h>
7 struct nvkm_fault_data;
8 
9 #define NVKM_FIFO_ENGN_NR 16
10 
11 struct nvkm_fifo_engn {
12 	struct nvkm_object *object;
13 	int refcount;
14 };
15 
16 struct nvkm_chan {
17 	const struct nvkm_chan_func *func;
18 	char name[64];
19 	struct nvkm_cgrp *cgrp;
20 
21 	union { int id; int chid; }; /*FIXME: remove later */
22 
23 	struct list_head cctxs;
24 
25 	struct nvkm_fifo *fifo;
26 	struct nvkm_object object;
27 
28 	struct list_head head;
29 	struct nvkm_gpuobj *inst;
30 	struct nvkm_gpuobj *push;
31 	struct nvkm_vmm *vmm;
32 	u64 addr;
33 	u32 size;
34 
35 	struct nvkm_fifo_engn engn[NVKM_FIFO_ENGN_NR];
36 };
37 
38 struct nvkm_chan *nvkm_chan_get_chid(struct nvkm_engine *, int id, unsigned long *irqflags);
39 struct nvkm_chan *nvkm_chan_get_inst(struct nvkm_engine *, u64 inst, unsigned long *irqflags);
40 void nvkm_chan_put(struct nvkm_chan **, unsigned long irqflags);
41 
42 struct nvkm_fifo {
43 	const struct nvkm_fifo_func *func;
44 	struct nvkm_engine engine;
45 
46 	struct nvkm_chid *chid;
47 	struct nvkm_chid *cgid;
48 
49 	struct list_head runqs;
50 	struct list_head runls;
51 
52 	struct {
53 #define NVKM_FIFO_NONSTALL_EVENT BIT(0)
54 		struct nvkm_event event;
55 	} nonstall;
56 
57 	struct {
58 		u32 chan_msec;
59 	} timeout;
60 
61 	int nr;
62 	struct list_head chan;
63 	spinlock_t lock;
64 	struct mutex mutex;
65 
66 #define NVKM_FIFO_EVENT_KILLED         BIT(0)
67 	struct nvkm_event kevent; /* channel killed */
68 };
69 
70 void nvkm_fifo_fault(struct nvkm_fifo *, struct nvkm_fault_data *);
71 void nvkm_fifo_pause(struct nvkm_fifo *, unsigned long *);
72 void nvkm_fifo_start(struct nvkm_fifo *, unsigned long *);
73 
74 int nv04_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
75 int nv10_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
76 int nv17_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
77 int nv40_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
78 int nv50_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
79 int g84_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
80 int g98_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
81 int gf100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
82 int gk104_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
83 int gk110_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
84 int gk208_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
85 int gk20a_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
86 int gm107_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
87 int gm200_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
88 int gp100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
89 int gv100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
90 int tu102_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
91 int ga102_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
92 #endif
93