1 #ifndef __NOUVEAU_FENCE_H__
2 #define __NOUVEAU_FENCE_H__
4 #include <linux/fence.h>
5 #include <nvif/notify.h>
10 struct nouveau_fence
{
13 struct list_head head
;
17 struct nouveau_channel __rcu
*channel
;
18 unsigned long timeout
;
21 int nouveau_fence_new(struct nouveau_channel
*, bool sysmem
,
22 struct nouveau_fence
**);
23 void nouveau_fence_unref(struct nouveau_fence
**);
25 int nouveau_fence_emit(struct nouveau_fence
*, struct nouveau_channel
*);
26 bool nouveau_fence_done(struct nouveau_fence
*);
27 void nouveau_fence_work(struct fence
*, void (*)(void *), void *);
28 int nouveau_fence_wait(struct nouveau_fence
*, bool lazy
, bool intr
);
29 int nouveau_fence_sync(struct nouveau_bo
*, struct nouveau_channel
*, bool exclusive
, bool intr
);
31 struct nouveau_fence_chan
{
33 struct kref fence_ref
;
35 struct list_head pending
;
36 struct list_head flip
;
38 int (*emit
)(struct nouveau_fence
*);
39 int (*sync
)(struct nouveau_fence
*, struct nouveau_channel
*,
40 struct nouveau_channel
*);
41 u32 (*read
)(struct nouveau_channel
*);
42 int (*emit32
)(struct nouveau_channel
*, u64
, u32
);
43 int (*sync32
)(struct nouveau_channel
*, u64
, u32
);
49 struct nvif_notify notify
;
53 struct nouveau_fence_priv
{
54 void (*dtor
)(struct nouveau_drm
*);
55 bool (*suspend
)(struct nouveau_drm
*);
56 void (*resume
)(struct nouveau_drm
*);
57 int (*context_new
)(struct nouveau_channel
*);
58 void (*context_del
)(struct nouveau_channel
*);
60 u32 contexts
, context_base
;
64 #define nouveau_fence(drm) ((struct nouveau_fence_priv *)(drm)->fence)
66 void nouveau_fence_context_new(struct nouveau_channel
*, struct nouveau_fence_chan
*);
67 void nouveau_fence_context_del(struct nouveau_fence_chan
*);
68 void nouveau_fence_context_free(struct nouveau_fence_chan
*);
70 int nv04_fence_create(struct nouveau_drm
*);
71 int nv04_fence_mthd(struct nouveau_channel
*, u32
, u32
, u32
);
73 int nv10_fence_emit(struct nouveau_fence
*);
74 int nv17_fence_sync(struct nouveau_fence
*, struct nouveau_channel
*,
75 struct nouveau_channel
*);
76 u32
nv10_fence_read(struct nouveau_channel
*);
77 void nv10_fence_context_del(struct nouveau_channel
*);
78 void nv10_fence_destroy(struct nouveau_drm
*);
79 int nv10_fence_create(struct nouveau_drm
*);
81 int nv17_fence_create(struct nouveau_drm
*);
82 void nv17_fence_resume(struct nouveau_drm
*drm
);
84 int nv50_fence_create(struct nouveau_drm
*);
85 int nv84_fence_create(struct nouveau_drm
*);
86 int nvc0_fence_create(struct nouveau_drm
*);
88 int nouveau_flip_complete(void *chan
);
90 struct nv84_fence_chan
{
91 struct nouveau_fence_chan base
;
93 struct nvkm_vma vma_gart
;
94 struct nvkm_vma dispc_vma
[4];
97 struct nv84_fence_priv
{
98 struct nouveau_fence_priv base
;
99 struct nouveau_bo
*bo
;
100 struct nouveau_bo
*bo_gart
;
104 u64
nv84_fence_crtc(struct nouveau_channel
*, int);
105 int nv84_fence_context_new(struct nouveau_channel
*);