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