0001
0002 #ifndef __NVKM_FIFO_H__
0003 #define __NVKM_FIFO_H__
0004 #include <core/engine.h>
0005 #include <core/object.h>
0006 #include <core/event.h>
0007 struct nvkm_fault_data;
0008
0009 #define NVKM_FIFO_CHID_NR 4096
0010 #define NVKM_FIFO_ENGN_NR 16
0011
0012 struct nvkm_fifo_engn {
0013 struct nvkm_object *object;
0014 int refcount;
0015 int usecount;
0016 };
0017
0018 struct nvkm_fifo_chan {
0019 const struct nvkm_fifo_chan_func *func;
0020 struct nvkm_fifo *fifo;
0021 u32 engm;
0022 struct nvkm_object object;
0023
0024 struct list_head head;
0025 u16 chid;
0026 struct nvkm_gpuobj *inst;
0027 struct nvkm_gpuobj *push;
0028 struct nvkm_vmm *vmm;
0029 u64 addr;
0030 u32 size;
0031
0032 struct nvkm_fifo_engn engn[NVKM_FIFO_ENGN_NR];
0033 };
0034
0035 struct nvkm_fifo {
0036 const struct nvkm_fifo_func *func;
0037 struct nvkm_engine engine;
0038
0039 DECLARE_BITMAP(mask, NVKM_FIFO_CHID_NR);
0040 int nr;
0041 struct list_head chan;
0042 spinlock_t lock;
0043 struct mutex mutex;
0044
0045 struct nvkm_event uevent;
0046 struct nvkm_event kevent;
0047 };
0048
0049 void nvkm_fifo_fault(struct nvkm_fifo *, struct nvkm_fault_data *);
0050 void nvkm_fifo_pause(struct nvkm_fifo *, unsigned long *);
0051 void nvkm_fifo_start(struct nvkm_fifo *, unsigned long *);
0052
0053 void nvkm_fifo_chan_put(struct nvkm_fifo *, unsigned long flags,
0054 struct nvkm_fifo_chan **);
0055 struct nvkm_fifo_chan *
0056 nvkm_fifo_chan_inst(struct nvkm_fifo *, u64 inst, unsigned long *flags);
0057 struct nvkm_fifo_chan *
0058 nvkm_fifo_chan_chid(struct nvkm_fifo *, int chid, unsigned long *flags);
0059
0060 int nv04_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0061 int nv10_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0062 int nv17_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0063 int nv40_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0064 int nv50_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0065 int g84_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0066 int gf100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0067 int gk104_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0068 int gk110_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0069 int gk208_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0070 int gk20a_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0071 int gm107_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0072 int gm200_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0073 int gm20b_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0074 int gp100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0075 int gp10b_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0076 int gv100_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0077 int tu102_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0078 int ga102_fifo_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fifo **);
0079 #endif