1
/**************************************************************************
3
* Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND. USA.
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the
8
* "Software"), to deal in the Software without restriction, including
9
* without limitation the rights to use, copy, modify, merge, publish,
10
* distribute, sub license, and/or sell copies of the Software, and to
11
* permit persons to whom the Software is furnished to do so, subject to
12
* the following conditions:
14
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17
* THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20
* USE OR OTHER DEALINGS IN THE SOFTWARE.
22
* The above copyright notice and this permission notice (including the
23
* next paragraph) shall be included in all copies or substantial portions
27
**************************************************************************/
35
* Note on multithreaded applications using this interface.
36
* Libdrm is not threadsafe, so common buffer, TTM, and fence objects need to
37
* be protected using an external mutex.
39
* Note: Don't protect the following functions, as it may lead to deadlocks:
40
* drmBOUnmap(), drmFenceBuffers().
41
* The kernel is synchronizing and refcounting buffer maps.
42
* User space only needs to refcount object usage within the same application.
47
* List macros heavily inspired by the Linux kernel
48
* list handling. No list looping yet.
51
typedef struct _drmMMListHead
53
struct _drmMMListHead *prev;
54
struct _drmMMListHead *next;
57
#define DRMINITLISTHEAD(__item) \
59
(__item)->prev = (__item); \
60
(__item)->next = (__item); \
63
#define DRMLISTADD(__item, __list) \
65
(__item)->prev = (__list); \
66
(__item)->next = (__list)->next; \
67
(__list)->next->prev = (__item); \
68
(__list)->next = (__item); \
71
#define DRMLISTADDTAIL(__item, __list) \
73
(__item)->next = (__list); \
74
(__item)->prev = (__list)->prev; \
75
(__list)->prev->next = (__item); \
76
(__list)->prev = (__item); \
79
#define DRMLISTDEL(__item) \
81
(__item)->prev->next = (__item)->next; \
82
(__item)->next->prev = (__item)->prev; \
85
#define DRMLISTDELINIT(__item) \
87
(__item)->prev->next = (__item)->next; \
88
(__item)->next->prev = (__item)->prev; \
89
(__item)->next = (__item); \
90
(__item)->prev = (__item); \
93
#define DRMLISTENTRY(__type, __item, __field) \
94
((__type *)(((char *) (__item)) - offsetof(__type, __field)))
96
typedef struct _drmFence{
102
unsigned pad[4]; /* for future expansion */
105
typedef struct _drmBO{
113
unsigned long offset;
117
unsigned pageAlignment;
121
unsigned pad[8]; /* for future expansion */
125
typedef struct _drmBONode {
133
typedef struct _drmBOList {
143
extern int drmFenceCreate(int fd, unsigned flags, int class,
146
extern int drmFenceDestroy(int fd, const drmFence *fence);
147
extern int drmFenceReference(int fd, unsigned handle, drmFence *fence);
148
extern int drmFenceUnreference(int fd, const drmFence *fence);
149
extern int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type);
150
extern int drmFenceSignaled(int fd, drmFence *fence,
151
unsigned fenceType, int *signaled);
152
extern int drmFenceWait(int fd, unsigned flags, drmFence *fence,
153
unsigned flush_type);
154
extern int drmFenceEmit(int fd, unsigned flags, drmFence *fence,
156
extern int drmFenceBuffers(int fd, unsigned flags, drmFence *fence);
160
* Buffer object list functions.
163
extern void drmBOFreeList(drmBOList *list);
164
extern int drmBOResetList(drmBOList *list);
165
extern void *drmBOListIterator(drmBOList *list);
166
extern void *drmBOListNext(drmBOList *list, void *iterator);
167
extern drmBO *drmBOListBuf(void *iterator);
168
extern int drmBOCreateList(int numTarget, drmBOList *list);
171
* Buffer object functions.
174
extern int drmBOCreate(int fd, unsigned long start, unsigned long size,
175
unsigned pageAlignment,void *user_buffer,
176
drm_bo_type_t type, unsigned mask,
177
unsigned hint, drmBO *buf);
178
extern int drmBODestroy(int fd, drmBO *buf);
179
extern int drmBOReference(int fd, unsigned handle, drmBO *buf);
180
extern int drmBOUnReference(int fd, drmBO *buf);
181
extern int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,
183
extern int drmBOUnmap(int fd, drmBO *buf);
184
extern int drmBOValidate(int fd, drmBO *buf, unsigned flags, unsigned mask,
186
extern int drmBOFence(int fd, drmBO *buf, unsigned flags, unsigned fenceHandle);
187
extern int drmBOInfo(int fd, drmBO *buf);
188
extern int drmBOBusy(int fd, drmBO *buf, int *busy);
191
extern int drmAddValidateItem(drmBOList *list, drmBO *buf, unsigned flags,
194
extern int drmBOValidateList(int fd, drmBOList *list);
195
extern int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle);
196
extern int drmBOWaitIdle(int fd, drmBO *buf, unsigned hint);
199
* Initialization functions.
202
extern int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize,
204
extern int drmMMTakedown(int fd, unsigned memType);
205
extern int drmMMLock(int fd, unsigned memType);
206
extern int drmMMUnlock(int fd, unsigned memType);