1b7019ac5SIlia Mirkin /* SPDX-License-Identifier: MIT */ 29a65a38cSBen Skeggs #ifndef __NVKM_FIFO_PRIV_H__ 39a65a38cSBen Skeggs #define __NVKM_FIFO_PRIV_H__ 413de7f46SBen Skeggs #define nvkm_fifo(p) container_of((p), struct nvkm_fifo, engine) 59a65a38cSBen Skeggs #include <engine/fifo.h> 6923f1ff5SBen Skeggs #include <core/enum.h> 78ab849d6SBen Skeggs struct nvkm_cctx; 8f5e45689SBen Skeggs struct nvkm_cgrp; 94d60100aSBen Skeggs struct nvkm_engn; 109be9c606SBen Skeggs struct nvkm_memory; 11923f1ff5SBen Skeggs struct nvkm_runl; 1287c86024SBen Skeggs struct nvkm_runq; 138ab849d6SBen Skeggs struct nvkm_vctx; 149a65a38cSBen Skeggs 1513de7f46SBen Skeggs struct nvkm_fifo_func { 168c18138cSBen Skeggs int (*chid_nr)(struct nvkm_fifo *); 17800ac1f8SBen Skeggs int (*chid_ctor)(struct nvkm_fifo *, int nr); 181c488ba9SBen Skeggs int (*runq_nr)(struct nvkm_fifo *); 19d94470e9SBen Skeggs int (*runl_ctor)(struct nvkm_fifo *); 208c18138cSBen Skeggs 2113de7f46SBen Skeggs void (*init)(struct nvkm_fifo *); 22965c41d9SBen Skeggs void (*init_pbdmas)(struct nvkm_fifo *, u32 mask); 23965c41d9SBen Skeggs 242fc71a05SBen Skeggs irqreturn_t (*intr)(struct nvkm_inth *); 259be9c606SBen Skeggs void (*intr_mmu_fault_unit)(struct nvkm_fifo *, int unit); 264d60100aSBen Skeggs void (*intr_ctxsw_timeout)(struct nvkm_fifo *, u32 engm); 279be9c606SBen Skeggs 289be9c606SBen Skeggs const struct nvkm_fifo_func_mmu_fault { 299be9c606SBen Skeggs void (*recover)(struct nvkm_fifo *, struct nvkm_fault_data *); 309be9c606SBen Skeggs const struct nvkm_enum *access; 319be9c606SBen Skeggs const struct nvkm_enum *engine; 329be9c606SBen Skeggs const struct nvkm_enum *reason; 339be9c606SBen Skeggs const struct nvkm_enum *hubclient; 349be9c606SBen Skeggs const struct nvkm_enum *gpcclient; 35e43c872cSBen Skeggs } *mmu_fault; 369be9c606SBen Skeggs 3713de7f46SBen Skeggs void (*pause)(struct nvkm_fifo *, unsigned long *); 3813de7f46SBen Skeggs void (*start)(struct nvkm_fifo *, unsigned long *); 39f5e45689SBen Skeggs 40*7f4f35eaSBen Skeggs int (*nonstall_ctor)(struct nvkm_fifo *); 41d67f3b96SBen Skeggs const struct nvkm_event_func *nonstall; 42d67f3b96SBen Skeggs 43d94470e9SBen Skeggs const struct nvkm_runl_func *runl; 441c488ba9SBen Skeggs const struct nvkm_runq_func *runq; 45d94470e9SBen Skeggs const struct nvkm_engn_func *engn; 46d94470e9SBen Skeggs const struct nvkm_engn_func *engn_sw; 47d94470e9SBen Skeggs const struct nvkm_engn_func *engn_ce; 481c488ba9SBen Skeggs 49f5e45689SBen Skeggs struct nvkm_fifo_func_cgrp { 50f5e45689SBen Skeggs struct nvkm_sclass user; 51f5e45689SBen Skeggs const struct nvkm_cgrp_func *func; 52f5e45689SBen Skeggs bool force; 53f5e45689SBen Skeggs } cgrp; 54f5e45689SBen Skeggs 55f5e45689SBen Skeggs struct nvkm_fifo_func_chan { 56f5e45689SBen Skeggs struct nvkm_sclass user; 57f5e45689SBen Skeggs const struct nvkm_chan_func *func; 58f5e45689SBen Skeggs } chan; 5913de7f46SBen Skeggs }; 6013de7f46SBen Skeggs 6106db7fdeSBen Skeggs int nvkm_fifo_new_(const struct nvkm_fifo_func *, struct nvkm_device *, enum nvkm_subdev_type, int, 6206db7fdeSBen Skeggs struct nvkm_fifo **); 638c18138cSBen Skeggs 64800ac1f8SBen Skeggs int nv04_fifo_chid_ctor(struct nvkm_fifo *, int); 65d94470e9SBen Skeggs int nv04_fifo_runl_ctor(struct nvkm_fifo *); 66800ac1f8SBen Skeggs void nv04_fifo_init(struct nvkm_fifo *); 672fc71a05SBen Skeggs irqreturn_t nv04_fifo_intr(struct nvkm_inth *); 689a65a38cSBen Skeggs void nv04_fifo_pause(struct nvkm_fifo *, unsigned long *); 699a65a38cSBen Skeggs void nv04_fifo_start(struct nvkm_fifo *, unsigned long *); 70d94470e9SBen Skeggs extern const struct nvkm_runl_func nv04_runl; 71d94470e9SBen Skeggs extern const struct nvkm_engn_func nv04_engn; 72f5e45689SBen Skeggs extern const struct nvkm_cgrp_func nv04_cgrp; 73d3e7a439SBen Skeggs extern const struct nvkm_chan_func_inst nv04_chan_inst; 74fbe9f433SBen Skeggs extern const struct nvkm_chan_func_userd nv04_chan_userd; 753647c53bSBen Skeggs void nv04_chan_ramfc_clear(struct nvkm_chan *); 7667059b9fSBen Skeggs void nv04_chan_start(struct nvkm_chan *); 7767059b9fSBen Skeggs void nv04_chan_stop(struct nvkm_chan *); 787ac29332SBen Skeggs void nv04_eobj_ramht_del(struct nvkm_chan *, int); 79cf9518b5SBen Skeggs 808c18138cSBen Skeggs int nv10_fifo_chid_nr(struct nvkm_fifo *); 818c18138cSBen Skeggs 828c18138cSBen Skeggs int nv50_fifo_chid_nr(struct nvkm_fifo *); 83800ac1f8SBen Skeggs int nv50_fifo_chid_ctor(struct nvkm_fifo *, int); 84b084fff2SBen Skeggs void nv50_fifo_init(struct nvkm_fifo *); 85d94470e9SBen Skeggs extern const struct nvkm_runl_func nv50_runl; 86b084fff2SBen Skeggs int nv50_runl_update(struct nvkm_runl *); 874a492fd5SBen Skeggs int nv50_runl_wait(struct nvkm_runl *); 88d94470e9SBen Skeggs extern const struct nvkm_engn_func nv50_engn_sw; 89d3e7a439SBen Skeggs extern const struct nvkm_chan_func_inst nv50_chan_inst; 90fbe9f433SBen Skeggs extern const struct nvkm_chan_func_userd nv50_chan_userd; 9162742b5eSBen Skeggs void nv50_chan_unbind(struct nvkm_chan *); 9267059b9fSBen Skeggs void nv50_chan_start(struct nvkm_chan *); 9367059b9fSBen Skeggs void nv50_chan_stop(struct nvkm_chan *); 94acff9415SBen Skeggs void nv50_chan_preempt(struct nvkm_chan *); 957ac29332SBen Skeggs int nv50_eobj_ramht_add(struct nvkm_engn *, struct nvkm_object *, struct nvkm_chan *); 967ac29332SBen Skeggs void nv50_eobj_ramht_del(struct nvkm_chan *, int); 978c18138cSBen Skeggs 98d67f3b96SBen Skeggs extern const struct nvkm_event_func g84_fifo_nonstall; 99d94470e9SBen Skeggs extern const struct nvkm_engn_func g84_engn; 100f5e45689SBen Skeggs extern const struct nvkm_chan_func g84_chan; 101f5e45689SBen Skeggs 102800ac1f8SBen Skeggs int gf100_fifo_chid_ctor(struct nvkm_fifo *, int); 1031c488ba9SBen Skeggs int gf100_fifo_runq_nr(struct nvkm_fifo *); 104923f1ff5SBen Skeggs bool gf100_fifo_intr_pbdma(struct nvkm_fifo *); 105e43c872cSBen Skeggs void gf100_fifo_intr_mmu_fault(struct nvkm_fifo *); 1069be9c606SBen Skeggs void gf100_fifo_intr_mmu_fault_unit(struct nvkm_fifo *, int); 1074d60100aSBen Skeggs void gf100_fifo_intr_sched(struct nvkm_fifo *); 1084d60100aSBen Skeggs void gf100_fifo_intr_ctxsw_timeout(struct nvkm_fifo *, u32); 109e43c872cSBen Skeggs void gf100_fifo_mmu_fault_recover(struct nvkm_fifo *, struct nvkm_fault_data *); 110e43c872cSBen Skeggs extern const struct nvkm_enum gf100_fifo_mmu_fault_access[]; 111d67f3b96SBen Skeggs extern const struct nvkm_event_func gf100_fifo_nonstall; 112acff9415SBen Skeggs bool gf100_runl_preempt_pending(struct nvkm_runl *); 11387c86024SBen Skeggs void gf100_runq_init(struct nvkm_runq *); 114923f1ff5SBen Skeggs bool gf100_runq_intr(struct nvkm_runq *, struct nvkm_runl *); 1154d60100aSBen Skeggs void gf100_engn_mmu_fault_trigger(struct nvkm_engn *); 1164d60100aSBen Skeggs bool gf100_engn_mmu_fault_triggered(struct nvkm_engn *); 117d94470e9SBen Skeggs extern const struct nvkm_engn_func gf100_engn_sw; 118d3e7a439SBen Skeggs extern const struct nvkm_chan_func_inst gf100_chan_inst; 119fbe9f433SBen Skeggs void gf100_chan_userd_clear(struct nvkm_chan *); 120acff9415SBen Skeggs void gf100_chan_preempt(struct nvkm_chan *); 12164f7c698SBen Skeggs 1228c18138cSBen Skeggs int gk104_fifo_chid_nr(struct nvkm_fifo *); 123d94470e9SBen Skeggs int gk104_fifo_runl_ctor(struct nvkm_fifo *); 124fbe9f433SBen Skeggs void gk104_fifo_init(struct nvkm_fifo *); 125965c41d9SBen Skeggs void gk104_fifo_init_pbdmas(struct nvkm_fifo *, u32); 1262fc71a05SBen Skeggs irqreturn_t gk104_fifo_intr(struct nvkm_inth *); 1274a492fd5SBen Skeggs void gk104_fifo_intr_runlist(struct nvkm_fifo *); 1282fc71a05SBen Skeggs void gk104_fifo_intr_chsw(struct nvkm_fifo *); 1292fc71a05SBen Skeggs void gk104_fifo_intr_bind(struct nvkm_fifo *); 1309be9c606SBen Skeggs extern const struct nvkm_fifo_func_mmu_fault gk104_fifo_mmu_fault; 131e43c872cSBen Skeggs extern const struct nvkm_enum gk104_fifo_mmu_fault_reason[]; 132e43c872cSBen Skeggs extern const struct nvkm_enum gk104_fifo_mmu_fault_hubclient[]; 133e43c872cSBen Skeggs extern const struct nvkm_enum gk104_fifo_mmu_fault_gpcclient[]; 134b084fff2SBen Skeggs void gk104_runl_insert_chan(struct nvkm_chan *, struct nvkm_memory *, u64); 135b084fff2SBen Skeggs void gk104_runl_commit(struct nvkm_runl *, struct nvkm_memory *, u32, int); 1364a492fd5SBen Skeggs bool gk104_runl_pending(struct nvkm_runl *); 1373a6bc9c2SBen Skeggs void gk104_runl_block(struct nvkm_runl *, u32); 1383a6bc9c2SBen Skeggs void gk104_runl_allow(struct nvkm_runl *, u32); 1394d60100aSBen Skeggs void gk104_runl_fault_clear(struct nvkm_runl *); 1401c488ba9SBen Skeggs extern const struct nvkm_runq_func gk104_runq; 14187c86024SBen Skeggs void gk104_runq_init(struct nvkm_runq *); 142923f1ff5SBen Skeggs bool gk104_runq_intr(struct nvkm_runq *, struct nvkm_runl *); 143923f1ff5SBen Skeggs extern const struct nvkm_bitfield gk104_runq_intr_0_names[]; 1444d60100aSBen Skeggs bool gk104_runq_idle(struct nvkm_runq *); 145d94470e9SBen Skeggs extern const struct nvkm_engn_func gk104_engn; 1464d60100aSBen Skeggs bool gk104_engn_chsw(struct nvkm_engn *); 1474d60100aSBen Skeggs int gk104_engn_cxid(struct nvkm_engn *, bool *cgid); 1488ab849d6SBen Skeggs int gk104_ectx_ctor(struct nvkm_engn *, struct nvkm_vctx *); 149d94470e9SBen Skeggs extern const struct nvkm_engn_func gk104_engn_ce; 150fbe9f433SBen Skeggs extern const struct nvkm_chan_func_userd gk104_chan_userd; 1513647c53bSBen Skeggs extern const struct nvkm_chan_func_ramfc gk104_chan_ramfc; 15262742b5eSBen Skeggs void gk104_chan_bind(struct nvkm_chan *); 15362742b5eSBen Skeggs void gk104_chan_bind_inst(struct nvkm_chan *); 15462742b5eSBen Skeggs void gk104_chan_unbind(struct nvkm_chan *); 15567059b9fSBen Skeggs void gk104_chan_start(struct nvkm_chan *); 15667059b9fSBen Skeggs void gk104_chan_stop(struct nvkm_chan *); 1578c18138cSBen Skeggs 158800ac1f8SBen Skeggs int gk110_fifo_chid_ctor(struct nvkm_fifo *, int); 159d94470e9SBen Skeggs extern const struct nvkm_runl_func gk110_runl; 160f5e45689SBen Skeggs extern const struct nvkm_cgrp_func gk110_cgrp; 161b084fff2SBen Skeggs void gk110_runl_insert_cgrp(struct nvkm_cgrp *, struct nvkm_memory *, u64); 162f5e45689SBen Skeggs extern const struct nvkm_chan_func gk110_chan; 163acff9415SBen Skeggs void gk110_chan_preempt(struct nvkm_chan *); 164f5e45689SBen Skeggs 1651c488ba9SBen Skeggs extern const struct nvkm_runq_func gk208_runq; 16687c86024SBen Skeggs void gk208_runq_init(struct nvkm_runq *); 1671c488ba9SBen Skeggs 1689be9c606SBen Skeggs void gm107_fifo_intr_mmu_fault_unit(struct nvkm_fifo *, int); 1699be9c606SBen Skeggs extern const struct nvkm_fifo_func_mmu_fault gm107_fifo_mmu_fault; 170d94470e9SBen Skeggs extern const struct nvkm_runl_func gm107_runl; 171f5e45689SBen Skeggs extern const struct nvkm_chan_func gm107_chan; 172f5e45689SBen Skeggs 1738c18138cSBen Skeggs int gm200_fifo_chid_nr(struct nvkm_fifo *); 1741c488ba9SBen Skeggs int gm200_fifo_runq_nr(struct nvkm_fifo *); 175f5e45689SBen Skeggs 176e43c872cSBen Skeggs extern const struct nvkm_enum gv100_fifo_mmu_fault_access[]; 177e43c872cSBen Skeggs extern const struct nvkm_enum gv100_fifo_mmu_fault_reason[]; 178e43c872cSBen Skeggs extern const struct nvkm_enum gv100_fifo_mmu_fault_hubclient[]; 179e43c872cSBen Skeggs extern const struct nvkm_enum gv100_fifo_mmu_fault_gpcclient[]; 180b084fff2SBen Skeggs void gv100_runl_insert_cgrp(struct nvkm_cgrp *, struct nvkm_memory *, u64); 181b084fff2SBen Skeggs void gv100_runl_insert_chan(struct nvkm_chan *, struct nvkm_memory *, u64); 1824d60100aSBen Skeggs void gv100_runl_preempt(struct nvkm_runl *); 1831c488ba9SBen Skeggs extern const struct nvkm_runq_func gv100_runq; 184d94470e9SBen Skeggs extern const struct nvkm_engn_func gv100_engn; 1858ab849d6SBen Skeggs void gv100_ectx_bind(struct nvkm_engn *, struct nvkm_cctx *, struct nvkm_chan *); 186d94470e9SBen Skeggs extern const struct nvkm_engn_func gv100_engn_ce; 1878ab849d6SBen Skeggs int gv100_ectx_ce_ctor(struct nvkm_engn *, struct nvkm_vctx *); 1888ab849d6SBen Skeggs void gv100_ectx_ce_bind(struct nvkm_engn *, struct nvkm_cctx *, struct nvkm_chan *); 189fbe9f433SBen Skeggs extern const struct nvkm_chan_func_userd gv100_chan_userd; 1903647c53bSBen Skeggs extern const struct nvkm_chan_func_ramfc gv100_chan_ramfc; 1911c488ba9SBen Skeggs 1924d60100aSBen Skeggs void tu102_fifo_intr_ctxsw_timeout_info(struct nvkm_engn *, u32 info); 1939be9c606SBen Skeggs extern const struct nvkm_fifo_func_mmu_fault tu102_fifo_mmu_fault; 1949be9c606SBen Skeggs 195*7f4f35eaSBen Skeggs int ga100_fifo_runl_ctor(struct nvkm_fifo *); 196*7f4f35eaSBen Skeggs int ga100_fifo_nonstall_ctor(struct nvkm_fifo *); 197*7f4f35eaSBen Skeggs extern const struct nvkm_event_func ga100_fifo_nonstall; 198*7f4f35eaSBen Skeggs extern const struct nvkm_runl_func ga100_runl; 199*7f4f35eaSBen Skeggs extern const struct nvkm_runq_func ga100_runq; 200*7f4f35eaSBen Skeggs extern const struct nvkm_engn_func ga100_engn; 201*7f4f35eaSBen Skeggs extern const struct nvkm_engn_func ga100_engn_ce; 202*7f4f35eaSBen Skeggs extern const struct nvkm_cgrp_func ga100_cgrp; 203*7f4f35eaSBen Skeggs extern const struct nvkm_chan_func ga100_chan; 204*7f4f35eaSBen Skeggs 205f5e45689SBen Skeggs int nvkm_uchan_new(struct nvkm_fifo *, struct nvkm_cgrp *, const struct nvkm_oclass *, 206f5e45689SBen Skeggs void *argv, u32 argc, struct nvkm_object **); 20706db7fdeSBen Skeggs int nvkm_ucgrp_new(struct nvkm_fifo *, const struct nvkm_oclass *, void *argv, u32 argc, 20806db7fdeSBen Skeggs struct nvkm_object **); 2099a65a38cSBen Skeggs #endif 210