1/*	$NetBSD: fifo.h,v 1.3 2021/12/18 23:45:33 riastradh Exp $	*/
2
3/* SPDX-License-Identifier: MIT */
4#ifndef __NVKM_FIFO_H__
5#define __NVKM_FIFO_H__
6#include <core/engine.h>
7#include <core/object.h>
8#include <core/event.h>
9struct nvkm_fault_data;
10
11#define NVKM_FIFO_CHID_NR 4096
12
13struct nvkm_fifo_engn {
14	struct nvkm_object *object;
15	int refcount;
16	int usecount;
17};
18
19struct nvkm_fifo_chan {
20	const struct nvkm_fifo_chan_func *func;
21	struct nvkm_fifo *fifo;
22	u64 engines;
23	struct nvkm_object object;
24
25	struct list_head head;
26	u16 chid;
27	struct nvkm_gpuobj *inst;
28	struct nvkm_gpuobj *push;
29	struct nvkm_vmm *vmm;
30#ifdef __NetBSD__
31	bus_space_tag_t bst;
32	bus_space_handle_t bsh;
33	bool mapped;
34	bool subregion;
35#else
36	void __iomem *user;
37#endif
38	u64 addr;
39	u32 size;
40
41	struct nvkm_fifo_engn engn[NVKM_SUBDEV_NR];
42};
43
44struct nvkm_fifo {
45	const struct nvkm_fifo_func *func;
46	struct nvkm_engine engine;
47
48	DECLARE_BITMAP(mask, NVKM_FIFO_CHID_NR);
49	int nr;
50	struct list_head chan;
51	spinlock_t lock;
52
53	struct nvkm_event uevent; /* async user trigger */
54	struct nvkm_event cevent; /* channel creation event */
55	struct nvkm_event kevent; /* channel killed */
56};
57
58void nvkm_fifo_fault(struct nvkm_fifo *, struct nvkm_fault_data *);
59void nvkm_fifo_pause(struct nvkm_fifo *, unsigned long *);
60void nvkm_fifo_start(struct nvkm_fifo *, unsigned long *);
61
62void nvkm_fifo_chan_put(struct nvkm_fifo *, unsigned long flags,
63			struct nvkm_fifo_chan **);
64struct nvkm_fifo_chan *
65nvkm_fifo_chan_inst(struct nvkm_fifo *, u64 inst, unsigned long *flags);
66struct nvkm_fifo_chan *
67nvkm_fifo_chan_chid(struct nvkm_fifo *, int chid, unsigned long *flags);
68
69int nv04_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
70int nv10_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
71int nv17_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
72int nv40_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
73int nv50_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
74int g84_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
75int gf100_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
76int gk104_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
77int gk110_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
78int gk208_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
79int gk20a_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
80int gm107_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
81int gm200_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
82int gm20b_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
83int gp100_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
84int gp10b_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
85int gv100_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
86int tu102_fifo_new(struct nvkm_device *, int, struct nvkm_fifo **);
87#endif
88