diff options
| author | Jesse Barnes <jesse.barnes@intel.com> | 2007-10-30 12:52:46 -0700 | 
|---|---|---|
| committer | Jesse Barnes <jesse.barnes@intel.com> | 2007-10-30 12:52:46 -0700 | 
| commit | 91aae7e683786a48547872b0a5fa92b2232e02c0 (patch) | |
| tree | a30c8022886d61add4a4c2e073fa07f29d7745a7 /libdrm | |
| parent | 7e9ea55a2f052cc939ba9bbf9edac39798344b7a (diff) | |
| parent | 79744d730c90019edd367eee4a8ec1fa22d53402 (diff) | |
Merge branch 'master' into vblank-rework, fixup remaining drivers
Conflicts:
	linux-core/drmP.h
	linux-core/drm_drv.c
	linux-core/drm_irq.c
	shared-core/i915_drv.h
	shared-core/i915_irq.c
	shared-core/mga_drv.h
	shared-core/mga_irq.c
	shared-core/radeon_drv.h
	shared-core/radeon_irq.c
Merge in the latest master bits and update the remaining drivers (except
mach64 which math_b is working on).  Also remove the 9xx hack from the i915
driver; it seems to be correct.
Diffstat (limited to 'libdrm')
| -rw-r--r-- | libdrm/xf86drm.c | 693 | ||||
| -rw-r--r-- | libdrm/xf86drm.h | 1 | ||||
| -rw-r--r-- | libdrm/xf86drmHash.c | 1 | ||||
| -rw-r--r-- | libdrm/xf86drmRandom.c | 1 | ||||
| -rw-r--r-- | libdrm/xf86drmSL.c | 1 | ||||
| -rw-r--r-- | libdrm/xf86mm.h | 80 | 
6 files changed, 174 insertions, 603 deletions
| diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c index 1f242fe3..7001a0ef 100644 --- a/libdrm/xf86drm.c +++ b/libdrm/xf86drm.c @@ -49,7 +49,6 @@  #include <sys/mman.h>  #include <sys/time.h>  #include <stdarg.h> -#include "drm.h"  /* Not all systems have MAP_FAILED defined */  #ifndef MAP_FAILED @@ -2346,7 +2345,7 @@ int drmCommandWriteRead(int fd, unsigned long drmCommandIndex, void *data,   * DRM_FENCE_MASK_DRIVER   */ -int drmFenceCreate(int fd, unsigned flags, int class, unsigned type, +int drmFenceCreate(int fd, unsigned flags, int fence_class, unsigned type,  		   drmFence *fence)  {      drm_fence_arg_t arg; @@ -2354,12 +2353,12 @@ int drmFenceCreate(int fd, unsigned flags, int class, unsigned type,      memset(&arg, 0, sizeof(arg));      arg.flags = flags;      arg.type = type; -    arg.class = class; -    arg.op = drm_fence_create; -    if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) +    arg.fence_class = fence_class; + +    if (ioctl(fd, DRM_IOCTL_FENCE_CREATE, &arg))  	return -errno;      fence->handle = arg.handle; -    fence->class = arg.class; +    fence->fence_class = arg.fence_class;      fence->type = arg.type;      fence->flags = arg.flags;      fence->signaled = 0; @@ -2372,34 +2371,24 @@ int drmFenceCreate(int fd, unsigned flags, int class, unsigned type,   * DRM_FENCE_MASK_DRIVER   */ -int drmFenceBuffers(int fd, unsigned flags, drmFence *fence) +int drmFenceBuffers(int fd, unsigned flags, uint32_t fence_class, drmFence *fence)  {      drm_fence_arg_t arg;      memset(&arg, 0, sizeof(arg));      arg.flags = flags; -    arg.op = drm_fence_buffers; -    if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) +    arg.fence_class = fence_class; + +    if (ioctl(fd, DRM_IOCTL_FENCE_BUFFERS, &arg))  	return -errno;      fence->handle = arg.handle; -    fence->class = arg.class; +    fence->fence_class = arg.fence_class;      fence->type = arg.type;      fence->flags = arg.flags; +    fence->sequence = arg.sequence;      fence->signaled = 0;      return 0;  } -     -int drmFenceDestroy(int fd, const drmFence *fence) -{ -    drm_fence_arg_t arg; - -    memset(&arg, 0, sizeof(arg)); -    arg.handle = fence->handle; -    arg.op = drm_fence_destroy; -    if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) -	return -errno; -    return 0; -}  int drmFenceReference(int fd, unsigned handle, drmFence *fence)  { @@ -2407,11 +2396,11 @@ int drmFenceReference(int fd, unsigned handle, drmFence *fence)      memset(&arg, 0, sizeof(arg));      arg.handle = handle; -    arg.op = drm_fence_reference; -    if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) + +    if (ioctl(fd, DRM_IOCTL_FENCE_REFERENCE, &arg))  	return -errno;      fence->handle = arg.handle; -    fence->class = arg.class; +    fence->fence_class = arg.fence_class;      fence->type = arg.type;      fence->flags = arg.flags;      fence->signaled = arg.signaled; @@ -2424,8 +2413,8 @@ int drmFenceUnreference(int fd, const drmFence *fence)      memset(&arg, 0, sizeof(arg));      arg.handle = fence->handle; -    arg.op = drm_fence_unreference; -    if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) + +    if (ioctl(fd, DRM_IOCTL_FENCE_UNREFERENCE, &arg))  	return -errno;      return 0;  } @@ -2437,10 +2426,10 @@ int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type)      memset(&arg, 0, sizeof(arg));      arg.handle = fence->handle;      arg.type = flush_type; -    arg.op = drm_fence_flush; -    if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) + +    if (ioctl(fd, DRM_IOCTL_FENCE_FLUSH, &arg))  	return -errno; -    fence->class = arg.class; +    fence->fence_class = arg.fence_class;      fence->type = arg.type;      fence->signaled = arg.signaled;      return 0; @@ -2452,10 +2441,10 @@ int drmFenceUpdate(int fd, drmFence *fence)      memset(&arg, 0, sizeof(arg));      arg.handle = fence->handle; -    arg.op = drm_fence_signaled; -    if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) + +    if (ioctl(fd, DRM_IOCTL_FENCE_SIGNALED, &arg))  	return -errno; -    fence->class = arg.class; +    fence->fence_class = arg.fence_class;      fence->type = arg.type;      fence->signaled = arg.signaled;      return 0; @@ -2488,14 +2477,14 @@ int drmFenceEmit(int fd, unsigned flags, drmFence *fence, unsigned emit_type)      drm_fence_arg_t arg;      memset(&arg, 0, sizeof(arg)); -    arg.class = fence->class; +    arg.fence_class = fence->fence_class;      arg.flags = flags;      arg.handle = fence->handle;      arg.type = emit_type; -    arg.op = drm_fence_emit; -    if (ioctl(fd, DRM_IOCTL_FENCE, &arg)) + +    if (ioctl(fd, DRM_IOCTL_FENCE_EMIT, &arg))  	return -errno; -    fence->class = arg.class; +    fence->fence_class = arg.fence_class;      fence->type = arg.type;      fence->signaled = arg.signaled;      return 0; @@ -2526,159 +2515,21 @@ int drmFenceWait(int fd, unsigned flags, drmFence *fence, unsigned flush_type)      arg.handle = fence->handle;      arg.type = flush_type;      arg.flags = flags; -    arg.op = drm_fence_wait; +      do { -	ret = ioctl(fd, DRM_IOCTL_FENCE, &arg); +	ret = ioctl(fd, DRM_IOCTL_FENCE_WAIT, &arg);      } while (ret != 0 && errno == EAGAIN);      if (ret)  	return -errno; -    fence->class = arg.class; +    fence->fence_class = arg.fence_class;      fence->type = arg.type;      fence->signaled = arg.signaled;      return 0;  }     -static int drmAdjustListNodes(drmBOList *list) -{ -    drmBONode *node; -    drmMMListHead *l; -    int ret = 0; - -    while(list->numCurrent < list->numTarget) { -	node = (drmBONode *) malloc(sizeof(*node)); -	if (!node) { -	    ret = -ENOMEM; -	    break; -	} -	list->numCurrent++; -	DRMLISTADD(&node->head, &list->free); -    } - -    while(list->numCurrent > list->numTarget) { -	l = list->free.next; -	if (l == &list->free) -	    break; -	DRMLISTDEL(l); -	node = DRMLISTENTRY(drmBONode, l, head); -	free(node); -	list->numCurrent--; -    } -    return ret; -} - -void drmBOFreeList(drmBOList *list) -{ -    drmBONode *node; -    drmMMListHead *l; - -    l = list->list.next; -    while(l != &list->list) { -	DRMLISTDEL(l); -	node = DRMLISTENTRY(drmBONode, l, head); -	free(node); -	l = list->list.next; -	list->numCurrent--; -	list->numOnList--; -    } - -    l = list->free.next; -    while(l != &list->free) { -	DRMLISTDEL(l); -	node = DRMLISTENTRY(drmBONode, l, head); -	free(node); -	l = list->free.next; -	list->numCurrent--; -    } -} -	 -int drmBOResetList(drmBOList *list) -{ -    drmMMListHead *l; -    int ret; - -    ret = drmAdjustListNodes(list); -    if (ret) -	return ret; - -    l = list->list.next; -    while (l != &list->list) { -	DRMLISTDEL(l); -	DRMLISTADD(l, &list->free); -	list->numOnList--; -	l = list->list.next; -    } -    return drmAdjustListNodes(list); -} -	 -static drmBONode *drmAddListItem(drmBOList *list, drmBO *item,  -				 unsigned long arg0, -				 unsigned long arg1) -{ -    drmBONode *node; -    drmMMListHead *l; - -    l = list->free.next; -    if (l == &list->free) { -	node = (drmBONode *) malloc(sizeof(*node)); -	if (!node) { -	    return NULL; -	} -	list->numCurrent++; -    } -    else { -	DRMLISTDEL(l); -	node = DRMLISTENTRY(drmBONode, l, head); -    } -    node->buf = item; -    node->arg0 = arg0; -    node->arg1 = arg1; -    DRMLISTADD(&node->head, &list->list); -    list->numOnList++; -    return node; -} -     	 -void *drmBOListIterator(drmBOList *list) -{ -    void *ret = list->list.next; - -    if (ret == &list->list) -	return NULL; -    return ret; -} - -void *drmBOListNext(drmBOList *list, void *iterator) -{ -    void *ret; - -    drmMMListHead *l = (drmMMListHead *) iterator; -    ret = l->next; -    if (ret == &list->list) -	return NULL; -    return ret; -} - -drmBO *drmBOListBuf(void *iterator) -{ -    drmBONode *node; -    drmMMListHead *l = (drmMMListHead *) iterator; -    node = DRMLISTENTRY(drmBONode, l, head); -    return node->buf; -} - - -int drmBOCreateList(int numTarget, drmBOList *list) -{ -    DRMINITLISTHEAD(&list->list); -    DRMINITLISTHEAD(&list->free); -    list->numTarget = numTarget; -    list->numCurrent = 0; -    list->numOnList = 0; -    return drmAdjustListNodes(list); -} - -static void drmBOCopyReply(const drm_bo_arg_reply_t *rep, drmBO *buf) +static void drmBOCopyReply(const struct drm_bo_info_rep *rep, drmBO *buf)  {      buf->handle = rep->handle;      buf->flags = rep->flags; @@ -2690,16 +2541,21 @@ static void drmBOCopyReply(const drm_bo_arg_reply_t *rep, drmBO *buf)      buf->fenceFlags = rep->fence_flags;      buf->replyFlags = rep->rep_flags;      buf->pageAlignment = rep->page_alignment; +    buf->tileInfo = rep->tile_info; +    buf->hwTileStride = rep->hw_tile_stride; +    buf->desiredTileStride = rep->desired_tile_stride;  } -int drmBOCreate(int fd, unsigned long start, unsigned long size,  -		unsigned pageAlignment, void *user_buffer, drm_bo_type_t type,  -		unsigned mask, + + +int drmBOCreate(int fd, unsigned long size, +		unsigned pageAlignment, void *user_buffer, +		uint64_t mask,  		unsigned hint, drmBO *buf)  { -    drm_bo_arg_t arg; -    drm_bo_arg_request_t *req = &arg.d.req; -    drm_bo_arg_reply_t *rep = &arg.d.rep; +    struct drm_bo_create_arg arg; +    struct drm_bo_create_req *req = &arg.d.req; +    struct drm_bo_info_rep *rep = &arg.d.rep;      int ret;      memset(buf, 0, sizeof(*buf)); @@ -2707,40 +2563,17 @@ int drmBOCreate(int fd, unsigned long start, unsigned long size,      req->mask = mask;      req->hint = hint;      req->size = size; -    req->type = type;      req->page_alignment = pageAlignment; +    req->buffer_start = (unsigned long) user_buffer;      buf->virtual = NULL; -    switch(type) { -    case drm_bo_type_dc: -        req->buffer_start = start; -	break; -    case drm_bo_type_user: -	req->buffer_start = (unsigned long) user_buffer; -	buf->virtual = user_buffer; -	break; -    case drm_bo_type_fake: -        req->buffer_start = start; -	break; -    default: -	return -EINVAL; -    } -    req->op = drm_bo_create; -      do { -	ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); +	ret = ioctl(fd, DRM_IOCTL_BO_CREATE, &arg);      } while (ret != 0 && errno == EAGAIN);      if (ret)  	return -errno; -    if (!arg.handled) { -	return -EFAULT; -    } -    if (rep->ret) { -        fprintf(stderr, "Error %d\n", rep->ret); -	return rep->ret; -    }      drmBOCopyReply(rep, buf);      buf->mapVirtual = NULL; @@ -2749,56 +2582,19 @@ int drmBOCreate(int fd, unsigned long start, unsigned long size,      return 0;  } -int drmBODestroy(int fd, drmBO *buf) -{ -    drm_bo_arg_t arg; -    drm_bo_arg_request_t *req = &arg.d.req; -    drm_bo_arg_reply_t *rep = &arg.d.rep; -     -    if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) { -	(void) drmUnmap(buf->mapVirtual, buf->start + buf->size); -	buf->mapVirtual = NULL; -	buf->virtual = NULL; -    } - -    memset(&arg, 0, sizeof(arg)); -    req->handle = buf->handle; -    req->op = drm_bo_destroy; - -    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg)) -	return -errno; -    if (!arg.handled) { -	return -EFAULT; -    } -    if (rep->ret) { -	return rep->ret; -    } - -    buf->handle = 0; -    return 0; -} -   int drmBOReference(int fd, unsigned handle, drmBO *buf)  { -    drm_bo_arg_t arg; -    drm_bo_arg_request_t *req = &arg.d.req; -    drm_bo_arg_reply_t *rep = &arg.d.rep; +    struct drm_bo_reference_info_arg arg; +    struct drm_bo_handle_arg *req = &arg.d.req; +    struct drm_bo_info_rep *rep = &arg.d.rep;      memset(&arg, 0, sizeof(arg));      req->handle = handle; -    req->op = drm_bo_reference; -    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg)) +    if (ioctl(fd, DRM_IOCTL_BO_REFERENCE, &arg))  	return -errno; -    if (!arg.handled) { -	return -EFAULT; -    } -    if (rep->ret) { -	return rep->ret; -    }      drmBOCopyReply(rep, buf); -    buf->type = drm_bo_type_dc;      buf->mapVirtual = NULL;      buf->mapCount = 0;      buf->virtual = NULL; @@ -2806,35 +2602,27 @@ int drmBOReference(int fd, unsigned handle, drmBO *buf)      return 0;  } -int drmBOUnReference(int fd, drmBO *buf) +int drmBOUnreference(int fd, drmBO *buf)  { -    drm_bo_arg_t arg; -    drm_bo_arg_request_t *req = &arg.d.req; -    drm_bo_arg_reply_t *rep = &arg.d.rep; +    struct drm_bo_handle_arg arg; -    if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) { +    if (buf->mapVirtual) {  	(void) munmap(buf->mapVirtual, buf->start + buf->size);  	buf->mapVirtual = NULL;  	buf->virtual = NULL;      }      memset(&arg, 0, sizeof(arg)); -    req->handle = buf->handle; -    req->op = drm_bo_unreference; +    arg.handle = buf->handle; -    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg)) +    if (ioctl(fd, DRM_IOCTL_BO_UNREFERENCE, &arg))  	return -errno; -    if (!arg.handled) { -	return -EFAULT; -    } -    if (rep->ret) { -	return rep->ret; -    }      buf->handle = 0;      return 0;  }    +  /*   * Flags can be  DRM_BO_FLAG_READ, DRM_BO_FLAG_WRITE or'ed together   * Hint currently be DRM_BO_HINT_DONT_BLOCK, which makes the @@ -2844,16 +2632,16 @@ int drmBOUnReference(int fd, drmBO *buf)  int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,  	     void **address)  { -    drm_bo_arg_t arg; -    drm_bo_arg_request_t *req = &arg.d.req; -    drm_bo_arg_reply_t *rep = &arg.d.rep; +    struct drm_bo_map_wait_idle_arg arg; +    struct drm_bo_info_req *req = &arg.d.req; +    struct drm_bo_info_rep *rep = &arg.d.rep;      int ret = 0;      /*       * Make sure we have a virtual address of the buffer.       */ -    if (!buf->virtual && buf->type != drm_bo_type_fake) { +    if (!buf->virtual) {  	drmAddress virtual;  	virtual = mmap(0, buf->size + buf->start,   		       PROT_READ | PROT_WRITE, MAP_SHARED, @@ -2871,7 +2659,6 @@ int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,      req->handle = buf->handle;      req->mask = mapFlags;      req->hint = mapHint; -    req->op = drm_bo_map;      /*       * May hang if the buffer object is busy. @@ -2879,15 +2666,11 @@ int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,       */      do { -	ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); +	ret = ioctl(fd, DRM_IOCTL_BO_MAP, &arg);      } while (ret != 0 && errno == EAGAIN);      if (ret)   	return -errno; -    if (!arg.handled)  -	return -EFAULT; -    if (rep->ret) -	return rep->ret;      drmBOCopyReply(rep, buf);	      buf->mapFlags = mapFlags; @@ -2897,129 +2680,90 @@ int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,      return 0;  } +  int drmBOUnmap(int fd, drmBO *buf)  { -    drm_bo_arg_t arg; -    drm_bo_arg_request_t *req = &arg.d.req; -    drm_bo_arg_reply_t *rep = &arg.d.rep; +    struct drm_bo_handle_arg arg;      memset(&arg, 0, sizeof(arg)); -    req->handle = buf->handle; -    req->op = drm_bo_unmap; +    arg.handle = buf->handle; -    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg)) { +    if (ioctl(fd, DRM_IOCTL_BO_UNMAP, &arg)) {  	return -errno;      } -    if (!arg.handled)  -        return -EFAULT; -    if (rep->ret) -	return rep->ret; - +    buf->mapCount--;      return 0;  } -     -int drmBOValidate(int fd, drmBO *buf, unsigned flags, unsigned mask,  -		  unsigned hint) + +int drmBOSetStatus(int fd, drmBO *buf,  +		   uint64_t flags, uint64_t mask, +		   unsigned int hint,  +		   unsigned int desired_tile_stride, +		   unsigned int tile_info)  { -    drm_bo_arg_t arg; -    drm_bo_arg_request_t *req = &arg.d.req; -    drm_bo_arg_reply_t *rep = &arg.d.rep; + +    struct drm_bo_map_wait_idle_arg arg; +    struct drm_bo_info_req *req = &arg.d.req; +    struct drm_bo_info_rep *rep = &arg.d.rep;      int ret = 0;      memset(&arg, 0, sizeof(arg)); +    req->mask = mask; +    req->flags = flags;      req->handle = buf->handle; -    req->mask = flags;      req->hint = hint; -    req->arg_handle = mask; /* Encode mask in the arg_handle field :/ */ -    req->op = drm_bo_validate; - -    do{ -	ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); +    req->desired_tile_stride = desired_tile_stride; +    req->tile_info = tile_info; +     +    do { +	    ret = ioctl(fd, DRM_IOCTL_BO_SETSTATUS, &arg);      } while (ret && errno == EAGAIN);      if (ret)  -	return -errno; -    if (!arg.handled) -	return -EFAULT; -    if (rep->ret) -	return rep->ret; +	    return -errno;      drmBOCopyReply(rep, buf); -    return 0;  } -int drmBOFence(int fd, drmBO *buf, unsigned flags, unsigned fenceHandle) -{ -    drm_bo_arg_t arg; -    drm_bo_arg_request_t *req = &arg.d.req; -    drm_bo_arg_reply_t *rep = &arg.d.rep; -    int ret = 0; - -    memset(&arg, 0, sizeof(arg)); -    req->handle = buf->handle; -    req->mask = flags; -    req->arg_handle = fenceHandle; -    req->op = drm_bo_fence; - -    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); - -    if (ret)  -	return -errno; -    if (!arg.handled) -	return -EFAULT; -    if (rep->ret) -	return rep->ret; -    return 0; -} -  int drmBOInfo(int fd, drmBO *buf)  { -    drm_bo_arg_t arg; -    drm_bo_arg_request_t *req = &arg.d.req; -    drm_bo_arg_reply_t *rep = &arg.d.rep; +    struct drm_bo_reference_info_arg arg; +    struct drm_bo_handle_arg *req = &arg.d.req; +    struct drm_bo_info_rep *rep = &arg.d.rep;      int ret = 0;      memset(&arg, 0, sizeof(arg));      req->handle = buf->handle; -    req->op = drm_bo_info; - -    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); +    ret = ioctl(fd, DRM_IOCTL_BO_INFO, &arg);      if (ret)   	return -errno; -    if (!arg.handled) -	return -EFAULT; -    if (rep->ret) -	return rep->ret; +      drmBOCopyReply(rep, buf);      return 0;  }  int drmBOWaitIdle(int fd, drmBO *buf, unsigned hint)  { -    drm_bo_arg_t arg; -    drm_bo_arg_request_t *req = &arg.d.req; -    drm_bo_arg_reply_t *rep = &arg.d.rep; +    struct drm_bo_map_wait_idle_arg arg; +    struct drm_bo_info_req *req = &arg.d.req; +    struct drm_bo_info_rep *rep = &arg.d.rep;      int ret = 0;      if ((buf->flags & DRM_BO_FLAG_SHAREABLE) ||  	(buf->replyFlags & DRM_BO_REP_BUSY)) {          memset(&arg, 0, sizeof(arg));  	req->handle = buf->handle; -	req->op = drm_bo_wait_idle;  	req->hint = hint;  	do { -	    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); +	    ret = ioctl(fd, DRM_IOCTL_BO_WAIT_IDLE, &arg);  	} while (ret && errno == EAGAIN);  	if (ret)   	    return -errno; -	if (!arg.handled) -	    return -EFAULT; -	if (rep->ret) -	    return rep->ret; +  	drmBOCopyReply(rep, buf);      }      return 0; @@ -3041,194 +2785,19 @@ int drmBOBusy(int fd, drmBO *buf, int *busy)      }  } -     -int drmAddValidateItem(drmBOList *list, drmBO *buf, unsigned flags,  -		       unsigned mask, -		       int *newItem) -{ -    drmBONode *node, *cur; -    drmMMListHead *l; - -    *newItem = 0; -    cur = NULL; - -    for (l = list->list.next; l != &list->list; l = l->next) { -	node = DRMLISTENTRY(drmBONode, l, head); -	if (node->buf == buf) { -	    cur = node; -	    break; -	} -    } -    if (!cur) { -	cur = drmAddListItem(list, buf, flags, mask); -	if (!cur) { -	    drmMsg("Out of memory creating validate list node.\n"); -	    return -ENOMEM; -	} -	*newItem = 1; -	cur->arg0 = flags; -	cur->arg1 = mask; -    } -    else { -	unsigned memMask = (cur->arg1 | mask) & DRM_BO_MASK_MEM; -	unsigned memFlags = cur->arg0 & flags & memMask; -	 -	if (!memFlags) { -	    drmMsg("Incompatible memory location requests " -		   "on validate list.\n"); -	    drmMsg("Previous flag: 0x%08lx, mask: 0x%08lx\n", -		   cur->arg0, cur->arg1); -	    drmMsg("Current flag: 0x%08lx, mask: 0x%08lx\n", -		   flags, mask); -	    return -EINVAL; -	} -	if (mask & cur->arg1 & ~DRM_BO_MASK_MEM  & (cur->arg0 ^ flags)) { -	    drmMsg("Incompatible buffer flag requests " -		   "on validate list.\n"); -	    drmMsg("Previous flag: 0x%08lx, mask: 0x%08lx\n", -		   cur->arg0, cur->arg1); -	    drmMsg("Current flag: 0x%08lx, mask: 0x%08lx\n", -		   flags, mask); -	    return -EINVAL; -	} -	cur->arg1 |= mask; -	cur->arg0 = memFlags | ((cur->arg0 | flags) &  -				cur->arg1 & ~DRM_BO_MASK_MEM);	 -    } -    return 0; -} - - -int drmBOValidateList(int fd, drmBOList *list) -{ -    drmBONode *node; -    drmMMListHead *l; -    drm_bo_arg_t *arg, *first; -    drm_bo_arg_request_t *req; -    drm_bo_arg_reply_t *rep; -    drm_u64_t *prevNext = NULL; -    drmBO *buf; -    int ret; - -    first = NULL; - -    for (l = list->list.next; l != &list->list; l = l->next) { -	node = DRMLISTENTRY(drmBONode, l, head); - -	arg = &node->bo_arg; -	req = &arg->d.req; - -	if (!first) -	    first = arg; - -	if (prevNext) -	    *prevNext = (unsigned long) arg; - -	memset(arg, 0, sizeof(*arg)); -	prevNext = &arg->next; -	req->handle = node->buf->handle; -	req->op = drm_bo_validate; -	req->mask = node->arg0; -	req->hint = 0; -	req->arg_handle = node->arg1; -    } -   -    if (!first)  -	return 0; - -    do { -	ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first); -    } while (ret && errno == EAGAIN); - -    if (ret) -	return -errno; -   -    for (l = list->list.next; l != &list->list; l = l->next) { -	node = DRMLISTENTRY(drmBONode, l, head); -	arg = &node->bo_arg; -	rep = &arg->d.rep; - -	if (!arg->handled) { -	    drmMsg("Unhandled request\n"); -	    return -EFAULT; -	} -	if (rep->ret) -	    return rep->ret; - -	buf = node->buf; -	drmBOCopyReply(rep, buf); -    } - -    return 0; -} -	   - -int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle) -{ -    drmBONode *node; -    drmMMListHead *l; -    drm_bo_arg_t *arg, *first; -    drm_bo_arg_request_t *req; -    drm_bo_arg_reply_t *rep; -    drm_u64_t *prevNext = NULL; -    drmBO *buf; -    unsigned fence_flags; -    int ret; - -    first = NULL; - -    for (l = list->list.next; l != &list->list; l = l->next) { -	node = DRMLISTENTRY(drmBONode, l, head); - -	arg = &node->bo_arg; -	req = &arg->d.req; - -	if (!first) -	    first = arg; - -	if (prevNext) -	    *prevNext = (unsigned long) arg; - -	memset(arg, 0, sizeof(*arg)); -	prevNext = &arg->next; -	req->handle = node->buf->handle; -	req->op = drm_bo_fence; -	req->mask = node->arg0; -	req->arg_handle = fenceHandle; -    } -   -    if (!first)  -	return 0; - -    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first); - -    if (ret) -	return -errno; -   -    for (l = list->list.next; l != &list->list; l = l->next) { -	node = DRMLISTENTRY(drmBONode, l, head); -	arg = &node->bo_arg; -	rep = &arg->d.rep; -      	if (!arg->handled) -	    return -EFAULT; -	if (rep->ret) -	    return rep->ret; -	drmBOCopyReply(rep, node->buf); -    } - -    return 0; -} -  int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize,  	      unsigned memType)  { -    drm_mm_init_arg_t arg; +    struct drm_mm_init_arg arg;      memset(&arg, 0, sizeof(arg)); -    arg.req.op = mm_init; -    arg.req.p_offset = pOffset; -    arg.req.p_size = pSize; -    arg.req.mem_type = memType; + +    arg.magic = DRM_BO_INIT_MAGIC; +    arg.major = DRM_BO_INIT_MAJOR; +    arg.minor = DRM_BO_INIT_MINOR; +    arg.p_offset = pOffset; +    arg.p_size = pSize; +    arg.mem_type = memType;      if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg))  	return -errno; @@ -3237,47 +2806,79 @@ int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize,  int drmMMTakedown(int fd, unsigned memType)  { -    drm_mm_init_arg_t arg; +    struct drm_mm_type_arg arg;      memset(&arg, 0, sizeof(arg)); -    arg.req.op = mm_takedown; -    arg.req.mem_type = memType; +    arg.mem_type = memType; -    if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg)) +    if (ioctl(fd, DRM_IOCTL_MM_TAKEDOWN, &arg))  	return -errno;      return 0;	  } -int drmMMLock(int fd, unsigned memType) +/* + * If this function returns an error, and lockBM was set to 1, + * the buffer manager is NOT locked. + */ + +int drmMMLock(int fd, unsigned memType, int lockBM, int ignoreNoEvict)  { -    drm_mm_init_arg_t arg; +    struct drm_mm_type_arg arg;      int ret;      memset(&arg, 0, sizeof(arg)); -    arg.req.op = mm_lock; -    arg.req.mem_type = memType; +    arg.mem_type = memType; +    arg.lock_flags |= (lockBM) ? DRM_BO_LOCK_UNLOCK_BM : 0; +    arg.lock_flags |= (ignoreNoEvict) ? DRM_BO_LOCK_IGNORE_NO_EVICT : 0;      do{ -	ret = ioctl(fd, DRM_IOCTL_MM_INIT, &arg); +        ret = ioctl(fd, DRM_IOCTL_MM_LOCK, &arg);      } while (ret && errno == EAGAIN); -    return -errno;	 + +    return (ret) ? -errno : 0;  } -int drmMMUnlock(int fd, unsigned memType) +int drmMMUnlock(int fd, unsigned memType, int unlockBM)  { -    drm_mm_init_arg_t arg; +    struct drm_mm_type_arg arg;      int ret;      memset(&arg, 0, sizeof(arg)); -    arg.req.op = mm_unlock; -    arg.req.mem_type = memType; +     +    arg.mem_type = memType; +    arg.lock_flags |= (unlockBM) ? DRM_BO_LOCK_UNLOCK_BM : 0;      do{ -	ret = ioctl(fd, DRM_IOCTL_MM_INIT, &arg); +	ret = ioctl(fd, DRM_IOCTL_MM_UNLOCK, &arg);      } while (ret && errno == EAGAIN); -    return -errno;	 + +    return (ret) ? -errno : 0;  } +int drmBOVersion(int fd, unsigned int *major, +		 unsigned int *minor, +		 unsigned int *patchlevel) +{ +    struct drm_bo_version_arg arg; +    int ret; + +    memset(&arg, 0, sizeof(arg)); +    ret = ioctl(fd, DRM_IOCTL_BO_VERSION, &arg); +    if (ret) +	return -errno; + +    if (major) +	*major = arg.major; +    if (minor) +	*minor = arg.minor; +    if (patchlevel) +	*patchlevel = arg.patchlevel; + +    return 0; +} + + +  #define DRM_MAX_FDS 16  static struct {      char *BusID; diff --git a/libdrm/xf86drm.h b/libdrm/xf86drm.h index d4260cc9..230f54ce 100644 --- a/libdrm/xf86drm.h +++ b/libdrm/xf86drm.h @@ -36,6 +36,7 @@  #include <stdarg.h>  #include <sys/types.h> +#include <stdint.h>  #include <drm.h>  				/* Defaults, if nothing set in xf86config */ diff --git a/libdrm/xf86drmHash.c b/libdrm/xf86drmHash.c index d1ade063..82cbc2a5 100644 --- a/libdrm/xf86drmHash.c +++ b/libdrm/xf86drmHash.c @@ -74,7 +74,6 @@  #define HASH_MAIN 0  #if !HASH_MAIN -# include "drm.h"  # include "xf86drm.h"  #endif diff --git a/libdrm/xf86drmRandom.c b/libdrm/xf86drmRandom.c index 61ffb078..ecab9e2d 100644 --- a/libdrm/xf86drmRandom.c +++ b/libdrm/xf86drmRandom.c @@ -77,7 +77,6 @@  #define RANDOM_MAIN 0  #if !RANDOM_MAIN -# include "drm.h"  # include "xf86drm.h"  #endif diff --git a/libdrm/xf86drmSL.c b/libdrm/xf86drmSL.c index ce60648d..58aefac7 100644 --- a/libdrm/xf86drmSL.c +++ b/libdrm/xf86drmSL.c @@ -44,7 +44,6 @@  #define SL_MAIN 0  #if !SL_MAIN -# include "drm.h"  # include "xf86drm.h"  #else  # include <sys/time.h> diff --git a/libdrm/xf86mm.h b/libdrm/xf86mm.h index b3822d4d..d3df8497 100644 --- a/libdrm/xf86mm.h +++ b/libdrm/xf86mm.h @@ -29,6 +29,7 @@  #ifndef _XF86MM_H_  #define _XF86MM_H_  #include <stddef.h> +#include <stdint.h>  #include "drm.h"  /* @@ -37,7 +38,7 @@   * be protected using an external mutex.   *   * Note: Don't protect the following functions, as it may lead to deadlocks: - * drmBOUnmap(), drmFenceBuffers(). + * drmBOUnmap().   * The kernel is synchronizing and refcounting buffer maps.    * User space only needs to refcount object usage within the same application.   */ @@ -96,20 +97,20 @@ typedef struct _drmMMListHead  typedef struct _drmFence  {      unsigned handle; -    int class; +    int fence_class;      unsigned type;       unsigned flags;      unsigned signaled; +    uint32_t sequence;      unsigned pad[4]; /* for future expansion */  } drmFence;  typedef struct _drmBO  { -    drm_bo_type_t type;      unsigned handle; -    drm_u64_t mapHandle; -    unsigned flags; -    unsigned mask; +    uint64_t mapHandle; +    uint64_t flags; +    uint64_t mask;      unsigned mapFlags;      unsigned long size;      unsigned long offset; @@ -117,37 +118,21 @@ typedef struct _drmBO      unsigned replyFlags;      unsigned fenceFlags;      unsigned pageAlignment; +    unsigned tileInfo; +    unsigned hwTileStride; +    unsigned desiredTileStride;      void *virtual;      void *mapVirtual;      int mapCount;      unsigned pad[8];     /* for future expansion */  } drmBO; -typedef struct _drmBONode -{ -    drmMMListHead head; -    drmBO *buf; -    drm_bo_arg_t bo_arg; -    unsigned long arg0; -    unsigned long arg1; -} drmBONode; - -typedef struct _drmBOList { -    unsigned numTarget; -    unsigned numCurrent; -    unsigned numOnList; -    drmMMListHead list; -    drmMMListHead free; -} drmBOList; - -  /*   * Fence functions.   */ -extern int drmFenceCreate(int fd, unsigned flags, int class, +extern int drmFenceCreate(int fd, unsigned flags, int fence_class,                            unsigned type, drmFence *fence); -extern int drmFenceDestroy(int fd, const drmFence *fence);  extern int drmFenceReference(int fd, unsigned handle, drmFence *fence);  extern int drmFenceUnreference(int fd, const drmFence *fence);  extern int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type); @@ -157,46 +142,25 @@ extern int drmFenceWait(int fd, unsigned flags, drmFence *fence,                          unsigned flush_type);  extern int drmFenceEmit(int fd, unsigned flags, drmFence *fence,                           unsigned emit_type); -extern int drmFenceBuffers(int fd, unsigned flags, drmFence *fence); +extern int drmFenceBuffers(int fd, unsigned flags, uint32_t fence_class, drmFence *fence);  /* - * Buffer object list functions. - */ - -extern void drmBOFreeList(drmBOList *list); -extern int drmBOResetList(drmBOList *list); -extern void *drmBOListIterator(drmBOList *list); -extern void *drmBOListNext(drmBOList *list, void *iterator); -extern drmBO *drmBOListBuf(void *iterator); -extern int drmBOCreateList(int numTarget, drmBOList *list); - -/*   * Buffer object functions.   */ -extern int drmBOCreate(int fd, unsigned long start, unsigned long size, -		       unsigned pageAlignment,void *user_buffer,  -		       drm_bo_type_t type, unsigned mask, -		       unsigned hint, drmBO *buf); -extern int drmBODestroy(int fd, drmBO *buf); +extern int drmBOCreate(int fd, unsigned long size, +		       unsigned pageAlignment, void *user_buffer, +		       uint64_t mask, unsigned hint, drmBO *buf);  extern int drmBOReference(int fd, unsigned handle, drmBO *buf); -extern int drmBOUnReference(int fd, drmBO *buf); +extern int drmBOUnreference(int fd, drmBO *buf);  extern int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,  		    void **address);  extern int drmBOUnmap(int fd, drmBO *buf); -extern int drmBOValidate(int fd, drmBO *buf, unsigned flags, unsigned mask,  -			 unsigned hint);  extern int drmBOFence(int fd, drmBO *buf, unsigned flags, unsigned fenceHandle);  extern int drmBOInfo(int fd, drmBO *buf);  extern int drmBOBusy(int fd, drmBO *buf, int *busy); - -extern int drmAddValidateItem(drmBOList *list, drmBO *buf, unsigned flags,  -		       unsigned mask, -		       int *newItem); -extern int drmBOValidateList(int fd, drmBOList *list); -extern int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle);  extern int drmBOWaitIdle(int fd, drmBO *buf, unsigned hint);  /* @@ -206,8 +170,16 @@ extern int drmBOWaitIdle(int fd, drmBO *buf, unsigned hint);  extern int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize,  		     unsigned memType);  extern int drmMMTakedown(int fd, unsigned memType); -extern int drmMMLock(int fd, unsigned memType); -extern int drmMMUnlock(int fd, unsigned memType); +extern int drmMMLock(int fd, unsigned memType, int lockBM, int ignoreNoEvict); +extern int drmMMUnlock(int fd, unsigned memType, int unlockBM); +extern int drmBOSetStatus(int fd, drmBO *buf,  +			  uint64_t flags, uint64_t mask, +			  unsigned int hint,  +			  unsigned int desired_tile_stride, +			  unsigned int tile_info); +extern int drmBOVersion(int fd, unsigned int *major, +			unsigned int *minor, +			unsigned int *patchlevel);  #endif | 
