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