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