aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian2007-05-29 15:54:00 -0500
committerBrian2007-05-29 15:54:00 -0500
commitccd7b6e8ddeac936518f626d2326ae439931b2bf (patch)
tree023a9d3043ec5bd50a3f5bf072ce04a1ba4ff26b /libdrm/xf86drm.c
parent056c2f249a61ba7078bae3d767a59f2be4c6556e (diff)
downloadlibdrm-ccd7b6e8ddeac936518f626d2326ae439931b2bf.tar.gz
libdrm-ccd7b6e8ddeac936518f626d2326ae439931b2bf.tar.xz
libdrm-ccd7b6e8ddeac936518f626d2326ae439931b2bf.zip
Clean-ups and reformatting.
Use 4-space indentation consistently. Replace occurances of: if (cond) code; with: if (cond) code; to facilitate putting breakpoints on code.
Diffstat (limited to 'libdrm/xf86drm.c')
-rw-r--r--libdrm/xf86drm.c642
1 files changed, 353 insertions, 289 deletions
diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index 78efcf2a..1f242fe3 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -92,7 +92,7 @@ static drmServerInfoPtr drm_server_info;
92 92
93void drmSetServerInfo(drmServerInfoPtr info) 93void drmSetServerInfo(drmServerInfoPtr info)
94{ 94{
95 drm_server_info = info; 95 drm_server_info = info;
96} 96}
97 97
98/** 98/**
@@ -106,7 +106,7 @@ void drmSetServerInfo(drmServerInfoPtr info)
106 106
107static int drmDebugPrint(const char *format, va_list ap) 107static int drmDebugPrint(const char *format, va_list ap)
108{ 108{
109 return vfprintf(stderr, format, ap); 109 return vfprintf(stderr, format, ap);
110} 110}
111 111
112static int (*drm_debug_print)(const char *format, va_list ap) = drmDebugPrint; 112static int (*drm_debug_print)(const char *format, va_list ap) = drmDebugPrint;
@@ -131,26 +131,28 @@ drmMsg(const char *format, ...)
131void 131void
132drmSetDebugMsgFunction(int (*debug_msg_ptr)(const char *format, va_list ap)) 132drmSetDebugMsgFunction(int (*debug_msg_ptr)(const char *format, va_list ap))
133{ 133{
134 drm_debug_print = debug_msg_ptr; 134 drm_debug_print = debug_msg_ptr;
135} 135}
136 136
137static void *drmHashTable = NULL; /* Context switch callbacks */ 137static void *drmHashTable = NULL; /* Context switch callbacks */
138 138
139void *drmGetHashTable(void) 139void *drmGetHashTable(void)
140{ 140{
141 return drmHashTable; 141 return drmHashTable;
142} 142}
143 143
144void *drmMalloc(int size) 144void *drmMalloc(int size)
145{ 145{
146 void *pt; 146 void *pt;
147 if ((pt = malloc(size))) memset(pt, 0, size); 147 if ((pt = malloc(size)))
148 memset(pt, 0, size);
148 return pt; 149 return pt;
149} 150}
150 151
151void drmFree(void *pt) 152void drmFree(void *pt)
152{ 153{
153 if (pt) free(pt); 154 if (pt)
155 free(pt);
154} 156}
155 157
156/* drmStrdup can't use strdup(3), since it doesn't call _DRM_MALLOC... */ 158/* drmStrdup can't use strdup(3), since it doesn't call _DRM_MALLOC... */
@@ -186,7 +188,8 @@ drmHashEntry *drmGetEntry(int fd)
186 void *value; 188 void *value;
187 drmHashEntry *entry; 189 drmHashEntry *entry;
188 190
189 if (!drmHashTable) drmHashTable = drmHashCreate(); 191 if (!drmHashTable)
192 drmHashTable = drmHashCreate();
190 193
191 if (drmHashLookup(drmHashTable, key, &value)) { 194 if (drmHashLookup(drmHashTable, key, &value)) {
192 entry = drmMalloc(sizeof(*entry)); 195 entry = drmMalloc(sizeof(*entry));
@@ -276,14 +279,15 @@ static int drmOpenDevice(long dev, int minor)
276 drmMsg("drmOpenDevice: node name is %s\n", buf); 279 drmMsg("drmOpenDevice: node name is %s\n", buf);
277 280
278 if (drm_server_info) { 281 if (drm_server_info) {
279 drm_server_info->get_perms(&serv_group, &serv_mode); 282 drm_server_info->get_perms(&serv_group, &serv_mode);
280 devmode = serv_mode ? serv_mode : DRM_DEV_MODE; 283 devmode = serv_mode ? serv_mode : DRM_DEV_MODE;
281 devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH); 284 devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
282 group = (serv_group >= 0) ? serv_group : DRM_DEV_GID; 285 group = (serv_group >= 0) ? serv_group : DRM_DEV_GID;
283 } 286 }
284 287
285 if (stat(DRM_DIR_NAME, &st)) { 288 if (stat(DRM_DIR_NAME, &st)) {
286 if (!isroot) return DRM_ERR_NOT_ROOT; 289 if (!isroot)
290 return DRM_ERR_NOT_ROOT;
287 mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE); 291 mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE);
288 chown(DRM_DIR_NAME, 0, 0); /* root:root */ 292 chown(DRM_DIR_NAME, 0, 0); /* root:root */
289 chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE); 293 chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE);
@@ -291,37 +295,41 @@ static int drmOpenDevice(long dev, int minor)
291 295
292 /* Check if the device node exists and create it if necessary. */ 296 /* Check if the device node exists and create it if necessary. */
293 if (stat(buf, &st)) { 297 if (stat(buf, &st)) {
294 if (!isroot) return DRM_ERR_NOT_ROOT; 298 if (!isroot)
299 return DRM_ERR_NOT_ROOT;
295 remove(buf); 300 remove(buf);
296 mknod(buf, S_IFCHR | devmode, dev); 301 mknod(buf, S_IFCHR | devmode, dev);
297 } 302 }
298 303
299 if (drm_server_info) { 304 if (drm_server_info) {
300 chown(buf, user, group); 305 chown(buf, user, group);
301 chmod(buf, devmode); 306 chmod(buf, devmode);
302 } 307 }
303 308
304 fd = open(buf, O_RDWR, 0); 309 fd = open(buf, O_RDWR, 0);
305 drmMsg("drmOpenDevice: open result is %d, (%s)\n", 310 drmMsg("drmOpenDevice: open result is %d, (%s)\n",
306 fd, fd < 0 ? strerror(errno) : "OK"); 311 fd, fd < 0 ? strerror(errno) : "OK");
307 if (fd >= 0) return fd; 312 if (fd >= 0)
313 return fd;
308 314
309 /* Check if the device node is not what we expect it to be, and recreate it 315 /* Check if the device node is not what we expect it to be, and recreate it
310 * and try again if so. 316 * and try again if so.
311 */ 317 */
312 if (st.st_rdev != dev) { 318 if (st.st_rdev != dev) {
313 if (!isroot) return DRM_ERR_NOT_ROOT; 319 if (!isroot)
320 return DRM_ERR_NOT_ROOT;
314 remove(buf); 321 remove(buf);
315 mknod(buf, S_IFCHR | devmode, dev); 322 mknod(buf, S_IFCHR | devmode, dev);
316 if (drm_server_info) { 323 if (drm_server_info) {
317 chown(buf, user, group); 324 chown(buf, user, group);
318 chmod(buf, devmode); 325 chmod(buf, devmode);
319 } 326 }
320 } 327 }
321 fd = open(buf, O_RDWR, 0); 328 fd = open(buf, O_RDWR, 0);
322 drmMsg("drmOpenDevice: open result is %d, (%s)\n", 329 drmMsg("drmOpenDevice: open result is %d, (%s)\n",
323 fd, fd < 0 ? strerror(errno) : "OK"); 330 fd, fd < 0 ? strerror(errno) : "OK");
324 if (fd >= 0) return fd; 331 if (fd >= 0)
332 return fd;
325 333
326 drmMsg("drmOpenDevice: Open failed\n"); 334 drmMsg("drmOpenDevice: Open failed\n");
327 remove(buf); 335 remove(buf);
@@ -346,10 +354,12 @@ static int drmOpenMinor(int minor, int create)
346 int fd; 354 int fd;
347 char buf[64]; 355 char buf[64];
348 356
349 if (create) return drmOpenDevice(makedev(DRM_MAJOR, minor), minor); 357 if (create)
358 return drmOpenDevice(makedev(DRM_MAJOR, minor), minor);
350 359
351 sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor); 360 sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
352 if ((fd = open(buf, O_RDWR, 0)) >= 0) return fd; 361 if ((fd = open(buf, O_RDWR, 0)) >= 0)
362 return fd;
353 return -errno; 363 return -errno;
354} 364}
355 365
@@ -373,7 +383,8 @@ int drmAvailable(void)
373 if ((fd = drmOpenMinor(0, 1)) < 0) { 383 if ((fd = drmOpenMinor(0, 1)) < 0) {
374#ifdef __linux__ 384#ifdef __linux__
375 /* Try proc for backward Linux compatibility */ 385 /* Try proc for backward Linux compatibility */
376 if (!access("/proc/dri/0", R_OK)) return 1; 386 if (!access("/proc/dri/0", R_OK))
387 return 1;
377#endif 388#endif
378 return 0; 389 return 0;
379 } 390 }
@@ -424,7 +435,8 @@ static int drmOpenByBusid(const char *busid)
424 drmFreeBusid(buf); 435 drmFreeBusid(buf);
425 return fd; 436 return fd;
426 } 437 }
427 if (buf) drmFreeBusid(buf); 438 if (buf)
439 drmFreeBusid(buf);
428 close(fd); 440 close(fd);
429 } 441 }
430 } 442 }
@@ -454,16 +466,16 @@ static int drmOpenByName(const char *name)
454 char * id; 466 char * id;
455 467
456 if (!drmAvailable()) { 468 if (!drmAvailable()) {
457 if (!drm_server_info) 469 if (!drm_server_info) {
458 return -1; 470 return -1;
459 else { 471 }
460 /* try to load the kernel module now */ 472 else {
461 if (!drm_server_info->load_module(name)) { 473 /* try to load the kernel module now */
462 drmMsg("[drm] failed to load kernel module \"%s\"\n", 474 if (!drm_server_info->load_module(name)) {
463 name); 475 drmMsg("[drm] failed to load kernel module \"%s\"\n", name);
464 return -1; 476 return -1;
465 } 477 }
466 } 478 }
467 } 479 }
468 480
469 /* 481 /*
@@ -548,16 +560,13 @@ int drmOpen(const char *name, const char *busid)
548 if (!drmAvailable() && name != NULL && drm_server_info) { 560 if (!drmAvailable() && name != NULL && drm_server_info) {
549 /* try to load the kernel */ 561 /* try to load the kernel */
550 if (!drm_server_info->load_module(name)) { 562 if (!drm_server_info->load_module(name)) {
551 drmMsg("[drm] failed to load kernel module \"%s\"\n", 563 drmMsg("[drm] failed to load kernel module \"%s\"\n", name);
552 name);
553 return -1; 564 return -1;
554 } 565 }
555 } 566 }
556 567
557 if (busid) { 568 if (busid) {
558 int fd; 569 int fd = drmOpenByBusid(busid);
559
560 fd = drmOpenByBusid(busid);
561 if (fd >= 0) 570 if (fd >= 0)
562 return fd; 571 return fd;
563 } 572 }
@@ -580,7 +589,8 @@ int drmOpen(const char *name, const char *busid)
580 */ 589 */
581void drmFreeVersion(drmVersionPtr v) 590void drmFreeVersion(drmVersionPtr v)
582{ 591{
583 if (!v) return; 592 if (!v)
593 return;
584 drmFree(v->name); 594 drmFree(v->name);
585 drmFree(v->date); 595 drmFree(v->date);
586 drmFree(v->desc); 596 drmFree(v->desc);
@@ -599,7 +609,8 @@ void drmFreeVersion(drmVersionPtr v)
599 */ 609 */
600static void drmFreeKernelVersion(drm_version_t *v) 610static void drmFreeKernelVersion(drm_version_t *v)
601{ 611{
602 if (!v) return; 612 if (!v)
613 return;
603 drmFree(v->name); 614 drmFree(v->name);
604 drmFree(v->date); 615 drmFree(v->date);
605 drmFree(v->desc); 616 drmFree(v->desc);
@@ -756,9 +767,11 @@ char *drmGetBusid(int fd)
756 u.unique_len = 0; 767 u.unique_len = 0;
757 u.unique = NULL; 768 u.unique = NULL;
758 769
759 if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) return NULL; 770 if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u))
771 return NULL;
760 u.unique = drmMalloc(u.unique_len + 1); 772 u.unique = drmMalloc(u.unique_len + 1);
761 if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) return NULL; 773 if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u))
774 return NULL;
762 u.unique[u.unique_len] = '\0'; 775 u.unique[u.unique_len] = '\0';
763 776
764 return u.unique; 777 return u.unique;
@@ -795,7 +808,8 @@ int drmGetMagic(int fd, drm_magic_t * magic)
795 drm_auth_t auth; 808 drm_auth_t auth;
796 809
797 *magic = 0; 810 *magic = 0;
798 if (ioctl(fd, DRM_IOCTL_GET_MAGIC, &auth)) return -errno; 811 if (ioctl(fd, DRM_IOCTL_GET_MAGIC, &auth))
812 return -errno;
799 *magic = auth.magic; 813 *magic = auth.magic;
800 return 0; 814 return 0;
801} 815}
@@ -805,7 +819,8 @@ int drmAuthMagic(int fd, drm_magic_t magic)
805 drm_auth_t auth; 819 drm_auth_t auth;
806 820
807 auth.magic = magic; 821 auth.magic = magic;
808 if (ioctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth)) return -errno; 822 if (ioctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth))
823 return -errno;
809 return 0; 824 return 0;
810} 825}
811 826
@@ -869,8 +884,10 @@ int drmAddMap(int fd, drm_handle_t offset, drmSize size, drmMapType type,
869 map.handle = 0; 884 map.handle = 0;
870 map.type = type; 885 map.type = type;
871 map.flags = flags; 886 map.flags = flags;
872 if (ioctl(fd, DRM_IOCTL_ADD_MAP, &map)) return -errno; 887 if (ioctl(fd, DRM_IOCTL_ADD_MAP, &map))
873 if (handle) *handle = (drm_handle_t)map.handle; 888 return -errno;
889 if (handle)
890 *handle = (drm_handle_t)map.handle;
874 return 0; 891 return 0;
875} 892}
876 893
@@ -880,7 +897,8 @@ int drmRmMap(int fd, drm_handle_t handle)
880 897
881 map.handle = (void *)handle; 898 map.handle = (void *)handle;
882 899
883 if(ioctl(fd, DRM_IOCTL_RM_MAP, &map)) return -errno; 900 if(ioctl(fd, DRM_IOCTL_RM_MAP, &map))
901 return -errno;
884 return 0; 902 return 0;
885} 903}
886 904
@@ -912,7 +930,8 @@ int drmAddBufs(int fd, int count, int size, drmBufDescFlags flags,
912 request.flags = flags; 930 request.flags = flags;
913 request.agp_start = agp_offset; 931 request.agp_start = agp_offset;
914 932
915 if (ioctl(fd, DRM_IOCTL_ADD_BUFS, &request)) return -errno; 933 if (ioctl(fd, DRM_IOCTL_ADD_BUFS, &request))
934 return -errno;
916 return request.count; 935 return request.count;
917} 936}
918 937
@@ -924,9 +943,11 @@ int drmMarkBufs(int fd, double low, double high)
924 info.count = 0; 943 info.count = 0;
925 info.list = NULL; 944 info.list = NULL;
926 945
927 if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return -EINVAL; 946 if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info))
947 return -EINVAL;
928 948
929 if (!info.count) return -EINVAL; 949 if (!info.count)
950 return -EINVAL;
930 951
931 if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) 952 if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
932 return -ENOMEM; 953 return -ENOMEM;
@@ -972,7 +993,8 @@ int drmFreeBufs(int fd, int count, int *list)
972 993
973 request.count = count; 994 request.count = count;
974 request.list = list; 995 request.list = list;
975 if (ioctl(fd, DRM_IOCTL_FREE_BUFS, &request)) return -errno; 996 if (ioctl(fd, DRM_IOCTL_FREE_BUFS, &request))
997 return -errno;
976 return 0; 998 return 0;
977} 999}
978 1000
@@ -1020,7 +1042,8 @@ int drmMap(int fd, drm_handle_t handle, drmSize size, drmAddressPtr address)
1020{ 1042{
1021 static unsigned long pagesize_mask = 0; 1043 static unsigned long pagesize_mask = 0;
1022 1044
1023 if (fd < 0) return -EINVAL; 1045 if (fd < 0)
1046 return -EINVAL;
1024 1047
1025 if (!pagesize_mask) 1048 if (!pagesize_mask)
1026 pagesize_mask = getpagesize() - 1; 1049 pagesize_mask = getpagesize() - 1;
@@ -1028,7 +1051,8 @@ int drmMap(int fd, drm_handle_t handle, drmSize size, drmAddressPtr address)
1028 size = (size + pagesize_mask) & ~pagesize_mask; 1051 size = (size + pagesize_mask) & ~pagesize_mask;
1029 1052
1030 *address = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle); 1053 *address = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle);
1031 if (*address == MAP_FAILED) return -errno; 1054 if (*address == MAP_FAILED)
1055 return -errno;
1032 return 0; 1056 return 0;
1033} 1057}
1034 1058
@@ -1058,7 +1082,8 @@ drmBufInfoPtr drmGetBufInfo(int fd)
1058 info.count = 0; 1082 info.count = 0;
1059 info.list = NULL; 1083 info.list = NULL;
1060 1084
1061 if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return NULL; 1085 if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info))
1086 return NULL;
1062 1087
1063 if (info.count) { 1088 if (info.count) {
1064 if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) 1089 if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
@@ -1108,9 +1133,11 @@ drmBufMapPtr drmMapBufs(int fd)
1108 bufs.count = 0; 1133 bufs.count = 0;
1109 bufs.list = NULL; 1134 bufs.list = NULL;
1110 bufs.virtual = NULL; 1135 bufs.virtual = NULL;
1111 if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) return NULL; 1136 if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs))
1137 return NULL;
1112 1138
1113 if (!bufs.count) return NULL; 1139 if (!bufs.count)
1140 return NULL;
1114 1141
1115 if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list)))) 1142 if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list))))
1116 return NULL; 1143 return NULL;
@@ -1265,20 +1292,25 @@ drm_context_t *drmGetReservedContextList(int fd, int *count)
1265 1292
1266 res.count = 0; 1293 res.count = 0;
1267 res.contexts = NULL; 1294 res.contexts = NULL;
1268 if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) return NULL; 1295 if (ioctl(fd, DRM_IOCTL_RES_CTX, &res))
1296 return NULL;
1269 1297
1270 if (!res.count) return NULL; 1298 if (!res.count)
1299 return NULL;
1271 1300
1272 if (!(list = drmMalloc(res.count * sizeof(*list)))) return NULL; 1301 if (!(list = drmMalloc(res.count * sizeof(*list))))
1302 return NULL;
1273 if (!(retval = drmMalloc(res.count * sizeof(*retval)))) { 1303 if (!(retval = drmMalloc(res.count * sizeof(*retval)))) {
1274 drmFree(list); 1304 drmFree(list);
1275 return NULL; 1305 return NULL;
1276 } 1306 }
1277 1307
1278 res.contexts = list; 1308 res.contexts = list;
1279 if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) return NULL; 1309 if (ioctl(fd, DRM_IOCTL_RES_CTX, &res))
1310 return NULL;
1280 1311
1281 for (i = 0; i < res.count; i++) retval[i] = list[i].handle; 1312 for (i = 0; i < res.count; i++)
1313 retval[i] = list[i].handle;
1282 drmFree(list); 1314 drmFree(list);
1283 1315
1284 *count = res.count; 1316 *count = res.count;
@@ -1313,7 +1345,8 @@ int drmCreateContext(int fd, drm_context_t *handle)
1313 drm_ctx_t ctx; 1345 drm_ctx_t ctx;
1314 1346
1315 ctx.flags = 0; /* Modified with functions below */ 1347 ctx.flags = 0; /* Modified with functions below */
1316 if (ioctl(fd, DRM_IOCTL_ADD_CTX, &ctx)) return -errno; 1348 if (ioctl(fd, DRM_IOCTL_ADD_CTX, &ctx))
1349 return -errno;
1317 *handle = ctx.handle; 1350 *handle = ctx.handle;
1318 return 0; 1351 return 0;
1319} 1352}
@@ -1323,7 +1356,8 @@ int drmSwitchToContext(int fd, drm_context_t context)
1323 drm_ctx_t ctx; 1356 drm_ctx_t ctx;
1324 1357
1325 ctx.handle = context; 1358 ctx.handle = context;
1326 if (ioctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx)) return -errno; 1359 if (ioctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx))
1360 return -errno;
1327 return 0; 1361 return 0;
1328} 1362}
1329 1363
@@ -1339,9 +1373,12 @@ int drmSetContextFlags(int fd, drm_context_t context, drm_context_tFlags flags)
1339 */ 1373 */
1340 ctx.handle = context; 1374 ctx.handle = context;
1341 ctx.flags = 0; 1375 ctx.flags = 0;
1342 if (flags & DRM_CONTEXT_PRESERVED) ctx.flags |= _DRM_CONTEXT_PRESERVED; 1376 if (flags & DRM_CONTEXT_PRESERVED)
1343 if (flags & DRM_CONTEXT_2DONLY) ctx.flags |= _DRM_CONTEXT_2DONLY; 1377 ctx.flags |= _DRM_CONTEXT_PRESERVED;
1344 if (ioctl(fd, DRM_IOCTL_MOD_CTX, &ctx)) return -errno; 1378 if (flags & DRM_CONTEXT_2DONLY)
1379 ctx.flags |= _DRM_CONTEXT_2DONLY;
1380 if (ioctl(fd, DRM_IOCTL_MOD_CTX, &ctx))
1381 return -errno;
1345 return 0; 1382 return 0;
1346} 1383}
1347 1384
@@ -1351,10 +1388,13 @@ int drmGetContextFlags(int fd, drm_context_t context,
1351 drm_ctx_t ctx; 1388 drm_ctx_t ctx;
1352 1389
1353 ctx.handle = context; 1390 ctx.handle = context;
1354 if (ioctl(fd, DRM_IOCTL_GET_CTX, &ctx)) return -errno; 1391 if (ioctl(fd, DRM_IOCTL_GET_CTX, &ctx))
1392 return -errno;
1355 *flags = 0; 1393 *flags = 0;
1356 if (ctx.flags & _DRM_CONTEXT_PRESERVED) *flags |= DRM_CONTEXT_PRESERVED; 1394 if (ctx.flags & _DRM_CONTEXT_PRESERVED)
1357 if (ctx.flags & _DRM_CONTEXT_2DONLY) *flags |= DRM_CONTEXT_2DONLY; 1395 *flags |= DRM_CONTEXT_PRESERVED;
1396 if (ctx.flags & _DRM_CONTEXT_2DONLY)
1397 *flags |= DRM_CONTEXT_2DONLY;
1358 return 0; 1398 return 0;
1359} 1399}
1360 1400
@@ -1379,14 +1419,16 @@ int drmDestroyContext(int fd, drm_context_t handle)
1379{ 1419{
1380 drm_ctx_t ctx; 1420 drm_ctx_t ctx;
1381 ctx.handle = handle; 1421 ctx.handle = handle;
1382 if (ioctl(fd, DRM_IOCTL_RM_CTX, &ctx)) return -errno; 1422 if (ioctl(fd, DRM_IOCTL_RM_CTX, &ctx))
1423 return -errno;
1383 return 0; 1424 return 0;
1384} 1425}
1385 1426
1386int drmCreateDrawable(int fd, drm_drawable_t *handle) 1427int drmCreateDrawable(int fd, drm_drawable_t *handle)
1387{ 1428{
1388 drm_draw_t draw; 1429 drm_draw_t draw;
1389 if (ioctl(fd, DRM_IOCTL_ADD_DRAW, &draw)) return -errno; 1430 if (ioctl(fd, DRM_IOCTL_ADD_DRAW, &draw))
1431 return -errno;
1390 *handle = draw.handle; 1432 *handle = draw.handle;
1391 return 0; 1433 return 0;
1392} 1434}
@@ -1395,7 +1437,8 @@ int drmDestroyDrawable(int fd, drm_drawable_t handle)
1395{ 1437{
1396 drm_draw_t draw; 1438 drm_draw_t draw;
1397 draw.handle = handle; 1439 draw.handle = handle;
1398 if (ioctl(fd, DRM_IOCTL_RM_DRAW, &draw)) return -errno; 1440 if (ioctl(fd, DRM_IOCTL_RM_DRAW, &draw))
1441 return -errno;
1399 return 0; 1442 return 0;
1400} 1443}
1401 1444
@@ -1410,7 +1453,8 @@ int drmUpdateDrawableInfo(int fd, drm_drawable_t handle,
1410 update.num = num; 1453 update.num = num;
1411 update.data = (unsigned long long)(unsigned long)data; 1454 update.data = (unsigned long long)(unsigned long)data;
1412 1455
1413 if (ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update)) return -errno; 1456 if (ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update))
1457 return -errno;
1414 1458
1415 return 0; 1459 return 0;
1416} 1460}
@@ -1429,7 +1473,8 @@ int drmUpdateDrawableInfo(int fd, drm_drawable_t handle,
1429 */ 1473 */
1430int drmAgpAcquire(int fd) 1474int drmAgpAcquire(int fd)
1431{ 1475{
1432 if (ioctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL)) return -errno; 1476 if (ioctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL))
1477 return -errno;
1433 return 0; 1478 return 0;
1434} 1479}
1435 1480
@@ -1446,7 +1491,8 @@ int drmAgpAcquire(int fd)
1446 */ 1491 */
1447int drmAgpRelease(int fd) 1492int drmAgpRelease(int fd)
1448{ 1493{
1449 if (ioctl(fd, DRM_IOCTL_AGP_RELEASE, NULL)) return -errno; 1494 if (ioctl(fd, DRM_IOCTL_AGP_RELEASE, NULL))
1495 return -errno;
1450 return 0; 1496 return 0;
1451} 1497}
1452 1498
@@ -1468,7 +1514,8 @@ int drmAgpEnable(int fd, unsigned long mode)
1468 drm_agp_mode_t m; 1514 drm_agp_mode_t m;
1469 1515
1470 m.mode = mode; 1516 m.mode = mode;
1471 if (ioctl(fd, DRM_IOCTL_AGP_ENABLE, &m)) return -errno; 1517 if (ioctl(fd, DRM_IOCTL_AGP_ENABLE, &m))
1518 return -errno;
1472 return 0; 1519 return 0;
1473} 1520}
1474 1521
@@ -1498,8 +1545,10 @@ int drmAgpAlloc(int fd, unsigned long size, unsigned long type,
1498 b.size = size; 1545 b.size = size;
1499 b.handle = 0; 1546 b.handle = 0;
1500 b.type = type; 1547 b.type = type;
1501 if (ioctl(fd, DRM_IOCTL_AGP_ALLOC, &b)) return -errno; 1548 if (ioctl(fd, DRM_IOCTL_AGP_ALLOC, &b))
1502 if (address != 0UL) *address = b.physical; 1549 return -errno;
1550 if (address != 0UL)
1551 *address = b.physical;
1503 *handle = b.handle; 1552 *handle = b.handle;
1504 return 0; 1553 return 0;
1505} 1554}
@@ -1523,7 +1572,8 @@ int drmAgpFree(int fd, drm_handle_t handle)
1523 1572
1524 b.size = 0; 1573 b.size = 0;
1525 b.handle = handle; 1574 b.handle = handle;
1526 if (ioctl(fd, DRM_IOCTL_AGP_FREE, &b)) return -errno; 1575 if (ioctl(fd, DRM_IOCTL_AGP_FREE, &b))
1576 return -errno;
1527 return 0; 1577 return 0;
1528} 1578}
1529 1579
@@ -1547,7 +1597,8 @@ int drmAgpBind(int fd, drm_handle_t handle, unsigned long offset)
1547 1597
1548 b.handle = handle; 1598 b.handle = handle;
1549 b.offset = offset; 1599 b.offset = offset;
1550 if (ioctl(fd, DRM_IOCTL_AGP_BIND, &b)) return -errno; 1600 if (ioctl(fd, DRM_IOCTL_AGP_BIND, &b))
1601 return -errno;
1551 return 0; 1602 return 0;
1552} 1603}
1553 1604
@@ -1570,7 +1621,8 @@ int drmAgpUnbind(int fd, drm_handle_t handle)
1570 1621
1571 b.handle = handle; 1622 b.handle = handle;
1572 b.offset = 0; 1623 b.offset = 0;
1573 if (ioctl(fd, DRM_IOCTL_AGP_UNBIND, &b)) return -errno; 1624 if (ioctl(fd, DRM_IOCTL_AGP_UNBIND, &b))
1625 return -errno;
1574 return 0; 1626 return 0;
1575} 1627}
1576 1628
@@ -1590,7 +1642,8 @@ int drmAgpVersionMajor(int fd)
1590{ 1642{
1591 drm_agp_info_t i; 1643 drm_agp_info_t i;
1592 1644
1593 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno; 1645 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1646 return -errno;
1594 return i.agp_version_major; 1647 return i.agp_version_major;
1595} 1648}
1596 1649
@@ -1610,7 +1663,8 @@ int drmAgpVersionMinor(int fd)
1610{ 1663{
1611 drm_agp_info_t i; 1664 drm_agp_info_t i;
1612 1665
1613 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno; 1666 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1667 return -errno;
1614 return i.agp_version_minor; 1668 return i.agp_version_minor;
1615} 1669}
1616 1670
@@ -1630,7 +1684,8 @@ unsigned long drmAgpGetMode(int fd)
1630{ 1684{
1631 drm_agp_info_t i; 1685 drm_agp_info_t i;
1632 1686
1633 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; 1687 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1688 return 0;
1634 return i.mode; 1689 return i.mode;
1635} 1690}
1636 1691
@@ -1650,7 +1705,8 @@ unsigned long drmAgpBase(int fd)
1650{ 1705{
1651 drm_agp_info_t i; 1706 drm_agp_info_t i;
1652 1707
1653 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; 1708 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1709 return 0;
1654 return i.aperture_base; 1710 return i.aperture_base;
1655} 1711}
1656 1712
@@ -1670,7 +1726,8 @@ unsigned long drmAgpSize(int fd)
1670{ 1726{
1671 drm_agp_info_t i; 1727 drm_agp_info_t i;
1672 1728
1673 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; 1729 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1730 return 0;
1674 return i.aperture_size; 1731 return i.aperture_size;
1675} 1732}
1676 1733
@@ -1690,7 +1747,8 @@ unsigned long drmAgpMemoryUsed(int fd)
1690{ 1747{
1691 drm_agp_info_t i; 1748 drm_agp_info_t i;
1692 1749
1693 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; 1750 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1751 return 0;
1694 return i.memory_used; 1752 return i.memory_used;
1695} 1753}
1696 1754
@@ -1710,7 +1768,8 @@ unsigned long drmAgpMemoryAvail(int fd)
1710{ 1768{
1711 drm_agp_info_t i; 1769 drm_agp_info_t i;
1712 1770
1713 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; 1771 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1772 return 0;
1714 return i.memory_allowed; 1773 return i.memory_allowed;
1715} 1774}
1716 1775
@@ -1730,7 +1789,8 @@ unsigned int drmAgpVendorId(int fd)
1730{ 1789{
1731 drm_agp_info_t i; 1790 drm_agp_info_t i;
1732 1791
1733 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; 1792 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1793 return 0;
1734 return i.id_vendor; 1794 return i.id_vendor;
1735} 1795}
1736 1796
@@ -1750,7 +1810,8 @@ unsigned int drmAgpDeviceId(int fd)
1750{ 1810{
1751 drm_agp_info_t i; 1811 drm_agp_info_t i;
1752 1812
1753 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0; 1813 if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i))
1814 return 0;
1754 return i.id_device; 1815 return i.id_device;
1755} 1816}
1756 1817
@@ -1761,7 +1822,8 @@ int drmScatterGatherAlloc(int fd, unsigned long size, drm_handle_t *handle)
1761 *handle = 0; 1822 *handle = 0;
1762 sg.size = size; 1823 sg.size = size;
1763 sg.handle = 0; 1824 sg.handle = 0;
1764 if (ioctl(fd, DRM_IOCTL_SG_ALLOC, &sg)) return -errno; 1825 if (ioctl(fd, DRM_IOCTL_SG_ALLOC, &sg))
1826 return -errno;
1765 *handle = sg.handle; 1827 *handle = sg.handle;
1766 return 0; 1828 return 0;
1767} 1829}
@@ -1772,7 +1834,8 @@ int drmScatterGatherFree(int fd, drm_handle_t handle)
1772 1834
1773 sg.size = 0; 1835 sg.size = 0;
1774 sg.handle = handle; 1836 sg.handle = handle;
1775 if (ioctl(fd, DRM_IOCTL_SG_FREE, &sg)) return -errno; 1837 if (ioctl(fd, DRM_IOCTL_SG_FREE, &sg))
1838 return -errno;
1776 return 0; 1839 return 0;
1777} 1840}
1778 1841
@@ -1802,12 +1865,21 @@ int drmWaitVBlank(int fd, drmVBlankPtr vbl)
1802int drmError(int err, const char *label) 1865int drmError(int err, const char *label)
1803{ 1866{
1804 switch (err) { 1867 switch (err) {
1805 case DRM_ERR_NO_DEVICE: fprintf(stderr, "%s: no device\n", label); break; 1868 case DRM_ERR_NO_DEVICE:
1806 case DRM_ERR_NO_ACCESS: fprintf(stderr, "%s: no access\n", label); break; 1869 fprintf(stderr, "%s: no device\n", label);
1807 case DRM_ERR_NOT_ROOT: fprintf(stderr, "%s: not root\n", label); break; 1870 break;
1808 case DRM_ERR_INVALID: fprintf(stderr, "%s: invalid args\n", label);break; 1871 case DRM_ERR_NO_ACCESS:
1872 fprintf(stderr, "%s: no access\n", label);
1873 break;
1874 case DRM_ERR_NOT_ROOT:
1875 fprintf(stderr, "%s: not root\n", label);
1876 break;
1877 case DRM_ERR_INVALID:
1878 fprintf(stderr, "%s: invalid args\n", label);
1879 break;
1809 default: 1880 default:
1810 if (err < 0) err = -err; 1881 if (err < 0)
1882 err = -err;
1811 fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) ); 1883 fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) );
1812 break; 1884 break;
1813 } 1885 }
@@ -1833,7 +1905,8 @@ int drmCtlInstHandler(int fd, int irq)
1833 1905
1834 ctl.func = DRM_INST_HANDLER; 1906 ctl.func = DRM_INST_HANDLER;
1835 ctl.irq = irq; 1907 ctl.irq = irq;
1836 if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) return -errno; 1908 if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl))
1909 return -errno;
1837 return 0; 1910 return 0;
1838} 1911}
1839 1912
@@ -1855,7 +1928,8 @@ int drmCtlUninstHandler(int fd)
1855 1928
1856 ctl.func = DRM_UNINST_HANDLER; 1929 ctl.func = DRM_UNINST_HANDLER;
1857 ctl.irq = 0; 1930 ctl.irq = 0;
1858 if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) return -errno; 1931 if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl))
1932 return -errno;
1859 return 0; 1933 return 0;
1860} 1934}
1861 1935
@@ -1871,7 +1945,8 @@ int drmFinish(int fd, int context, drmLockFlags flags)
1871 if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL; 1945 if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL;
1872 if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES; 1946 if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
1873 if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES; 1947 if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
1874 if (ioctl(fd, DRM_IOCTL_FINISH, &lock)) return -errno; 1948 if (ioctl(fd, DRM_IOCTL_FINISH, &lock))
1949 return -errno;
1875 return 0; 1950 return 0;
1876} 1951}
1877 1952
@@ -1896,7 +1971,8 @@ int drmGetInterruptFromBusID(int fd, int busnum, int devnum, int funcnum)
1896 p.busnum = busnum; 1971 p.busnum = busnum;
1897 p.devnum = devnum; 1972 p.devnum = devnum;
1898 p.funcnum = funcnum; 1973 p.funcnum = funcnum;
1899 if (ioctl(fd, DRM_IOCTL_IRQ_BUSID, &p)) return -errno; 1974 if (ioctl(fd, DRM_IOCTL_IRQ_BUSID, &p))
1975 return -errno;
1900 return p.irq; 1976 return p.irq;
1901} 1977}
1902 1978
@@ -1923,7 +1999,8 @@ void *drmGetContextTag(int fd, drm_context_t context)
1923 drmHashEntry *entry = drmGetEntry(fd); 1999 drmHashEntry *entry = drmGetEntry(fd);
1924 void *value; 2000 void *value;
1925 2001
1926 if (drmHashLookup(entry->tagTable, context, &value)) return NULL; 2002 if (drmHashLookup(entry->tagTable, context, &value))
2003 return NULL;
1927 2004
1928 return value; 2005 return value;
1929} 2006}
@@ -1936,7 +2013,8 @@ int drmAddContextPrivateMapping(int fd, drm_context_t ctx_id,
1936 map.ctx_id = ctx_id; 2013 map.ctx_id = ctx_id;
1937 map.handle = (void *)handle; 2014 map.handle = (void *)handle;
1938 2015
1939 if (ioctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map)) return -errno; 2016 if (ioctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map))
2017 return -errno;
1940 return 0; 2018 return 0;
1941} 2019}
1942 2020
@@ -1947,8 +2025,10 @@ int drmGetContextPrivateMapping(int fd, drm_context_t ctx_id,
1947 2025
1948 map.ctx_id = ctx_id; 2026 map.ctx_id = ctx_id;
1949 2027
1950 if (ioctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map)) return -errno; 2028 if (ioctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map))
1951 if (handle) *handle = (drm_handle_t)map.handle; 2029 return -errno;
2030 if (handle)
2031 *handle = (drm_handle_t)map.handle;
1952 2032
1953 return 0; 2033 return 0;
1954} 2034}
@@ -1960,7 +2040,8 @@ int drmGetMap(int fd, int idx, drm_handle_t *offset, drmSize *size,
1960 drm_map_t map; 2040 drm_map_t map;
1961 2041
1962 map.offset = idx; 2042 map.offset = idx;
1963 if (ioctl(fd, DRM_IOCTL_GET_MAP, &map)) return -errno; 2043 if (ioctl(fd, DRM_IOCTL_GET_MAP, &map))
2044 return -errno;
1964 *offset = map.offset; 2045 *offset = map.offset;
1965 *size = map.size; 2046 *size = map.size;
1966 *type = map.type; 2047 *type = map.type;
@@ -1976,7 +2057,8 @@ int drmGetClient(int fd, int idx, int *auth, int *pid, int *uid,
1976 drm_client_t client; 2057 drm_client_t client;
1977 2058
1978 client.idx = idx; 2059 client.idx = idx;
1979 if (ioctl(fd, DRM_IOCTL_GET_CLIENT, &client)) return -errno; 2060 if (ioctl(fd, DRM_IOCTL_GET_CLIENT, &client))
2061 return -errno;
1980 *auth = client.auth; 2062 *auth = client.auth;
1981 *pid = client.pid; 2063 *pid = client.pid;
1982 *uid = client.uid; 2064 *uid = client.uid;
@@ -1990,7 +2072,8 @@ int drmGetStats(int fd, drmStatsT *stats)
1990 drm_stats_t s; 2072 drm_stats_t s;
1991 int i; 2073 int i;
1992 2074
1993 if (ioctl(fd, DRM_IOCTL_GET_STATS, &s)) return -errno; 2075 if (ioctl(fd, DRM_IOCTL_GET_STATS, &s))
2076 return -errno;
1994 2077
1995 stats->count = 0; 2078 stats->count = 0;
1996 memset(stats, 0, sizeof(*stats)); 2079 memset(stats, 0, sizeof(*stats));
@@ -2292,7 +2375,7 @@ int drmFenceCreate(int fd, unsigned flags, int class, unsigned type,
2292int drmFenceBuffers(int fd, unsigned flags, drmFence *fence) 2375int drmFenceBuffers(int fd, unsigned flags, drmFence *fence)
2293{ 2376{
2294 drm_fence_arg_t arg; 2377 drm_fence_arg_t arg;
2295 2378
2296 memset(&arg, 0, sizeof(arg)); 2379 memset(&arg, 0, sizeof(arg));
2297 arg.flags = flags; 2380 arg.flags = flags;
2298 arg.op = drm_fence_buffers; 2381 arg.op = drm_fence_buffers;
@@ -2309,7 +2392,7 @@ int drmFenceBuffers(int fd, unsigned flags, drmFence *fence)
2309int drmFenceDestroy(int fd, const drmFence *fence) 2392int drmFenceDestroy(int fd, const drmFence *fence)
2310{ 2393{
2311 drm_fence_arg_t arg; 2394 drm_fence_arg_t arg;
2312 2395
2313 memset(&arg, 0, sizeof(arg)); 2396 memset(&arg, 0, sizeof(arg));
2314 arg.handle = fence->handle; 2397 arg.handle = fence->handle;
2315 arg.op = drm_fence_destroy; 2398 arg.op = drm_fence_destroy;
@@ -2321,7 +2404,7 @@ int drmFenceDestroy(int fd, const drmFence *fence)
2321int drmFenceReference(int fd, unsigned handle, drmFence *fence) 2404int drmFenceReference(int fd, unsigned handle, drmFence *fence)
2322{ 2405{
2323 drm_fence_arg_t arg; 2406 drm_fence_arg_t arg;
2324 2407
2325 memset(&arg, 0, sizeof(arg)); 2408 memset(&arg, 0, sizeof(arg));
2326 arg.handle = handle; 2409 arg.handle = handle;
2327 arg.op = drm_fence_reference; 2410 arg.op = drm_fence_reference;
@@ -2338,7 +2421,7 @@ int drmFenceReference(int fd, unsigned handle, drmFence *fence)
2338int drmFenceUnreference(int fd, const drmFence *fence) 2421int drmFenceUnreference(int fd, const drmFence *fence)
2339{ 2422{
2340 drm_fence_arg_t arg; 2423 drm_fence_arg_t arg;
2341 2424
2342 memset(&arg, 0, sizeof(arg)); 2425 memset(&arg, 0, sizeof(arg));
2343 arg.handle = fence->handle; 2426 arg.handle = fence->handle;
2344 arg.op = drm_fence_unreference; 2427 arg.op = drm_fence_unreference;
@@ -2350,7 +2433,7 @@ int drmFenceUnreference(int fd, const drmFence *fence)
2350int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type) 2433int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type)
2351{ 2434{
2352 drm_fence_arg_t arg; 2435 drm_fence_arg_t arg;
2353 2436
2354 memset(&arg, 0, sizeof(arg)); 2437 memset(&arg, 0, sizeof(arg));
2355 arg.handle = fence->handle; 2438 arg.handle = fence->handle;
2356 arg.type = flush_type; 2439 arg.type = flush_type;
@@ -2365,8 +2448,8 @@ int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type)
2365 2448
2366int drmFenceUpdate(int fd, drmFence *fence) 2449int drmFenceUpdate(int fd, drmFence *fence)
2367{ 2450{
2368 drm_fence_arg_t arg; 2451 drm_fence_arg_t arg;
2369 2452
2370 memset(&arg, 0, sizeof(arg)); 2453 memset(&arg, 0, sizeof(arg));
2371 arg.handle = fence->handle; 2454 arg.handle = fence->handle;
2372 arg.op = drm_fence_signaled; 2455 arg.op = drm_fence_signaled;
@@ -2381,13 +2464,9 @@ int drmFenceUpdate(int fd, drmFence *fence)
2381int drmFenceSignaled(int fd, drmFence *fence, unsigned fenceType, 2464int drmFenceSignaled(int fd, drmFence *fence, unsigned fenceType,
2382 int *signaled) 2465 int *signaled)
2383{ 2466{
2384 int
2385 ret;
2386
2387 if ((fence->flags & DRM_FENCE_FLAG_SHAREABLE) || 2467 if ((fence->flags & DRM_FENCE_FLAG_SHAREABLE) ||
2388 ((fenceType & fence->signaled) != fenceType)) { 2468 ((fenceType & fence->signaled) != fenceType)) {
2389 2469 int ret = drmFenceFlush(fd, fence, fenceType);
2390 ret = drmFenceFlush(fd, fence, fenceType);
2391 if (ret) 2470 if (ret)
2392 return ret; 2471 return ret;
2393 } 2472 }
@@ -2514,8 +2593,8 @@ void drmBOFreeList(drmBOList *list)
2514 } 2593 }
2515} 2594}
2516 2595
2517int drmBOResetList(drmBOList *list) { 2596int drmBOResetList(drmBOList *list)
2518 2597{
2519 drmMMListHead *l; 2598 drmMMListHead *l;
2520 int ret; 2599 int ret;
2521 2600
@@ -2524,7 +2603,7 @@ int drmBOResetList(drmBOList *list) {
2524 return ret; 2603 return ret;
2525 2604
2526 l = list->list.next; 2605 l = list->list.next;
2527 while(l != &list->list) { 2606 while (l != &list->list) {
2528 DRMLISTDEL(l); 2607 DRMLISTDEL(l);
2529 DRMLISTADD(l, &list->free); 2608 DRMLISTADD(l, &list->free);
2530 list->numOnList--; 2609 list->numOnList--;
@@ -2547,7 +2626,8 @@ static drmBONode *drmAddListItem(drmBOList *list, drmBO *item,
2547 return NULL; 2626 return NULL;
2548 } 2627 }
2549 list->numCurrent++; 2628 list->numCurrent++;
2550 } else { 2629 }
2630 else {
2551 DRMLISTDEL(l); 2631 DRMLISTDEL(l);
2552 node = DRMLISTENTRY(drmBONode, l, head); 2632 node = DRMLISTENTRY(drmBONode, l, head);
2553 } 2633 }
@@ -2584,7 +2664,6 @@ drmBO *drmBOListBuf(void *iterator)
2584 drmBONode *node; 2664 drmBONode *node;
2585 drmMMListHead *l = (drmMMListHead *) iterator; 2665 drmMMListHead *l = (drmMMListHead *) iterator;
2586 node = DRMLISTENTRY(drmBONode, l, head); 2666 node = DRMLISTENTRY(drmBONode, l, head);
2587
2588 return node->buf; 2667 return node->buf;
2589} 2668}
2590 2669
@@ -2599,8 +2678,7 @@ int drmBOCreateList(int numTarget, drmBOList *list)
2599 return drmAdjustListNodes(list); 2678 return drmAdjustListNodes(list);
2600} 2679}
2601 2680
2602static void drmBOCopyReply(const drm_bo_arg_reply_t *rep, 2681static void drmBOCopyReply(const drm_bo_arg_reply_t *rep, drmBO *buf)
2603 drmBO *buf)
2604{ 2682{
2605 buf->handle = rep->handle; 2683 buf->handle = rep->handle;
2606 buf->flags = rep->flags; 2684 buf->flags = rep->flags;
@@ -2613,8 +2691,6 @@ static void drmBOCopyReply(const drm_bo_arg_reply_t *rep,
2613 buf->replyFlags = rep->rep_flags; 2691 buf->replyFlags = rep->rep_flags;
2614 buf->pageAlignment = rep->page_alignment; 2692 buf->pageAlignment = rep->page_alignment;
2615} 2693}
2616
2617
2618 2694
2619int drmBOCreate(int fd, unsigned long start, unsigned long size, 2695int drmBOCreate(int fd, unsigned long start, unsigned long size,
2620 unsigned pageAlignment, void *user_buffer, drm_bo_type_t type, 2696 unsigned pageAlignment, void *user_buffer, drm_bo_type_t type,
@@ -2704,7 +2780,6 @@ int drmBODestroy(int fd, drmBO *buf)
2704 2780
2705int drmBOReference(int fd, unsigned handle, drmBO *buf) 2781int drmBOReference(int fd, unsigned handle, drmBO *buf)
2706{ 2782{
2707
2708 drm_bo_arg_t arg; 2783 drm_bo_arg_t arg;
2709 drm_bo_arg_request_t *req = &arg.d.req; 2784 drm_bo_arg_request_t *req = &arg.d.req;
2710 drm_bo_arg_reply_t *rep = &arg.d.rep; 2785 drm_bo_arg_reply_t *rep = &arg.d.rep;
@@ -2736,7 +2811,6 @@ int drmBOUnReference(int fd, drmBO *buf)
2736 drm_bo_arg_t arg; 2811 drm_bo_arg_t arg;
2737 drm_bo_arg_request_t *req = &arg.d.req; 2812 drm_bo_arg_request_t *req = &arg.d.req;
2738 drm_bo_arg_reply_t *rep = &arg.d.rep; 2813 drm_bo_arg_reply_t *rep = &arg.d.rep;
2739
2740 2814
2741 if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) { 2815 if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) {
2742 (void) munmap(buf->mapVirtual, buf->start + buf->size); 2816 (void) munmap(buf->mapVirtual, buf->start + buf->size);
@@ -2770,7 +2844,6 @@ int drmBOUnReference(int fd, drmBO *buf)
2770int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint, 2844int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,
2771 void **address) 2845 void **address)
2772{ 2846{
2773
2774 drm_bo_arg_t arg; 2847 drm_bo_arg_t arg;
2775 drm_bo_arg_request_t *req = &arg.d.req; 2848 drm_bo_arg_request_t *req = &arg.d.req;
2776 drm_bo_arg_reply_t *rep = &arg.d.rep; 2849 drm_bo_arg_reply_t *rep = &arg.d.rep;
@@ -2830,7 +2903,6 @@ int drmBOUnmap(int fd, drmBO *buf)
2830 drm_bo_arg_request_t *req = &arg.d.req; 2903 drm_bo_arg_request_t *req = &arg.d.req;
2831 drm_bo_arg_reply_t *rep = &arg.d.rep; 2904 drm_bo_arg_reply_t *rep = &arg.d.rep;
2832 2905
2833
2834 memset(&arg, 0, sizeof(arg)); 2906 memset(&arg, 0, sizeof(arg));
2835 req->handle = buf->handle; 2907 req->handle = buf->handle;
2836 req->op = drm_bo_unmap; 2908 req->op = drm_bo_unmap;
@@ -2864,7 +2936,7 @@ int drmBOValidate(int fd, drmBO *buf, unsigned flags, unsigned mask,
2864 do{ 2936 do{
2865 ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); 2937 ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
2866 } while (ret && errno == EAGAIN); 2938 } while (ret && errno == EAGAIN);
2867 2939
2868 if (ret) 2940 if (ret)
2869 return -errno; 2941 return -errno;
2870 if (!arg.handled) 2942 if (!arg.handled)
@@ -2891,7 +2963,7 @@ int drmBOFence(int fd, drmBO *buf, unsigned flags, unsigned fenceHandle)
2891 req->op = drm_bo_fence; 2963 req->op = drm_bo_fence;
2892 2964
2893 ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); 2965 ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
2894 2966
2895 if (ret) 2967 if (ret)
2896 return -errno; 2968 return -errno;
2897 if (!arg.handled) 2969 if (!arg.handled)
@@ -2913,7 +2985,7 @@ int drmBOInfo(int fd, drmBO *buf)
2913 req->op = drm_bo_info; 2985 req->op = drm_bo_info;
2914 2986
2915 ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); 2987 ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
2916 2988
2917 if (ret) 2989 if (ret)
2918 return -errno; 2990 return -errno;
2919 if (!arg.handled) 2991 if (!arg.handled)
@@ -2959,7 +3031,8 @@ int drmBOBusy(int fd, drmBO *buf, int *busy)
2959 !(buf->replyFlags & DRM_BO_REP_BUSY)) { 3031 !(buf->replyFlags & DRM_BO_REP_BUSY)) {
2960 *busy = 0; 3032 *busy = 0;
2961 return 0; 3033 return 0;
2962 } else { 3034 }
3035 else {
2963 int ret = drmBOInfo(fd, buf); 3036 int ret = drmBOInfo(fd, buf);
2964 if (ret) 3037 if (ret)
2965 return ret; 3038 return ret;
@@ -2995,7 +3068,8 @@ int drmAddValidateItem(drmBOList *list, drmBO *buf, unsigned flags,
2995 *newItem = 1; 3068 *newItem = 1;
2996 cur->arg0 = flags; 3069 cur->arg0 = flags;
2997 cur->arg1 = mask; 3070 cur->arg1 = mask;
2998 } else { 3071 }
3072 else {
2999 unsigned memMask = (cur->arg1 | mask) & DRM_BO_MASK_MEM; 3073 unsigned memMask = (cur->arg1 | mask) & DRM_BO_MASK_MEM;
3000 unsigned memFlags = cur->arg0 & flags & memMask; 3074 unsigned memFlags = cur->arg0 & flags & memMask;
3001 3075
@@ -3027,134 +3101,129 @@ int drmAddValidateItem(drmBOList *list, drmBO *buf, unsigned flags,
3027 3101
3028int drmBOValidateList(int fd, drmBOList *list) 3102int drmBOValidateList(int fd, drmBOList *list)
3029{ 3103{
3030 3104 drmBONode *node;
3031 drmBONode *node; 3105 drmMMListHead *l;
3032 drmMMListHead *l; 3106 drm_bo_arg_t *arg, *first;
3033 drm_bo_arg_t *arg, *first; 3107 drm_bo_arg_request_t *req;
3034 drm_bo_arg_request_t *req; 3108 drm_bo_arg_reply_t *rep;
3035 drm_bo_arg_reply_t *rep; 3109 drm_u64_t *prevNext = NULL;
3036 drm_u64_t *prevNext = NULL; 3110 drmBO *buf;
3037 drmBO *buf; 3111 int ret;
3038 int ret;
3039
3040 first = NULL;
3041
3042 for (l = list->list.next; l != &list->list; l = l->next) {
3043 node = DRMLISTENTRY(drmBONode, l, head);
3044
3045 arg = &node->bo_arg;
3046 req = &arg->d.req;
3047
3048 if (!first)
3049 first = arg;
3050
3051 if (prevNext)
3052 *prevNext = (unsigned long) arg;
3053
3054 memset(arg, 0, sizeof(*arg));
3055 prevNext = &arg->next;
3056 req->handle = node->buf->handle;
3057 req->op = drm_bo_validate;
3058 req->mask = node->arg0;
3059 req->hint = 0;
3060 req->arg_handle = node->arg1;
3061 }
3062
3063 if (!first)
3064 return 0;
3065 3112
3066 do{ 3113 first = NULL;
3067 ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first);
3068 } while (ret && errno == EAGAIN);
3069 3114
3115 for (l = list->list.next; l != &list->list; l = l->next) {
3116 node = DRMLISTENTRY(drmBONode, l, head);
3117
3118 arg = &node->bo_arg;
3119 req = &arg->d.req;
3070 3120
3071 if (ret) 3121 if (!first)
3072 return -errno; 3122 first = arg;
3123
3124 if (prevNext)
3125 *prevNext = (unsigned long) arg;
3126
3127 memset(arg, 0, sizeof(*arg));
3128 prevNext = &arg->next;
3129 req->handle = node->buf->handle;
3130 req->op = drm_bo_validate;
3131 req->mask = node->arg0;
3132 req->hint = 0;
3133 req->arg_handle = node->arg1;
3134 }
3073 3135
3074 for (l = list->list.next; l != &list->list; l = l->next) { 3136 if (!first)
3075 node = DRMLISTENTRY(drmBONode, l, head); 3137 return 0;
3076 arg = &node->bo_arg; 3138
3077 rep = &arg->d.rep; 3139 do {
3078 3140 ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first);
3079 if (!arg->handled) { 3141 } while (ret && errno == EAGAIN);
3080 drmMsg("Unhandled request\n"); 3142
3081 return -EFAULT; 3143 if (ret)
3082 } 3144 return -errno;
3083 if (rep->ret) 3145
3084 return rep->ret; 3146 for (l = list->list.next; l != &list->list; l = l->next) {
3085 3147 node = DRMLISTENTRY(drmBONode, l, head);
3086 buf = node->buf; 3148 arg = &node->bo_arg;
3087 drmBOCopyReply(rep, buf); 3149 rep = &arg->d.rep;
3088 } 3150
3089 3151 if (!arg->handled) {
3090 return 0; 3152 drmMsg("Unhandled request\n");
3153 return -EFAULT;
3154 }
3155 if (rep->ret)
3156 return rep->ret;
3157
3158 buf = node->buf;
3159 drmBOCopyReply(rep, buf);
3160 }
3161
3162 return 0;
3091} 3163}
3092 3164
3093 3165
3094int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle) 3166int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle)
3095{ 3167{
3096 3168 drmBONode *node;
3097 drmBONode *node; 3169 drmMMListHead *l;
3098 drmMMListHead *l; 3170 drm_bo_arg_t *arg, *first;
3099 drm_bo_arg_t *arg, *first; 3171 drm_bo_arg_request_t *req;
3100 drm_bo_arg_request_t *req; 3172 drm_bo_arg_reply_t *rep;
3101 drm_bo_arg_reply_t *rep; 3173 drm_u64_t *prevNext = NULL;
3102 drm_u64_t *prevNext = NULL; 3174 drmBO *buf;
3103 drmBO *buf; 3175 unsigned fence_flags;
3104 unsigned fence_flags; 3176 int ret;
3105 int ret; 3177
3106 3178 first = NULL;
3107 first = NULL;
3108
3109 for (l = list->list.next; l != &list->list; l = l->next) {
3110 node = DRMLISTENTRY(drmBONode, l, head);
3111
3112 arg = &node->bo_arg;
3113 req = &arg->d.req;
3114
3115 if (!first)
3116 first = arg;
3117
3118 if (prevNext)
3119 *prevNext = (unsigned long) arg;
3120
3121 memset(arg, 0, sizeof(*arg));
3122 prevNext = &arg->next;
3123 req->handle = node->buf->handle;
3124 req->op = drm_bo_fence;
3125 req->mask = node->arg0;
3126 req->arg_handle = fenceHandle;
3127 }
3128
3129 if (!first)
3130 return 0;
3131 3179
3132 ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first); 3180 for (l = list->list.next; l != &list->list; l = l->next) {
3181 node = DRMLISTENTRY(drmBONode, l, head);
3182
3183 arg = &node->bo_arg;
3184 req = &arg->d.req;
3133 3185
3134 if (ret) 3186 if (!first)
3135 return -errno; 3187 first = arg;
3188
3189 if (prevNext)
3190 *prevNext = (unsigned long) arg;
3191
3192 memset(arg, 0, sizeof(*arg));
3193 prevNext = &arg->next;
3194 req->handle = node->buf->handle;
3195 req->op = drm_bo_fence;
3196 req->mask = node->arg0;
3197 req->arg_handle = fenceHandle;
3198 }
3136 3199
3137 for (l = list->list.next; l != &list->list; l = l->next) { 3200 if (!first)
3138 node = DRMLISTENTRY(drmBONode, l, head); 3201 return 0;
3139 3202
3140 arg = &node->bo_arg; 3203 ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first);
3141 rep = &arg->d.rep;
3142
3143 if (!arg->handled)
3144 return -EFAULT;
3145 if (rep->ret)
3146 return rep->ret;
3147 drmBOCopyReply(rep, node->buf);
3148 }
3149 3204
3150 return 0; 3205 if (ret)
3206 return -errno;
3207
3208 for (l = list->list.next; l != &list->list; l = l->next) {
3209 node = DRMLISTENTRY(drmBONode, l, head);
3210 arg = &node->bo_arg;
3211 rep = &arg->d.rep;
3212 if (!arg->handled)
3213 return -EFAULT;
3214 if (rep->ret)
3215 return rep->ret;
3216 drmBOCopyReply(rep, node->buf);
3217 }
3218
3219 return 0;
3151} 3220}
3152 3221
3153int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize, 3222int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize,
3154 unsigned memType) 3223 unsigned memType)
3155{ 3224{
3156 drm_mm_init_arg_t arg; 3225 drm_mm_init_arg_t arg;
3157 3226
3158 memset(&arg, 0, sizeof(arg)); 3227 memset(&arg, 0, sizeof(arg));
3159 arg.req.op = mm_init; 3228 arg.req.op = mm_init;
3160 arg.req.p_offset = pOffset; 3229 arg.req.p_offset = pOffset;
@@ -3163,7 +3232,6 @@ int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize,
3163 3232
3164 if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg)) 3233 if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg))
3165 return -errno; 3234 return -errno;
3166
3167 return 0; 3235 return 0;
3168} 3236}
3169 3237
@@ -3171,14 +3239,12 @@ int drmMMTakedown(int fd, unsigned memType)
3171{ 3239{
3172 drm_mm_init_arg_t arg; 3240 drm_mm_init_arg_t arg;
3173 3241
3174
3175 memset(&arg, 0, sizeof(arg)); 3242 memset(&arg, 0, sizeof(arg));
3176 arg.req.op = mm_takedown; 3243 arg.req.op = mm_takedown;
3177 arg.req.mem_type = memType; 3244 arg.req.mem_type = memType;
3178 3245
3179 if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg)) 3246 if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg))
3180 return -errno; 3247 return -errno;
3181
3182 return 0; 3248 return 0;
3183} 3249}
3184 3250
@@ -3194,7 +3260,6 @@ int drmMMLock(int fd, unsigned memType)
3194 do{ 3260 do{
3195 ret = ioctl(fd, DRM_IOCTL_MM_INIT, &arg); 3261 ret = ioctl(fd, DRM_IOCTL_MM_INIT, &arg);
3196 } while (ret && errno == EAGAIN); 3262 } while (ret && errno == EAGAIN);
3197
3198 return -errno; 3263 return -errno;
3199} 3264}
3200 3265
@@ -3210,15 +3275,14 @@ int drmMMUnlock(int fd, unsigned memType)
3210 do{ 3275 do{
3211 ret = ioctl(fd, DRM_IOCTL_MM_INIT, &arg); 3276 ret = ioctl(fd, DRM_IOCTL_MM_INIT, &arg);
3212 } while (ret && errno == EAGAIN); 3277 } while (ret && errno == EAGAIN);
3213
3214 return -errno; 3278 return -errno;
3215} 3279}
3216 3280
3217#define DRM_MAX_FDS 16 3281#define DRM_MAX_FDS 16
3218static struct { 3282static struct {
3219 char *BusID; 3283 char *BusID;
3220 int fd; 3284 int fd;
3221 int refcount; 3285 int refcount;
3222} connection[DRM_MAX_FDS]; 3286} connection[DRM_MAX_FDS];
3223 3287
3224static int nr_fds = 0; 3288static int nr_fds = 0;
@@ -3227,50 +3291,50 @@ int drmOpenOnce(void *unused,
3227 const char *BusID, 3291 const char *BusID,
3228 int *newlyopened) 3292 int *newlyopened)
3229{ 3293{
3230 int i; 3294 int i;
3231 int fd; 3295 int fd;
3232 3296
3233 for (i = 0; i < nr_fds; i++) 3297 for (i = 0; i < nr_fds; i++)
3234 if (strcmp(BusID, connection[i].BusID) == 0) { 3298 if (strcmp(BusID, connection[i].BusID) == 0) {
3235 connection[i].refcount++; 3299 connection[i].refcount++;
3236 *newlyopened = 0; 3300 *newlyopened = 0;
3237 return connection[i].fd; 3301 return connection[i].fd;
3238 } 3302 }
3239 3303
3240 fd = drmOpen(unused, BusID); 3304 fd = drmOpen(unused, BusID);
3241 if (fd <= 0 || nr_fds == DRM_MAX_FDS) 3305 if (fd <= 0 || nr_fds == DRM_MAX_FDS)
3242 return fd; 3306 return fd;
3243 3307
3244 connection[nr_fds].BusID = strdup(BusID); 3308 connection[nr_fds].BusID = strdup(BusID);
3245 connection[nr_fds].fd = fd; 3309 connection[nr_fds].fd = fd;
3246 connection[nr_fds].refcount = 1; 3310 connection[nr_fds].refcount = 1;
3247 *newlyopened = 1; 3311 *newlyopened = 1;
3248 3312
3249 if (0) 3313 if (0)
3250 fprintf(stderr, "saved connection %d for %s %d\n", 3314 fprintf(stderr, "saved connection %d for %s %d\n",
3251 nr_fds, connection[nr_fds].BusID, 3315 nr_fds, connection[nr_fds].BusID,
3252 strcmp(BusID, connection[nr_fds].BusID)); 3316 strcmp(BusID, connection[nr_fds].BusID));
3253 3317
3254 nr_fds++; 3318 nr_fds++;
3255 3319
3256 return fd; 3320 return fd;
3257} 3321}
3258 3322
3259void drmCloseOnce(int fd) 3323void drmCloseOnce(int fd)
3260{ 3324{
3261 int i; 3325 int i;
3262 3326
3263 for (i = 0; i < nr_fds; i++) { 3327 for (i = 0; i < nr_fds; i++) {
3264 if (fd == connection[i].fd) { 3328 if (fd == connection[i].fd) {
3265 if (--connection[i].refcount == 0) { 3329 if (--connection[i].refcount == 0) {
3266 drmClose(connection[i].fd); 3330 drmClose(connection[i].fd);
3267 free(connection[i].BusID); 3331 free(connection[i].BusID);
3268 3332
3269 if (i < --nr_fds) 3333 if (i < --nr_fds)
3270 connection[i] = connection[nr_fds]; 3334 connection[i] = connection[nr_fds];
3271 3335
3272 return; 3336 return;
3273 } 3337 }
3274 } 3338 }
3275 } 3339 }
3276} 3340}