1/* SPDX-License-Identifier: MIT */ 2#ifndef __NVKM_FIFO_PRIV_H__ 3#define __NVKM_FIFO_PRIV_H__ 4#define nvkm_fifo(p) container_of((p), struct nvkm_fifo, engine) 5#include <engine/fifo.h> 6#include <core/enum.h> 7struct nvkm_cctx; 8struct nvkm_cgrp; 9struct nvkm_engn; 10struct nvkm_memory; 11struct nvkm_runl; 12struct nvkm_runq; 13struct nvkm_vctx; 14 15struct nvkm_fifo_func { 16 void (*dtor)(struct nvkm_fifo *); 17 18 int (*chid_nr)(struct nvkm_fifo *); 19 int (*chid_ctor)(struct nvkm_fifo *, int nr); 20 int (*runq_nr)(struct nvkm_fifo *); 21 int (*runl_ctor)(struct nvkm_fifo *); 22 23 void (*init)(struct nvkm_fifo *); 24 void (*init_pbdmas)(struct nvkm_fifo *, u32 mask); 25 26 irqreturn_t (*intr)(struct nvkm_inth *); 27 void (*intr_mmu_fault_unit)(struct nvkm_fifo *, int unit); 28 void (*intr_ctxsw_timeout)(struct nvkm_fifo *, u32 engm); 29 30 const struct nvkm_fifo_func_mmu_fault { 31 void (*recover)(struct nvkm_fifo *, struct nvkm_fault_data *); 32 const struct nvkm_enum *access; 33 const struct nvkm_enum *engine; 34 const struct nvkm_enum *reason; 35 const struct nvkm_enum *hubclient; 36 const struct nvkm_enum *gpcclient; 37 } *mmu_fault; 38 39 void (*pause)(struct nvkm_fifo *, unsigned long *); 40 void (*start)(struct nvkm_fifo *, unsigned long *); 41 42 int (*nonstall_ctor)(struct nvkm_fifo *); 43 const struct nvkm_event_func *nonstall; 44 45 const struct nvkm_runl_func *runl; 46 const struct nvkm_runq_func *runq; 47 const struct nvkm_engn_func *engn; 48 const struct nvkm_engn_func *engn_sw; 49 const struct nvkm_engn_func *engn_ce; 50 51 struct nvkm_fifo_func_cgrp { 52 struct nvkm_sclass user; 53 const struct nvkm_cgrp_func *func; 54 bool force; 55 } cgrp; 56 57 struct nvkm_fifo_func_chan { 58 struct nvkm_sclass user; 59 const struct nvkm_chan_func *func; 60 } chan; 61}; 62 63int r535_fifo_new(const struct nvkm_fifo_func *, struct nvkm_device *, enum nvkm_subdev_type, int, 64 struct nvkm_fifo **); 65int nvkm_fifo_new_(const struct nvkm_fifo_func *, struct nvkm_device *, enum nvkm_subdev_type, int, 66 struct nvkm_fifo **); 67 68int nv04_fifo_chid_ctor(struct nvkm_fifo *, int); 69int nv04_fifo_runl_ctor(struct nvkm_fifo *); 70void nv04_fifo_init(struct nvkm_fifo *); 71irqreturn_t nv04_fifo_intr(struct nvkm_inth *); 72void nv04_fifo_pause(struct nvkm_fifo *, unsigned long *); 73void nv04_fifo_start(struct nvkm_fifo *, unsigned long *); 74extern const struct nvkm_runl_func nv04_runl; 75extern const struct nvkm_engn_func nv04_engn; 76extern const struct nvkm_cgrp_func nv04_cgrp; 77extern const struct nvkm_chan_func_inst nv04_chan_inst; 78extern const struct nvkm_chan_func_userd nv04_chan_userd; 79void nv04_chan_ramfc_clear(struct nvkm_chan *); 80void nv04_chan_start(struct nvkm_chan *); 81void nv04_chan_stop(struct nvkm_chan *); 82void nv04_eobj_ramht_del(struct nvkm_chan *, int); 83 84int nv10_fifo_chid_nr(struct nvkm_fifo *); 85 86int nv50_fifo_chid_nr(struct nvkm_fifo *); 87int nv50_fifo_chid_ctor(struct nvkm_fifo *, int); 88void nv50_fifo_init(struct nvkm_fifo *); 89extern const struct nvkm_runl_func nv50_runl; 90int nv50_runl_update(struct nvkm_runl *); 91int nv50_runl_wait(struct nvkm_runl *); 92extern const struct nvkm_engn_func nv50_engn_sw; 93extern const struct nvkm_chan_func_inst nv50_chan_inst; 94extern const struct nvkm_chan_func_userd nv50_chan_userd; 95void nv50_chan_unbind(struct nvkm_chan *); 96void nv50_chan_start(struct nvkm_chan *); 97void nv50_chan_stop(struct nvkm_chan *); 98void nv50_chan_preempt(struct nvkm_chan *); 99int nv50_eobj_ramht_add(struct nvkm_engn *, struct nvkm_object *, struct nvkm_chan *); 100void nv50_eobj_ramht_del(struct nvkm_chan *, int); 101 102extern const struct nvkm_event_func g84_fifo_nonstall; 103extern const struct nvkm_engn_func g84_engn; 104extern const struct nvkm_chan_func g84_chan; 105 106int gf100_fifo_chid_ctor(struct nvkm_fifo *, int); 107int gf100_fifo_runq_nr(struct nvkm_fifo *); 108bool gf100_fifo_intr_pbdma(struct nvkm_fifo *); 109void gf100_fifo_intr_mmu_fault(struct nvkm_fifo *); 110void gf100_fifo_intr_mmu_fault_unit(struct nvkm_fifo *, int); 111void gf100_fifo_intr_sched(struct nvkm_fifo *); 112void gf100_fifo_intr_ctxsw_timeout(struct nvkm_fifo *, u32); 113void gf100_fifo_mmu_fault_recover(struct nvkm_fifo *, struct nvkm_fault_data *); 114extern const struct nvkm_enum gf100_fifo_mmu_fault_access[]; 115extern const struct nvkm_event_func gf100_fifo_nonstall; 116bool gf100_runl_preempt_pending(struct nvkm_runl *); 117void gf100_runq_init(struct nvkm_runq *); 118bool gf100_runq_intr(struct nvkm_runq *, struct nvkm_runl *); 119void gf100_engn_mmu_fault_trigger(struct nvkm_engn *); 120bool gf100_engn_mmu_fault_triggered(struct nvkm_engn *); 121extern const struct nvkm_engn_func gf100_engn_sw; 122extern const struct nvkm_chan_func_inst gf100_chan_inst; 123void gf100_chan_userd_clear(struct nvkm_chan *); 124void gf100_chan_preempt(struct nvkm_chan *); 125 126int gk104_fifo_chid_nr(struct nvkm_fifo *); 127int gk104_fifo_runl_ctor(struct nvkm_fifo *); 128void gk104_fifo_init(struct nvkm_fifo *); 129void gk104_fifo_init_pbdmas(struct nvkm_fifo *, u32); 130irqreturn_t gk104_fifo_intr(struct nvkm_inth *); 131void gk104_fifo_intr_runlist(struct nvkm_fifo *); 132void gk104_fifo_intr_chsw(struct nvkm_fifo *); 133void gk104_fifo_intr_bind(struct nvkm_fifo *); 134extern const struct nvkm_fifo_func_mmu_fault gk104_fifo_mmu_fault; 135extern const struct nvkm_enum gk104_fifo_mmu_fault_reason[]; 136extern const struct nvkm_enum gk104_fifo_mmu_fault_hubclient[]; 137extern const struct nvkm_enum gk104_fifo_mmu_fault_gpcclient[]; 138void gk104_runl_insert_chan(struct nvkm_chan *, struct nvkm_memory *, u64); 139void gk104_runl_commit(struct nvkm_runl *, struct nvkm_memory *, u32, int); 140bool gk104_runl_pending(struct nvkm_runl *); 141void gk104_runl_block(struct nvkm_runl *, u32); 142void gk104_runl_allow(struct nvkm_runl *, u32); 143void gk104_runl_fault_clear(struct nvkm_runl *); 144extern const struct nvkm_runq_func gk104_runq; 145void gk104_runq_init(struct nvkm_runq *); 146bool gk104_runq_intr(struct nvkm_runq *, struct nvkm_runl *); 147extern const struct nvkm_bitfield gk104_runq_intr_0_names[]; 148bool gk104_runq_idle(struct nvkm_runq *); 149extern const struct nvkm_engn_func gk104_engn; 150bool gk104_engn_chsw(struct nvkm_engn *); 151int gk104_engn_cxid(struct nvkm_engn *, bool *cgid); 152int gk104_ectx_ctor(struct nvkm_engn *, struct nvkm_vctx *); 153extern const struct nvkm_engn_func gk104_engn_ce; 154extern const struct nvkm_chan_func_userd gk104_chan_userd; 155extern const struct nvkm_chan_func_ramfc gk104_chan_ramfc; 156void gk104_chan_bind(struct nvkm_chan *); 157void gk104_chan_bind_inst(struct nvkm_chan *); 158void gk104_chan_unbind(struct nvkm_chan *); 159void gk104_chan_start(struct nvkm_chan *); 160void gk104_chan_stop(struct nvkm_chan *); 161 162int gk110_fifo_chid_ctor(struct nvkm_fifo *, int); 163extern const struct nvkm_runl_func gk110_runl; 164extern const struct nvkm_cgrp_func gk110_cgrp; 165void gk110_runl_insert_cgrp(struct nvkm_cgrp *, struct nvkm_memory *, u64); 166extern const struct nvkm_chan_func gk110_chan; 167void gk110_chan_preempt(struct nvkm_chan *); 168 169extern const struct nvkm_runq_func gk208_runq; 170void gk208_runq_init(struct nvkm_runq *); 171 172void gm107_fifo_intr_mmu_fault_unit(struct nvkm_fifo *, int); 173extern const struct nvkm_fifo_func_mmu_fault gm107_fifo_mmu_fault; 174extern const struct nvkm_runl_func gm107_runl; 175extern const struct nvkm_chan_func gm107_chan; 176 177int gm200_fifo_chid_nr(struct nvkm_fifo *); 178int gm200_fifo_runq_nr(struct nvkm_fifo *); 179 180extern const struct nvkm_enum gv100_fifo_mmu_fault_access[]; 181extern const struct nvkm_enum gv100_fifo_mmu_fault_reason[]; 182extern const struct nvkm_enum gv100_fifo_mmu_fault_hubclient[]; 183extern const struct nvkm_enum gv100_fifo_mmu_fault_gpcclient[]; 184void gv100_runl_insert_cgrp(struct nvkm_cgrp *, struct nvkm_memory *, u64); 185void gv100_runl_insert_chan(struct nvkm_chan *, struct nvkm_memory *, u64); 186void gv100_runl_preempt(struct nvkm_runl *); 187extern const struct nvkm_runq_func gv100_runq; 188extern const struct nvkm_engn_func gv100_engn; 189void gv100_ectx_bind(struct nvkm_engn *, struct nvkm_cctx *, struct nvkm_chan *); 190extern const struct nvkm_engn_func gv100_engn_ce; 191int gv100_ectx_ce_ctor(struct nvkm_engn *, struct nvkm_vctx *); 192void gv100_ectx_ce_bind(struct nvkm_engn *, struct nvkm_cctx *, struct nvkm_chan *); 193extern const struct nvkm_chan_func_userd gv100_chan_userd; 194extern const struct nvkm_chan_func_ramfc gv100_chan_ramfc; 195 196void tu102_fifo_intr_ctxsw_timeout_info(struct nvkm_engn *, u32 info); 197extern const struct nvkm_fifo_func_mmu_fault tu102_fifo_mmu_fault; 198 199int ga100_fifo_runl_ctor(struct nvkm_fifo *); 200int ga100_fifo_nonstall_ctor(struct nvkm_fifo *); 201extern const struct nvkm_event_func ga100_fifo_nonstall; 202extern const struct nvkm_runl_func ga100_runl; 203extern const struct nvkm_runq_func ga100_runq; 204extern const struct nvkm_engn_func ga100_engn; 205extern const struct nvkm_engn_func ga100_engn_ce; 206extern const struct nvkm_cgrp_func ga100_cgrp; 207extern const struct nvkm_chan_func ga100_chan; 208 209int nvkm_uchan_new(struct nvkm_fifo *, struct nvkm_cgrp *, const struct nvkm_oclass *, 210 void *argv, u32 argc, struct nvkm_object **); 211int nvkm_ucgrp_new(struct nvkm_fifo *, const struct nvkm_oclass *, void *argv, u32 argc, 212 struct nvkm_object **); 213#endif 214