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