diff options
Diffstat (limited to 'libdrm')
| -rw-r--r-- | libdrm/Makefile.am | 4 | ||||
| -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/xf86drmMode.c | 395 | ||||
| -rw-r--r-- | libdrm/xf86drmMode.h | 208 | ||||
| -rw-r--r-- | libdrm/xf86drmRandom.c | 1 | ||||
| -rw-r--r-- | libdrm/xf86drmSL.c | 1 | ||||
| -rw-r--r-- | libdrm/xf86mm.h | 80 | 
9 files changed, 779 insertions, 605 deletions
diff --git a/libdrm/Makefile.am b/libdrm/Makefile.am index e7e07e47..24c32038 100644 --- a/libdrm/Makefile.am +++ b/libdrm/Makefile.am @@ -23,9 +23,9 @@ libdrm_ladir = $(libdir)  libdrm_la_LDFLAGS = -version-number 2:3:0 -no-undefined  AM_CFLAGS = -I$(top_srcdir)/shared-core -libdrm_la_SOURCES = xf86drm.c xf86drmHash.c xf86drmRandom.c xf86drmSL.c +libdrm_la_SOURCES = xf86drm.c xf86drmHash.c xf86drmRandom.c xf86drmSL.c xf86drmMode.c  libdrmincludedir = ${includedir} -libdrminclude_HEADERS = xf86drm.h xf86mm.h +libdrminclude_HEADERS = xf86drm.h xf86mm.h xf86drmMode.h  EXTRA_DIST = ChangeLog TODO 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/xf86drmMode.c b/libdrm/xf86drmMode.c new file mode 100644 index 00000000..a7241ffd --- /dev/null +++ b/libdrm/xf86drmMode.c @@ -0,0 +1,395 @@ +/* + * \file xf86drmMode.c + * Header for DRM modesetting interface. + * + * \author Jakob Bornecrantz <wallbraker@gmail.com> + * + * \par Acknowledgements: + * Feb 2007, Dave Airlie <airlied@linux.ie> + */ + +/* + * Copyright (c) <year> <copyright holders> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + */ + +/* + * TODO the types we are after are defined in diffrent headers on diffrent + * platforms find which headers to include to get uint32_t + */ +#include <stdint.h> + +#include "xf86drmMode.h" +#include "xf86drm.h" +#include <drm.h> +#include <string.h> + +/* + * Util functions + */ + +void* drmAllocCpy(void *array, int count, int entry_size) +{ +	char *r; +	int i; + +	if (!count || !array || !entry_size) +		return 0; + +	if (!(r = drmMalloc(count*entry_size))) +		return 0; + +	for (i = 0; i < count; i++) +		memcpy(r+(entry_size*i), array+(entry_size*i), entry_size); + +	return r; +} + +/** + * Generate crtc and output ids. + * + * Will generate ids starting from 1 up to count if count is greater then 0. + */ +static uint32_t* drmAllocGenerate(int count) +{ +	uint32_t *r; +	int i; + +	if(0 <= count) +		return 0; + +	if (!(r = drmMalloc(count*sizeof(*r)))) +		return 0; + +	for (i = 0; i < count; r[i] = ++i); + +	return 0; +} + +/* + * A couple of free functions. + */ + +void drmModeFreeModeInfo(struct drm_mode_modeinfo *ptr) +{ +	if (!ptr) +		return; + +	drmFree(ptr); +} + +void drmModeFreeResources(drmModeResPtr ptr) +{ +	if (!ptr) +		return; + +	drmFree(ptr->modes); +	drmFree(ptr); + +} + +void drmModeFreeFB(drmModeFBPtr ptr) +{ +	if (!ptr) +		return; + +	/* we might add more frees later. */ +	drmFree(ptr); +} + +void drmModeFreeCrtc(drmModeCrtcPtr ptr) +{ +	if (!ptr) +		return; + +	drmFree(ptr); + +} + +void drmModeFreeOutput(drmModeOutputPtr ptr) +{ +	if (!ptr) +		return; + +	drmFree(ptr->modes); +	drmFree(ptr); + +} + +/* + * ModeSetting functions. + */ + +drmModeResPtr drmModeGetResources(int fd) +{ +	struct drm_mode_card_res res; +	int i; +	drmModeResPtr r = 0; + +	memset(&res, 0, sizeof(struct drm_mode_card_res)); + +	if (ioctl(fd, DRM_IOCTL_MODE_GETRESOURCES, &res)) +		return 0; + +	if (res.count_fbs) +		res.fb_id = drmMalloc(res.count_fbs*sizeof(uint32_t)); +	if (res.count_crtcs) +		res.crtc_id = drmMalloc(res.count_crtcs*sizeof(uint32_t)); +	if (res.count_outputs) +		res.output_id = drmMalloc(res.count_outputs*sizeof(uint32_t)); +	if (res.count_modes) +		res.modes = drmMalloc(res.count_modes*sizeof(*res.modes)); + +	if (ioctl(fd, DRM_IOCTL_MODE_GETRESOURCES, &res)) { +		r = NULL; +		goto err_allocs; +	} + +	/* +	 * return +	 */ + + +	if (!(r = drmMalloc(sizeof(*r)))) +		return 0; + +	r->count_fbs     = res.count_fbs; +	r->count_crtcs   = res.count_crtcs; +	r->count_outputs = res.count_outputs; +	r->count_modes   = res.count_modes; +	/* TODO we realy should test if these allocs fails. */ +	r->fbs           = drmAllocCpy(res.fb_id, res.count_fbs, sizeof(uint32_t)); +	r->crtcs         = drmAllocCpy(res.crtc_id, res.count_crtcs, sizeof(uint32_t)); +	r->outputs       = drmAllocCpy(res.output_id, res.count_outputs, sizeof(uint32_t)); +	r->modes         = drmAllocCpy(res.modes, res.count_modes, sizeof(struct drm_mode_modeinfo)); + +err_allocs: +	drmFree(res.fb_id); +	drmFree(res.crtc_id); +	drmFree(res.output_id); +	drmFree(res.modes); + +	return r; +} + +int drmModeAddFB(int fd, uint32_t width, uint32_t height, uint8_t depth, +                 uint8_t bpp, uint32_t pitch, drmBO *bo, uint32_t *buf_id) +{ +	struct drm_mode_fb_cmd f; +	int ret; + +	f.width  = width; +	f.height = height; +	f.pitch  = pitch; +	f.bpp    = bpp; +	f.depth  = depth; +	f.handle = bo->handle; + +	if (ret = ioctl(fd, DRM_IOCTL_MODE_ADDFB, &f)) +		return ret; + +	*buf_id = f.buffer_id; +	return 0; +} + +int drmModeRmFB(int fd, uint32_t bufferId) +{ +	return ioctl(fd, DRM_IOCTL_MODE_RMFB, bufferId); +} + +drmModeFBPtr drmModeGetFB(int fd, uint32_t buf) +{ +	struct drm_mode_fb_cmd info; +	drmModeFBPtr r; + +	info.buffer_id = buf; + +	if (ioctl(fd, DRM_IOCTL_MODE_GETFB, &info)) +		return NULL; + +	if (!(r = drmMalloc(sizeof(*r)))) +		return NULL; + +	r->buffer_id = info.buffer_id; +	r->width = info.width; +	r->height = info.height; +	r->pitch = info.pitch; +	r->bpp = info.bpp; +	r->handle = info.handle; +	r->depth = info.depth; + +	return r; +} + + +/* + * Crtc functions + */ + +drmModeCrtcPtr drmModeGetCrtc(int fd, uint32_t crtcId) +{ +	struct drm_mode_crtc crtc; +	drmModeCrtcPtr r; +	int i = 0; + +	crtc.count_outputs   = 0; +	crtc.outputs         = 0; +	crtc.count_possibles = 0; +	crtc.possibles       = 0; +	crtc.crtc_id = crtcId; + +	if (ioctl(fd, DRM_IOCTL_MODE_GETCRTC, &crtc)) +		return 0; + +	/* +	 * return +	 */ + +	if (!(r = drmMalloc(sizeof(*r)))) +		return 0; + +	r->x               = crtc.x; +	r->y               = crtc.y; +	r->mode            = crtc.mode; +	r->buffer_id       = crtc.fb_id; +	r->gamma_size      = crtc.gamma_size; +	r->count_outputs   = crtc.count_outputs; +	r->count_possibles = crtc.count_possibles; +	/* TODO we realy should test if these alloc & cpy fails. */ +	r->outputs         = crtc.outputs; +	r->possibles       = crtc.possibles; + +	return r; + +err_allocs: + +	return 0; +} + + +int drmModeSetCrtc(int fd, uint32_t crtcId, uint32_t bufferId, +                   uint32_t x, uint32_t y, uint32_t modeId, +                   uint32_t *outputs, int count) +{ +	struct drm_mode_crtc crtc; + +	crtc.count_outputs   = 0; +	crtc.outputs         = 0; +	crtc.count_possibles = 0; +	crtc.possibles       = 0; + +	crtc.x             = x; +	crtc.y             = y; +	crtc.crtc_id       = crtcId; +	crtc.fb_id         = bufferId; +	crtc.set_outputs   = outputs; +	crtc.count_outputs = count; +	crtc.mode          = modeId; + +	return ioctl(fd, DRM_IOCTL_MODE_SETCRTC, &crtc); +} + + +/* + * Output manipulation + */ + +drmModeOutputPtr drmModeGetOutput(int fd, uint32_t output_id) +{ +	struct drm_mode_get_output out; +	drmModeOutputPtr r = 0; + +	out.output = output_id; +	out.count_crtcs  = 0; +	out.crtcs        = 0; +	out.count_clones = 0; +	out.clones       = 0; +	out.count_modes  = 0; +	out.modes        = 0; + +	if (ioctl(fd, DRM_IOCTL_MODE_GETOUTPUT, &out)) +		return 0; + +	if (out.count_modes) +		out.modes = drmMalloc(out.count_modes*sizeof(uint32_t)); + +	if (ioctl(fd, DRM_IOCTL_MODE_GETOUTPUT, &out)) +		goto err_allocs; + +	if(!(r = drmMalloc(sizeof(*r)))) +		return 0; + +	r->connection   = out.connection; +	r->mmWidth      = out.mm_width; +	r->mmHeight     = out.mm_height; +	r->subpixel     = out.subpixel; +	r->count_crtcs  = out.count_crtcs; +	r->count_clones = out.count_clones; +	r->count_modes  = out.count_modes; +	/* TODO we should test if these alloc & cpy fails. */ +	r->crtcs        = out.crtcs; +	r->clones       = out.clones; +	r->modes        = drmAllocCpy(out.modes, out.count_modes, sizeof(uint32_t)); +	strncpy(r->name, out.name, DRM_OUTPUT_NAME_LEN); +	r->name[DRM_OUTPUT_NAME_LEN-1] = 0; +	return r; + +err_allocs: +	drmFree(out.modes); + +	return 0; +} + +uint32_t drmModeAddMode(int fd, struct drm_mode_modeinfo *mode_info) +{ +	if (ioctl(fd, DRM_IOCTL_MODE_ADDMODE, mode_info)) +		return 0; +	 +	return mode_info->id; +} + +int drmModeRmMode(int fd, uint32_t mode_id) +{ +  	return ioctl(fd, DRM_IOCTL_MODE_RMMODE, mode_id); +} + +int drmModeAttachMode(int fd, uint32_t output_id, uint32_t mode_id) +{ + +	struct drm_mode_mode_cmd res; + +	res.output_id = output_id; +	res.mode_id = mode_id; + +	return ioctl(fd, DRM_IOCTL_MODE_ATTACHMODE, &res); +} + +int drmModeDetachMode(int fd, uint32_t output_id, uint32_t mode_id) +{ +	struct drm_mode_mode_cmd res; + +	res.output_id = output_id; +	res.mode_id = mode_id; + +	return ioctl(fd, DRM_IOCTL_MODE_DETACHMODE, &res); +} + + diff --git a/libdrm/xf86drmMode.h b/libdrm/xf86drmMode.h new file mode 100644 index 00000000..b25a6610 --- /dev/null +++ b/libdrm/xf86drmMode.h @@ -0,0 +1,208 @@ +/* + * \file xf86drmMode.h + * Header for DRM modesetting interface. + * + * \author Jakob Bornecrantz <wallbraker@gmail.com> + * + * \par Acknowledgements: + * Feb 2007, Dave Airlie <airlied@linux.ie> + */ + +/* + * Copyright (c) <year> <copyright holders> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + */ + +#include <drm.h> +#include "xf86mm.h" + +/* + * This is the interface for modesetting for drm. + * + * In order to use this interface you must include either <stdint.h> or another + * header defining uint32_t, int32_t and uint16_t. + * + * It aims to provide a randr1.2 compatible interface for modesettings in the + * kernel, the interface is also ment to be used by libraries like EGL. + * + * More information can be found in randrproto.txt which can be found here: + * http://gitweb.freedesktop.org/?p=xorg/proto/randrproto.git + * + * There are some major diffrences to be noted. Unlike the randr1.2 proto you + * need to create the memory object of the framebuffer yourself with the ttm + * buffer object interface. This object needs to be pinned. + */ + + +typedef struct _drmModeRes { + +	int count_fbs; +	uint32_t *fbs; + +	int count_crtcs; +	uint32_t *crtcs; + +	int count_outputs; +	uint32_t *outputs; + +	int count_modes; +	struct drm_mode_modeinfo *modes; + +} drmModeRes, *drmModeResPtr; + +typedef struct drm_mode_fb_cmd drmModeFB, *drmModeFBPtr; + +typedef struct _drmModeCrtc { + +	unsigned int buffer_id; /**< FB id to connect to 0 = disconnect*/ + +	uint32_t x, y; /**< Position on the frameuffer */ +	uint32_t width, height; +	uint32_t mode; /**< Current mode used */ + +	int count_outputs; +	uint32_t outputs; /**< Outputs that are connected */ + +	int count_possibles; +	uint32_t possibles; /**< Outputs that can be connected */ + +	int gamma_size; /**< Number of gamma stops */ + +} drmModeCrtc, *drmModeCrtcPtr; + +typedef enum { +	DRM_MODE_CONNECTED         = 1, +	DRM_MODE_DISCONNECTED      = 2, +	DRM_MODE_UNKNOWNCONNECTION = 3 +} drmModeConnection; + +typedef enum { +	DRM_MODE_SUBPIXEL_UNKNOWN        = 1, +	DRM_MODE_SUBPIXEL_HORIZONTAL_RGB = 2, +	DRM_MODE_SUBPIXEL_HORIZONTAL_BGR = 3, +	DRM_MODE_SUBPIXEL_VERTICAL_RGB   = 4, +	DRM_MODE_SUBPIXEL_VERTICAL_BGR   = 5, +	DRM_MODE_SUBPIXEL_NONE           = 6 +} drmModeSubPixel; + +typedef struct _drmModeOutput { + +	unsigned int crtc; /**< Crtc currently connected to */ +	unsigned char name[DRM_OUTPUT_NAME_LEN]; +	drmModeConnection connection; +	uint32_t mmWidth, mmHeight; /**< HxW in millimeters */ +	drmModeSubPixel subpixel; + +	int count_crtcs; +	uint32_t crtcs; /**< Possible crtc to connect to */ + +	int count_clones; +	uint32_t clones; /**< Mask of clones */ + +	int count_modes; +	uint32_t *modes; /**< List of modes ids */ + +} drmModeOutput, *drmModeOutputPtr; + + + +extern void drmModeFreeModeInfo( struct drm_mode_modeinfo *ptr ); +extern void drmModeFreeResources( drmModeResPtr ptr ); +extern void drmModeFreeFB( drmModeFBPtr ptr ); +extern void drmModeFreeCrtc( drmModeCrtcPtr ptr ); +extern void drmModeFreeOutput( drmModeOutputPtr ptr ); + +/** + * Retrives all of the resources associated with a card. + */ +extern drmModeResPtr drmModeGetResources(int fd); + + +/* + * FrameBuffer manipulation. + */ + +/** + * Retrive information about framebuffer bufferId + */ +extern drmModeFBPtr drmModeGetFB(int fd, uint32_t bufferId); + +/** + * Creates a new framebuffer with an buffer object as its scanout buffer. + */ +extern int drmModeAddFB(int fd, uint32_t width, uint32_t height, uint8_t depth, +			uint8_t bpp, uint32_t pitch, drmBO *bo, +			uint32_t *buf_id); +/** + * Destroies the given framebuffer. + */ +extern int drmModeRmFB(int fd, uint32_t bufferId); + + +/* + * Crtc functions + */ + +/** + * Retrive information about the ctrt crtcId + */ +extern drmModeCrtcPtr drmModeGetCrtc(int fd, uint32_t crtcId); + +/** + * Set the mode on a crtc crtcId with the given mode modeId. + */ +extern int drmModeSetCrtc(int fd, uint32_t crtcId, uint32_t bufferId, +		uint32_t x, uint32_t y, uint32_t modeId, +		uint32_t *outputs, int count); + + +/* + * Output manipulation + */ + +/** + * Retrive information about the output outputId. + */ +extern drmModeOutputPtr drmModeGetOutput(int fd, +		uint32_t outputId); + +/** + * Adds a new mode from the given mode info. + * Name must be unique. + */ +extern uint32_t drmModeAddMode(int fd, struct drm_mode_modeinfo *modeInfo); + +/** + * Removes a mode created with AddMode, must be unused. + */ +extern int drmModeRmMode(int fd, uint32_t modeId); + +/** + * Attaches the given mode to an output. + */ +extern int drmModeAttachMode(int fd, uint32_t outputId, uint32_t modeId); + +/** + * Detaches a mode from the output + * must be unused, by the given mode. + */ +extern int drmModeDetachMode(int fd, uint32_t outputId, uint32_t modeId); + 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  | 
