aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGareth Hughes2001-02-15 02:12:14 -0600
committerGareth Hughes2001-02-15 02:12:14 -0600
commit360475376c5a597caf4a981c934a6b0d783fa94d (patch)
tree433f6970813deb74a2c8e1636b772a1f8567b267 /libdrm/xf86drm.c
parent38c22bc4883ac201bde7f5f130a72acd1be68ec5 (diff)
downloadexternal-libgbm-360475376c5a597caf4a981c934a6b0d783fa94d.tar.gz
external-libgbm-360475376c5a597caf4a981c934a6b0d783fa94d.tar.xz
external-libgbm-360475376c5a597caf4a981c934a6b0d783fa94d.zip
Merge mga-1-0-0-branch into trunk.
Diffstat (limited to 'libdrm/xf86drm.c')
-rw-r--r--libdrm/xf86drm.c64
1 files changed, 37 insertions, 27 deletions
diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index 5c2c08c3..e472aada 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -11,11 +11,11 @@
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the 12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions: 13 * Software is furnished to do so, subject to the following conditions:
14 * 14 *
15 * The above copyright notice and this permission notice (including the next 15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the 16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software. 17 * Software.
18 * 18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
@@ -23,12 +23,12 @@
23 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 23 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 24 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 * DEALINGS IN THE SOFTWARE. 25 * DEALINGS IN THE SOFTWARE.
26 * 26 *
27 * Authors: Rickard E. (Rik) Faith <faith@valinux.com> 27 * Authors: Rickard E. (Rik) Faith <faith@valinux.com>
28 * Kevin E. Martin <martin@valinux.com> 28 * Kevin E. Martin <martin@valinux.com>
29 * 29 *
30 * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.17 2000/09/24 13:51:32 alanh Exp $ 30 * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.17 2000/09/24 13:51:32 alanh Exp $
31 * 31 *
32 */ 32 */
33 33
34#ifdef XFree86Server 34#ifdef XFree86Server
@@ -119,7 +119,7 @@ void drmFree(void *pt)
119static char *drmStrdup(const char *s) 119static char *drmStrdup(const char *s)
120{ 120{
121 char *retval = NULL; 121 char *retval = NULL;
122 122
123 if (s) { 123 if (s) {
124 retval = _DRM_MALLOC(strlen(s)+1); 124 retval = _DRM_MALLOC(strlen(s)+1);
125 strcpy(retval, s); 125 strcpy(retval, s);
@@ -213,7 +213,7 @@ int drmAvailable(void)
213 drmVersionPtr version; 213 drmVersionPtr version;
214 int retval = 0; 214 int retval = 0;
215 int fd; 215 int fd;
216 216
217 if (!access("/proc/dri/0", R_OK)) return 1; 217 if (!access("/proc/dri/0", R_OK)) return 1;
218 218
219 sprintf(dev_name, "/dev/dri-temp-%d", getpid()); 219 sprintf(dev_name, "/dev/dri-temp-%d", getpid());
@@ -408,7 +408,7 @@ drmVersionPtr drmGetVersion(int fd)
408 version->date = NULL; 408 version->date = NULL;
409 version->desc_len = 0; 409 version->desc_len = 0;
410 version->desc = NULL; 410 version->desc = NULL;
411 411
412 if (ioctl(fd, DRM_IOCTL_VERSION, version)) { 412 if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
413 drmFreeKernelVersion(version); 413 drmFreeKernelVersion(version);
414 return NULL; 414 return NULL;
@@ -421,7 +421,7 @@ drmVersionPtr drmGetVersion(int fd)
421 version->date = drmMalloc(version->date_len + 1); 421 version->date = drmMalloc(version->date_len + 1);
422 if (version->desc_len) 422 if (version->desc_len)
423 version->desc = drmMalloc(version->desc_len + 1); 423 version->desc = drmMalloc(version->desc_len + 1);
424 424
425 if (ioctl(fd, DRM_IOCTL_VERSION, version)) { 425 if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
426 drmFreeKernelVersion(version); 426 drmFreeKernelVersion(version);
427 return NULL; 427 return NULL;
@@ -503,7 +503,7 @@ int drmAddMap(int fd,
503 map.offset = offset; 503 map.offset = offset;
504#ifdef __alpha__ 504#ifdef __alpha__
505 /* Make sure we add the bus_base to all but shm */ 505 /* Make sure we add the bus_base to all but shm */
506 if (type != DRM_SHM) 506 if (type != DRM_SHM)
507 map.offset += BUS_BASE; 507 map.offset += BUS_BASE;
508#endif 508#endif
509 map.size = size; 509 map.size = size;
@@ -519,14 +519,14 @@ int drmAddBufs(int fd, int count, int size, drmBufDescFlags flags,
519 int agp_offset) 519 int agp_offset)
520{ 520{
521 drm_buf_desc_t request; 521 drm_buf_desc_t request;
522 522
523 request.count = count; 523 request.count = count;
524 request.size = size; 524 request.size = size;
525 request.low_mark = 0; 525 request.low_mark = 0;
526 request.high_mark = 0; 526 request.high_mark = 0;
527 request.flags = flags; 527 request.flags = flags;
528 request.agp_start = agp_offset; 528 request.agp_start = agp_offset;
529 529
530 if (ioctl(fd, DRM_IOCTL_ADD_BUFS, &request)) return -errno; 530 if (ioctl(fd, DRM_IOCTL_ADD_BUFS, &request)) return -errno;
531 return request.count; 531 return request.count;
532} 532}
@@ -542,16 +542,16 @@ int drmMarkBufs(int fd, double low, double high)
542 if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return -EINVAL; 542 if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return -EINVAL;
543 543
544 if (!info.count) return -EINVAL; 544 if (!info.count) return -EINVAL;
545 545
546 if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) 546 if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
547 return -ENOMEM; 547 return -ENOMEM;
548 548
549 if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) { 549 if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
550 int retval = -errno; 550 int retval = -errno;
551 drmFree(info.list); 551 drmFree(info.list);
552 return retval; 552 return retval;
553 } 553 }
554 554
555 for (i = 0; i < info.count; i++) { 555 for (i = 0; i < info.count; i++) {
556 info.list[i].low_mark = low * info.list[i].count; 556 info.list[i].low_mark = low * info.list[i].count;
557 info.list[i].high_mark = high * info.list[i].count; 557 info.list[i].high_mark = high * info.list[i].count;
@@ -562,7 +562,7 @@ int drmMarkBufs(int fd, double low, double high)
562 } 562 }
563 } 563 }
564 drmFree(info.list); 564 drmFree(info.list);
565 565
566 return 0; 566 return 0;
567} 567}
568 568
@@ -630,7 +630,7 @@ drmBufInfoPtr drmGetBufInfo(int fd)
630 if (info.count) { 630 if (info.count) {
631 if (!(info.list = drmMalloc(info.count * sizeof(*info.list)))) 631 if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
632 return NULL; 632 return NULL;
633 633
634 if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) { 634 if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
635 drmFree(info.list); 635 drmFree(info.list);
636 return NULL; 636 return NULL;
@@ -657,7 +657,7 @@ drmBufMapPtr drmMapBufs(int fd)
657 drm_buf_map_t bufs; 657 drm_buf_map_t bufs;
658 drmBufMapPtr retval; 658 drmBufMapPtr retval;
659 int i; 659 int i;
660 660
661 bufs.count = 0; 661 bufs.count = 0;
662 bufs.list = NULL; 662 bufs.list = NULL;
663 if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) return NULL; 663 if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) return NULL;
@@ -689,16 +689,19 @@ drmBufMapPtr drmMapBufs(int fd)
689int drmUnmapBufs(drmBufMapPtr bufs) 689int drmUnmapBufs(drmBufMapPtr bufs)
690{ 690{
691 int i; 691 int i;
692 692
693 for (i = 0; i < bufs->count; i++) { 693 for (i = 0; i < bufs->count; i++) {
694 munmap(bufs->list[i].address, bufs->list[i].total); 694 munmap(bufs->list[i].address, bufs->list[i].total);
695 } 695 }
696 return 0; 696 return 0;
697} 697}
698 698
699#define DRM_DMA_RETRY 16
700
699int drmDMA(int fd, drmDMAReqPtr request) 701int drmDMA(int fd, drmDMAReqPtr request)
700{ 702{
701 drm_dma_t dma; 703 drm_dma_t dma;
704 int ret, i = 0;
702 705
703 /* Copy to hidden structure */ 706 /* Copy to hidden structure */
704 dma.context = request->context; 707 dma.context = request->context;
@@ -710,10 +713,17 @@ int drmDMA(int fd, drmDMAReqPtr request)
710 dma.request_size = request->request_size; 713 dma.request_size = request->request_size;
711 dma.request_indices = request->request_list; 714 dma.request_indices = request->request_list;
712 dma.request_sizes = request->request_sizes; 715 dma.request_sizes = request->request_sizes;
713 if (ioctl(fd, DRM_IOCTL_DMA, &dma)) return -errno; 716
714 request->granted_count = dma.granted_count; 717 do {
715 718 ret = ioctl( fd, DRM_IOCTL_DMA, &dma );
716 return 0; 719 } while ( ret && errno == EAGAIN && i++ < DRM_DMA_RETRY );
720
721 if ( ret == 0 ) {
722 request->granted_count = dma.granted_count;
723 return 0;
724 } else {
725 return -errno;
726 }
717} 727}
718 728
719int drmGetLock(int fd, drmContext context, drmLockFlags flags) 729int drmGetLock(int fd, drmContext context, drmLockFlags flags)
@@ -728,7 +738,7 @@ int drmGetLock(int fd, drmContext context, drmLockFlags flags)
728 if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL; 738 if (flags & DRM_LOCK_FLUSH_ALL) lock.flags |= _DRM_LOCK_FLUSH_ALL;
729 if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES; 739 if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
730 if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES; 740 if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
731 741
732 while (ioctl(fd, DRM_IOCTL_LOCK, &lock)) 742 while (ioctl(fd, DRM_IOCTL_LOCK, &lock))
733 ; 743 ;
734 return 0; 744 return 0;
@@ -827,7 +837,7 @@ int drmGetContextFlags(int fd, drmContext context, drmContextFlagsPtr flags)
827 if (ctx.flags & _DRM_CONTEXT_2DONLY) *flags |= DRM_CONTEXT_2DONLY; 837 if (ctx.flags & _DRM_CONTEXT_2DONLY) *flags |= DRM_CONTEXT_2DONLY;
828 return 0; 838 return 0;
829} 839}
830 840
831int drmDestroyContext(int fd, drmContext handle) 841int drmDestroyContext(int fd, drmContext handle)
832{ 842{
833 drm_ctx_t ctx; 843 drm_ctx_t ctx;
@@ -1074,7 +1084,7 @@ void *drmGetContextTag(int fd, drmContext context)
1074{ 1084{
1075 drmHashEntry *entry = drmGetEntry(fd); 1085 drmHashEntry *entry = drmGetEntry(fd);
1076 void *value; 1086 void *value;
1077 1087
1078 if (drmHashLookup(entry->tagTable, context, &value)) return NULL; 1088 if (drmHashLookup(entry->tagTable, context, &value)) return NULL;
1079 1089
1080 return value; 1090 return value;
@@ -1108,7 +1118,7 @@ static void drmSIGIOHandler(int interrupt, void *closure)
1108#if 0 1118#if 0
1109 fprintf(stderr, "Got %s\n", buf); 1119 fprintf(stderr, "Got %s\n", buf);
1110#endif 1120#endif
1111 1121
1112 for (pt = buf; *pt != ' '; ++pt); /* Find first space */ 1122 for (pt = buf; *pt != ' '; ++pt); /* Find first space */
1113 ++pt; 1123 ++pt;
1114 old = strtol(pt, &pt, 0); 1124 old = strtol(pt, &pt, 0);
@@ -1141,7 +1151,7 @@ int drmRemoveSIGIOHandler(int fd)
1141 drmHashEntry *entry = drmGetEntry(fd); 1151 drmHashEntry *entry = drmGetEntry(fd);
1142 1152
1143 entry->f = NULL; 1153 entry->f = NULL;
1144 1154
1145 return xf86RemoveSIGIOHandler(fd); 1155 return xf86RemoveSIGIOHandler(fd);
1146} 1156}
1147#endif 1157#endif