1 #ifndef __NOUVEAU_FENCE_H__ 2 #define __NOUVEAU_FENCE_H__ 3 4 struct nouveau_drm; 5 6 struct nouveau_fence { 7 struct list_head head; 8 struct kref kref; 9 10 bool sysmem; 11 12 struct nouveau_channel *channel; 13 unsigned long timeout; 14 u32 sequence; 15 }; 16 17 int nouveau_fence_new(struct nouveau_channel *, bool sysmem, 18 struct nouveau_fence **); 19 struct nouveau_fence * 20 nouveau_fence_ref(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_fence *, struct nouveau_channel *); 27 28 struct nouveau_fence_chan { 29 struct list_head pending; 30 struct list_head flip; 31 32 int (*emit)(struct nouveau_fence *); 33 int (*sync)(struct nouveau_fence *, struct nouveau_channel *, 34 struct nouveau_channel *); 35 u32 (*read)(struct nouveau_channel *); 36 int (*emit32)(struct nouveau_channel *, u64, u32); 37 int (*sync32)(struct nouveau_channel *, u64, u32); 38 39 spinlock_t lock; 40 u32 sequence; 41 }; 42 43 struct nouveau_fence_priv { 44 void (*dtor)(struct nouveau_drm *); 45 bool (*suspend)(struct nouveau_drm *); 46 void (*resume)(struct nouveau_drm *); 47 int (*context_new)(struct nouveau_channel *); 48 void (*context_del)(struct nouveau_channel *); 49 50 wait_queue_head_t waiting; 51 bool uevent; 52 }; 53 54 #define nouveau_fence(drm) ((struct nouveau_fence_priv *)(drm)->fence) 55 56 void nouveau_fence_context_new(struct nouveau_fence_chan *); 57 void nouveau_fence_context_del(struct nouveau_fence_chan *); 58 59 int nv04_fence_create(struct nouveau_drm *); 60 int nv04_fence_mthd(struct nouveau_channel *, u32, u32, u32); 61 62 int nv10_fence_emit(struct nouveau_fence *); 63 int nv17_fence_sync(struct nouveau_fence *, struct nouveau_channel *, 64 struct nouveau_channel *); 65 u32 nv10_fence_read(struct nouveau_channel *); 66 void nv10_fence_context_del(struct nouveau_channel *); 67 void nv10_fence_destroy(struct nouveau_drm *); 68 int nv10_fence_create(struct nouveau_drm *); 69 70 int nv17_fence_create(struct nouveau_drm *); 71 void nv17_fence_resume(struct nouveau_drm *drm); 72 73 int nv50_fence_create(struct nouveau_drm *); 74 int nv84_fence_create(struct nouveau_drm *); 75 int nvc0_fence_create(struct nouveau_drm *); 76 77 int nouveau_flip_complete(void *chan); 78 79 struct nv84_fence_chan { 80 struct nouveau_fence_chan base; 81 struct nouveau_vma vma; 82 struct nouveau_vma vma_gart; 83 struct nouveau_vma dispc_vma[4]; 84 }; 85 86 struct nv84_fence_priv { 87 struct nouveau_fence_priv base; 88 struct nouveau_bo *bo; 89 struct nouveau_bo *bo_gart; 90 u32 *suspend; 91 }; 92 93 u64 nv84_fence_crtc(struct nouveau_channel *, int); 94 int nv84_fence_context_new(struct nouveau_channel *); 95 96 #endif 97