diff options
author | Brian | 2007-05-29 15:54:00 -0500 |
---|---|---|
committer | Brian | 2007-05-29 15:54:00 -0500 |
commit | ccd7b6e8ddeac936518f626d2326ae439931b2bf (patch) | |
tree | 023a9d3043ec5bd50a3f5bf072ce04a1ba4ff26b /libdrm/xf86drm.c | |
parent | 056c2f249a61ba7078bae3d767a59f2be4c6556e (diff) | |
download | libdrm-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.c | 642 |
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 | ||
93 | void drmSetServerInfo(drmServerInfoPtr info) | 93 | void 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 | ||
107 | static int drmDebugPrint(const char *format, va_list ap) | 107 | static 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 | ||
112 | static int (*drm_debug_print)(const char *format, va_list ap) = drmDebugPrint; | 112 | static int (*drm_debug_print)(const char *format, va_list ap) = drmDebugPrint; |
@@ -131,26 +131,28 @@ drmMsg(const char *format, ...) | |||
131 | void | 131 | void |
132 | drmSetDebugMsgFunction(int (*debug_msg_ptr)(const char *format, va_list ap)) | 132 | drmSetDebugMsgFunction(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 | ||
137 | static void *drmHashTable = NULL; /* Context switch callbacks */ | 137 | static void *drmHashTable = NULL; /* Context switch callbacks */ |
138 | 138 | ||
139 | void *drmGetHashTable(void) | 139 | void *drmGetHashTable(void) |
140 | { | 140 | { |
141 | return drmHashTable; | 141 | return drmHashTable; |
142 | } | 142 | } |
143 | 143 | ||
144 | void *drmMalloc(int size) | 144 | void *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 | ||
151 | void drmFree(void *pt) | 152 | void 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 | */ |
581 | void drmFreeVersion(drmVersionPtr v) | 590 | void 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 | */ |
600 | static void drmFreeKernelVersion(drm_version_t *v) | 610 | static 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 | ||
1386 | int drmCreateDrawable(int fd, drm_drawable_t *handle) | 1427 | int 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 | */ |
1430 | int drmAgpAcquire(int fd) | 1474 | int 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 | */ |
1447 | int drmAgpRelease(int fd) | 1492 | int 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) | |||
1802 | int drmError(int err, const char *label) | 1865 | int 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, | |||
2292 | int drmFenceBuffers(int fd, unsigned flags, drmFence *fence) | 2375 | int 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) | |||
2309 | int drmFenceDestroy(int fd, const drmFence *fence) | 2392 | int 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) | |||
2321 | int drmFenceReference(int fd, unsigned handle, drmFence *fence) | 2404 | int 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) | |||
2338 | int drmFenceUnreference(int fd, const drmFence *fence) | 2421 | int 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) | |||
2350 | int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type) | 2433 | int 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 | ||
2366 | int drmFenceUpdate(int fd, drmFence *fence) | 2449 | int 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) | |||
2381 | int drmFenceSignaled(int fd, drmFence *fence, unsigned fenceType, | 2464 | int 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 | ||
2517 | int drmBOResetList(drmBOList *list) { | 2596 | int 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 | ||
2602 | static void drmBOCopyReply(const drm_bo_arg_reply_t *rep, | 2681 | static 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 | ||
2619 | int drmBOCreate(int fd, unsigned long start, unsigned long size, | 2695 | int 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 | ||
2705 | int drmBOReference(int fd, unsigned handle, drmBO *buf) | 2781 | int 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) | |||
2770 | int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint, | 2844 | int 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 | ||
3028 | int drmBOValidateList(int fd, drmBOList *list) | 3102 | int 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 | ||
3094 | int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle) | 3166 | int 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 | ||
3153 | int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize, | 3222 | int 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 |
3218 | static struct { | 3282 | static 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 | ||
3224 | static int nr_fds = 0; | 3288 | static 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 | ||
3259 | void drmCloseOnce(int fd) | 3323 | void 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 | } |