1f5e45689SBen Skeggs /* SPDX-License-Identifier: MIT */ 2f5e45689SBen Skeggs #ifndef __NVKM_CGRP_H__ 3f5e45689SBen Skeggs #define __NVKM_CGRP_H__ 4f5e45689SBen Skeggs #include <core/os.h> 5468fae7bSBen Skeggs struct nvkm_chan; 6f48dd293SBen Skeggs struct nvkm_client; 7f48dd293SBen Skeggs 8f48dd293SBen Skeggs struct nvkm_vctx { 9f48dd293SBen Skeggs struct nvkm_ectx *ectx; 10f48dd293SBen Skeggs struct nvkm_vmm *vmm; 11f48dd293SBen Skeggs refcount_t refs; 12f48dd293SBen Skeggs 13*8ab849d6SBen Skeggs struct nvkm_gpuobj *inst; 14*8ab849d6SBen Skeggs struct nvkm_vma *vma; 15*8ab849d6SBen Skeggs 16f48dd293SBen Skeggs struct list_head head; 17f48dd293SBen Skeggs }; 18f48dd293SBen Skeggs 19f48dd293SBen Skeggs struct nvkm_ectx { 20f48dd293SBen Skeggs struct nvkm_engn *engn; 21f48dd293SBen Skeggs refcount_t refs; 22*8ab849d6SBen Skeggs refcount_t uses; 23*8ab849d6SBen Skeggs 24*8ab849d6SBen Skeggs struct nvkm_object *object; 25f48dd293SBen Skeggs 26f48dd293SBen Skeggs struct list_head head; 27f48dd293SBen Skeggs }; 288c4e9f9dSBen Skeggs 29f5e45689SBen Skeggs struct nvkm_cgrp { 30f5e45689SBen Skeggs const struct nvkm_cgrp_func { 31acff9415SBen Skeggs void (*preempt)(struct nvkm_cgrp *); 32f5e45689SBen Skeggs } *func; 33468fae7bSBen Skeggs char name[64]; 34468fae7bSBen Skeggs struct nvkm_runl *runl; 35468fae7bSBen Skeggs struct nvkm_vmm *vmm; 36468fae7bSBen Skeggs bool hw; 378c4e9f9dSBen Skeggs int id; 38468fae7bSBen Skeggs struct kref kref; 39468fae7bSBen Skeggs 40b084fff2SBen Skeggs struct list_head chans; 41468fae7bSBen Skeggs int chan_nr; 42468fae7bSBen Skeggs 43468fae7bSBen Skeggs spinlock_t lock; /* protects irq handler channel (group) lookup */ 44468fae7bSBen Skeggs 45f48dd293SBen Skeggs struct list_head ectxs; 46f48dd293SBen Skeggs struct list_head vctxs; 47f48dd293SBen Skeggs struct mutex mutex; 48f48dd293SBen Skeggs 494d60100aSBen Skeggs #define NVKM_CGRP_RC_NONE 0 504d60100aSBen Skeggs #define NVKM_CGRP_RC_PENDING 1 514d60100aSBen Skeggs #define NVKM_CGRP_RC_RUNNING 2 524d60100aSBen Skeggs atomic_t rc; 534d60100aSBen Skeggs 548c4e9f9dSBen Skeggs struct list_head head; 558c4e9f9dSBen Skeggs }; 56468fae7bSBen Skeggs 57468fae7bSBen Skeggs int nvkm_cgrp_new(struct nvkm_runl *, const char *name, struct nvkm_vmm *, bool hw, 58468fae7bSBen Skeggs struct nvkm_cgrp **); 59468fae7bSBen Skeggs struct nvkm_cgrp *nvkm_cgrp_ref(struct nvkm_cgrp *); 60468fae7bSBen Skeggs void nvkm_cgrp_unref(struct nvkm_cgrp **); 61f48dd293SBen Skeggs int nvkm_cgrp_vctx_get(struct nvkm_cgrp *, struct nvkm_engn *, struct nvkm_chan *, 62f48dd293SBen Skeggs struct nvkm_vctx **, struct nvkm_client *); 63f48dd293SBen Skeggs void nvkm_cgrp_vctx_put(struct nvkm_cgrp *, struct nvkm_vctx **); 64468fae7bSBen Skeggs 654d60100aSBen Skeggs void nvkm_cgrp_put(struct nvkm_cgrp **, unsigned long irqflags); 664d60100aSBen Skeggs 67b084fff2SBen Skeggs #define nvkm_cgrp_foreach_chan(chan,cgrp) list_for_each_entry((chan), &(cgrp)->chans, head) 684d60100aSBen Skeggs #define nvkm_cgrp_foreach_chan_safe(chan,ctmp,cgrp) \ 69b084fff2SBen Skeggs list_for_each_entry_safe((chan), (ctmp), &(cgrp)->chans, head) 704d60100aSBen Skeggs 71468fae7bSBen Skeggs #define CGRP_PRCLI(c,l,p,f,a...) RUNL_PRINT((c)->runl, l, p, "%04x:[%s]"f, (c)->id, (c)->name, ##a) 72468fae7bSBen Skeggs #define CGRP_PRINT(c,l,p,f,a...) RUNL_PRINT((c)->runl, l, p, "%04x:"f, (c)->id, ##a) 73468fae7bSBen Skeggs #define CGRP_ERROR(c,f,a...) CGRP_PRCLI((c), ERROR, err, " "f"\n", ##a) 74468fae7bSBen Skeggs #define CGRP_TRACE(c,f,a...) CGRP_PRINT((c), TRACE, info, " "f"\n", ##a) 758c4e9f9dSBen Skeggs #endif 76