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