1*4882a593Smuzhiyun /* SPDX-License-Identifier: MIT */ 2*4882a593Smuzhiyun #ifndef __NOUVEAU_FENCE_H__ 3*4882a593Smuzhiyun #define __NOUVEAU_FENCE_H__ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/dma-fence.h> 6*4882a593Smuzhiyun #include <nvif/notify.h> 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun struct nouveau_drm; 9*4882a593Smuzhiyun struct nouveau_bo; 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun struct nouveau_fence { 12*4882a593Smuzhiyun struct dma_fence base; 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun struct list_head head; 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun struct nouveau_channel __rcu *channel; 17*4882a593Smuzhiyun unsigned long timeout; 18*4882a593Smuzhiyun }; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun int nouveau_fence_new(struct nouveau_channel *, bool sysmem, 21*4882a593Smuzhiyun struct nouveau_fence **); 22*4882a593Smuzhiyun void nouveau_fence_unref(struct nouveau_fence **); 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun int nouveau_fence_emit(struct nouveau_fence *, struct nouveau_channel *); 25*4882a593Smuzhiyun bool nouveau_fence_done(struct nouveau_fence *); 26*4882a593Smuzhiyun int nouveau_fence_wait(struct nouveau_fence *, bool lazy, bool intr); 27*4882a593Smuzhiyun int nouveau_fence_sync(struct nouveau_bo *, struct nouveau_channel *, bool exclusive, bool intr); 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun struct nouveau_fence_chan { 30*4882a593Smuzhiyun spinlock_t lock; 31*4882a593Smuzhiyun struct kref fence_ref; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun struct list_head pending; 34*4882a593Smuzhiyun struct list_head flip; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun int (*emit)(struct nouveau_fence *); 37*4882a593Smuzhiyun int (*sync)(struct nouveau_fence *, struct nouveau_channel *, 38*4882a593Smuzhiyun struct nouveau_channel *); 39*4882a593Smuzhiyun u32 (*read)(struct nouveau_channel *); 40*4882a593Smuzhiyun int (*emit32)(struct nouveau_channel *, u64, u32); 41*4882a593Smuzhiyun int (*sync32)(struct nouveau_channel *, u64, u32); 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun u32 sequence; 44*4882a593Smuzhiyun u32 context; 45*4882a593Smuzhiyun char name[32]; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun struct nvif_notify notify; 48*4882a593Smuzhiyun int notify_ref, dead; 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun struct nouveau_fence_priv { 52*4882a593Smuzhiyun void (*dtor)(struct nouveau_drm *); 53*4882a593Smuzhiyun bool (*suspend)(struct nouveau_drm *); 54*4882a593Smuzhiyun void (*resume)(struct nouveau_drm *); 55*4882a593Smuzhiyun int (*context_new)(struct nouveau_channel *); 56*4882a593Smuzhiyun void (*context_del)(struct nouveau_channel *); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun bool uevent; 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun #define nouveau_fence(drm) ((struct nouveau_fence_priv *)(drm)->fence) 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun void nouveau_fence_context_new(struct nouveau_channel *, struct nouveau_fence_chan *); 64*4882a593Smuzhiyun void nouveau_fence_context_del(struct nouveau_fence_chan *); 65*4882a593Smuzhiyun void nouveau_fence_context_free(struct nouveau_fence_chan *); 66*4882a593Smuzhiyun void nouveau_fence_context_kill(struct nouveau_fence_chan *, int error); 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun int nv04_fence_create(struct nouveau_drm *); 69*4882a593Smuzhiyun int nv04_fence_mthd(struct nouveau_channel *, u32, u32, u32); 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun int nv10_fence_emit(struct nouveau_fence *); 72*4882a593Smuzhiyun int nv17_fence_sync(struct nouveau_fence *, struct nouveau_channel *, 73*4882a593Smuzhiyun struct nouveau_channel *); 74*4882a593Smuzhiyun u32 nv10_fence_read(struct nouveau_channel *); 75*4882a593Smuzhiyun void nv10_fence_context_del(struct nouveau_channel *); 76*4882a593Smuzhiyun void nv10_fence_destroy(struct nouveau_drm *); 77*4882a593Smuzhiyun int nv10_fence_create(struct nouveau_drm *); 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun int nv17_fence_create(struct nouveau_drm *); 80*4882a593Smuzhiyun void nv17_fence_resume(struct nouveau_drm *drm); 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun int nv50_fence_create(struct nouveau_drm *); 83*4882a593Smuzhiyun int nv84_fence_create(struct nouveau_drm *); 84*4882a593Smuzhiyun int nvc0_fence_create(struct nouveau_drm *); 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun struct nv84_fence_chan { 87*4882a593Smuzhiyun struct nouveau_fence_chan base; 88*4882a593Smuzhiyun struct nouveau_vma *vma; 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun struct nv84_fence_priv { 92*4882a593Smuzhiyun struct nouveau_fence_priv base; 93*4882a593Smuzhiyun struct nouveau_bo *bo; 94*4882a593Smuzhiyun u32 *suspend; 95*4882a593Smuzhiyun struct mutex mutex; 96*4882a593Smuzhiyun }; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun int nv84_fence_context_new(struct nouveau_channel *); 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun #endif 101