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