[go: nahoru, domu]

1d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggs#ifndef __NOUVEAU_FENCE_H__
2d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggs#define __NOUVEAU_FENCE_H__
3d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggs
429ba89b2371d466ca68973525816cf10debc2655Maarten Lankhorst#include <linux/fence.h>
529ba89b2371d466ca68973525816cf10debc2655Maarten Lankhorst#include <nvif/notify.h>
629ba89b2371d466ca68973525816cf10debc2655Maarten Lankhorst
7ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggsstruct nouveau_drm;
829ba89b2371d466ca68973525816cf10debc2655Maarten Lankhorststruct nouveau_bo;
9ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs
10d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggsstruct nouveau_fence {
1129ba89b2371d466ca68973525816cf10debc2655Maarten Lankhorst	struct fence base;
1229ba89b2371d466ca68973525816cf10debc2655Maarten Lankhorst
13d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggs	struct list_head head;
14d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggs
15264ce192b3e7f45d0adb37bfbab2b01a3fbe6c30Ben Skeggs	bool sysmem;
16264ce192b3e7f45d0adb37bfbab2b01a3fbe6c30Ben Skeggs
170ec5f02f0e2c6fe88ba5817790e11fe33ee298a7Maarten Lankhorst	struct nouveau_channel __rcu *channel;
18d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggs	unsigned long timeout;
19d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggs};
20d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggs
21264ce192b3e7f45d0adb37bfbab2b01a3fbe6c30Ben Skeggsint  nouveau_fence_new(struct nouveau_channel *, bool sysmem,
22264ce192b3e7f45d0adb37bfbab2b01a3fbe6c30Ben Skeggs		       struct nouveau_fence **);
23d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggsvoid nouveau_fence_unref(struct nouveau_fence **);
24d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggs
25d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggsint  nouveau_fence_emit(struct nouveau_fence *, struct nouveau_channel *);
26d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggsbool nouveau_fence_done(struct nouveau_fence *);
27f2c24b83ae90292d315aa7ac029c6ce7929e01aaMaarten Lankhorstvoid nouveau_fence_work(struct fence *, void (*)(void *), void *);
28d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggsint  nouveau_fence_wait(struct nouveau_fence *, bool lazy, bool intr);
29e3be4c230dfadf79567a245505a47a90db97f968Maarten Lankhorstint  nouveau_fence_sync(struct nouveau_bo *, struct nouveau_channel *, bool exclusive, bool intr);
30d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggs
315e120f6e4b3f35b741c5445dfc755f50128c3c44Ben Skeggsstruct nouveau_fence_chan {
3229ba89b2371d466ca68973525816cf10debc2655Maarten Lankhorst	spinlock_t lock;
3315a996bbb6978ae21c497aeadfe20deca6ddd07aMaarten Lankhorst	struct kref fence_ref;
3415a996bbb6978ae21c497aeadfe20deca6ddd07aMaarten Lankhorst
355e120f6e4b3f35b741c5445dfc755f50128c3c44Ben Skeggs	struct list_head pending;
36f589be88caf32501a734e531180d5df5d6089ef3Ben Skeggs	struct list_head flip;
37f589be88caf32501a734e531180d5df5d6089ef3Ben Skeggs
38827520ce06568f699dad275dcca61647cce08757Ben Skeggs	int  (*emit)(struct nouveau_fence *);
39827520ce06568f699dad275dcca61647cce08757Ben Skeggs	int  (*sync)(struct nouveau_fence *, struct nouveau_channel *,
40827520ce06568f699dad275dcca61647cce08757Ben Skeggs		     struct nouveau_channel *);
41827520ce06568f699dad275dcca61647cce08757Ben Skeggs	u32  (*read)(struct nouveau_channel *);
42827520ce06568f699dad275dcca61647cce08757Ben Skeggs	int  (*emit32)(struct nouveau_channel *, u64, u32);
43827520ce06568f699dad275dcca61647cce08757Ben Skeggs	int  (*sync32)(struct nouveau_channel *, u64, u32);
44827520ce06568f699dad275dcca61647cce08757Ben Skeggs
455e120f6e4b3f35b741c5445dfc755f50128c3c44Ben Skeggs	u32 sequence;
4629ba89b2371d466ca68973525816cf10debc2655Maarten Lankhorst	u32 context;
4715a996bbb6978ae21c497aeadfe20deca6ddd07aMaarten Lankhorst	char name[32];
4829ba89b2371d466ca68973525816cf10debc2655Maarten Lankhorst
4929ba89b2371d466ca68973525816cf10debc2655Maarten Lankhorst	struct nvif_notify notify;
500ec5f02f0e2c6fe88ba5817790e11fe33ee298a7Maarten Lankhorst	int notify_ref, dead;
515e120f6e4b3f35b741c5445dfc755f50128c3c44Ben Skeggs};
525e120f6e4b3f35b741c5445dfc755f50128c3c44Ben Skeggs
535e120f6e4b3f35b741c5445dfc755f50128c3c44Ben Skeggsstruct nouveau_fence_priv {
54ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs	void (*dtor)(struct nouveau_drm *);
55ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs	bool (*suspend)(struct nouveau_drm *);
56ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs	void (*resume)(struct nouveau_drm *);
57e193b1d42c390bf1bff7fa02a5a1202b98e75601Ben Skeggs	int  (*context_new)(struct nouveau_channel *);
58e193b1d42c390bf1bff7fa02a5a1202b98e75601Ben Skeggs	void (*context_del)(struct nouveau_channel *);
59e18c080fb8695d038f69c26c248f5ecbd9e8aa77Ben Skeggs
6029ba89b2371d466ca68973525816cf10debc2655Maarten Lankhorst	u32 contexts, context_base;
61e18c080fb8695d038f69c26c248f5ecbd9e8aa77Ben Skeggs	bool uevent;
625e120f6e4b3f35b741c5445dfc755f50128c3c44Ben Skeggs};
635e120f6e4b3f35b741c5445dfc755f50128c3c44Ben Skeggs
64ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs#define nouveau_fence(drm) ((struct nouveau_fence_priv *)(drm)->fence)
65ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggs
6629ba89b2371d466ca68973525816cf10debc2655Maarten Lankhorstvoid nouveau_fence_context_new(struct nouveau_channel *, struct nouveau_fence_chan *);
675e120f6e4b3f35b741c5445dfc755f50128c3c44Ben Skeggsvoid nouveau_fence_context_del(struct nouveau_fence_chan *);
6815a996bbb6978ae21c497aeadfe20deca6ddd07aMaarten Lankhorstvoid nouveau_fence_context_free(struct nouveau_fence_chan *);
695e120f6e4b3f35b741c5445dfc755f50128c3c44Ben Skeggs
70ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggsint nv04_fence_create(struct nouveau_drm *);
715e120f6e4b3f35b741c5445dfc755f50128c3c44Ben Skeggsint nv04_fence_mthd(struct nouveau_channel *, u32, u32, u32);
725e120f6e4b3f35b741c5445dfc755f50128c3c44Ben Skeggs
73f589be88caf32501a734e531180d5df5d6089ef3Ben Skeggsint  nv10_fence_emit(struct nouveau_fence *);
74f589be88caf32501a734e531180d5df5d6089ef3Ben Skeggsint  nv17_fence_sync(struct nouveau_fence *, struct nouveau_channel *,
75f589be88caf32501a734e531180d5df5d6089ef3Ben Skeggs		     struct nouveau_channel *);
76f589be88caf32501a734e531180d5df5d6089ef3Ben Skeggsu32  nv10_fence_read(struct nouveau_channel *);
77f589be88caf32501a734e531180d5df5d6089ef3Ben Skeggsvoid nv10_fence_context_del(struct nouveau_channel *);
78ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggsvoid nv10_fence_destroy(struct nouveau_drm *);
79ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggsint  nv10_fence_create(struct nouveau_drm *);
8060e5cb79cbd27a36836fc04177d7c323ee873563Ben Skeggs
8160e5cb79cbd27a36836fc04177d7c323ee873563Ben Skeggsint  nv17_fence_create(struct nouveau_drm *);
82f20ebd034eab43fd38c58b11c5bb5fb125e5f7d7Marcin Slusarzvoid nv17_fence_resume(struct nouveau_drm *drm);
83f589be88caf32501a734e531180d5df5d6089ef3Ben Skeggs
84ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggsint nv50_fence_create(struct nouveau_drm *);
85ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggsint nv84_fence_create(struct nouveau_drm *);
86ebb945a94bba2ce8dff7b0942ff2b3f2a52a0a69Ben Skeggsint nvc0_fence_create(struct nouveau_drm *);
87f589be88caf32501a734e531180d5df5d6089ef3Ben Skeggs
88f589be88caf32501a734e531180d5df5d6089ef3Ben Skeggsint nouveau_flip_complete(void *chan);
895e120f6e4b3f35b741c5445dfc755f50128c3c44Ben Skeggs
90a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggsstruct nv84_fence_chan {
91a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggs	struct nouveau_fence_chan base;
92a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggs	struct nouveau_vma vma;
93264ce192b3e7f45d0adb37bfbab2b01a3fbe6c30Ben Skeggs	struct nouveau_vma vma_gart;
94a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggs	struct nouveau_vma dispc_vma[4];
95a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggs};
96a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggs
97a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggsstruct nv84_fence_priv {
98a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggs	struct nouveau_fence_priv base;
99a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggs	struct nouveau_bo *bo;
100264ce192b3e7f45d0adb37bfbab2b01a3fbe6c30Ben Skeggs	struct nouveau_bo *bo_gart;
101a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggs	u32 *suspend;
102a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggs};
103a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggs
104a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggsu64  nv84_fence_crtc(struct nouveau_channel *, int);
105a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggsint  nv84_fence_context_new(struct nouveau_channel *);
106a34caf78f26bda63869471cb3f46f354f4658758Ben Skeggs
107d375e7d56dffa564a6c337d2ed3217fb94826100Ben Skeggs#endif
108