Merge branch 'master' into cleanup
authorDave Airlie <airlied@linux.ie>
Wed, 11 Jul 2007 01:23:41 +0000 (11:23 +1000)
committerDave Airlie <airlied@linux.ie>
Wed, 11 Jul 2007 01:23:41 +0000 (11:23 +1000)
Conflicts:

libdrm/xf86drm.c
linux-core/drm_bo.c
linux-core/drm_fence.c

1  2 
libdrm/xf86drm.c
libdrm/xf86mm.h
linux-core/drm_bo.c
linux-core/drm_compat.c
linux-core/drm_drv.c
linux-core/drm_fence.c
linux-core/drm_objects.h
shared-core/i915_drv.h

@@@ -2291,11 -2375,11 +2374,11 @@@ int drmFenceCreate(int fd, unsigned fla
  int drmFenceBuffers(int fd, unsigned flags, 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))
 +
 +    if (ioctl(fd, DRM_IOCTL_FENCE_BUFFERS, &arg))
        return -errno;
      fence->handle = arg.handle;
      fence->class = arg.class;
  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))
 +
 +    if (ioctl(fd, DRM_IOCTL_FENCE_DESTROY, &arg))
        return -errno;
      return 0;
  }
  int drmFenceReference(int fd, unsigned handle, drmFence *fence)
  {
      drm_fence_arg_t arg;
-    
      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;
  int drmFenceUnreference(int fd, const drmFence *fence)
  {
      drm_fence_arg_t arg;
-    
      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;
  }
@@@ -2364,12 -2448,12 +2447,12 @@@ int drmFenceFlush(int fd, drmFence *fen
  
  int drmFenceUpdate(int fd, drmFence *fence)
  {
-       drm_fence_arg_t arg;
-       
+     drm_fence_arg_t arg;
      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->type = arg.type;
@@@ -2598,8 -2678,7 +2677,7 @@@ int drmBOCreateList(int numTarget, drmB
      return drmAdjustListNodes(list);
  }
  
- static void drmBOCopyReply(struct drm_bo_info_rep *rep, 
-                          drmBO *buf)
 -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;
@@@ -2686,13 -2777,12 +2764,12 @@@ int drmBODestroy(int fd, drmBO *buf
      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;
@@@ -2739,10 -2844,9 +2816,9 @@@ 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;
  
      /*
      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;
 -
      return 0;
  }
 -    
 -int drmBOValidate(int fd, drmBO *buf, unsigned flags, unsigned mask, 
 +
 +int drmBOValidate(int fd, drmBO *buf,
 +                drm_u64_t flags, drm_u64_t mask,
                  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_op_arg arg;
 +    struct drm_bo_op_req *req = &arg.d.req;
 +    struct drm_bo_arg_rep *rep = &arg.d.rep;
      int ret = 0;
  
      memset(&arg, 0, sizeof(arg));
      req->op = drm_bo_validate;
  
      do{
 -      ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
 +      ret = ioctl(fd, DRM_IOCTL_BO_OP, &arg);
      } while (ret && errno == EAGAIN);
-     
      if (ret) 
        return -errno;
      if (!arg.handled)
@@@ -2848,8 -2962,8 +2924,7 @@@ int drmBOFence(int fd, drmBO *buf, unsi
      req->arg_handle = fenceHandle;
      req->op = drm_bo_fence;
  
 -    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
 -
 +    ret = ioctl(fd, DRM_IOCTL_BO_OP, &arg);
-     
      if (ret) 
        return -errno;
      if (!arg.handled)
@@@ -2868,12 -2982,16 +2943,11 @@@ int drmBOInfo(int fd, drmBO *buf
  
      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;
  }
@@@ -2976,143 -3101,134 +3052,139 @@@ int drmAddValidateItem(drmBOList *list
  
  int drmBOValidateList(int fd, drmBOList *list)
  {
-    
-   drmBONode *node;
-   drmMMListHead *l;
-   struct drm_bo_op_arg *arg, *first;
-   struct drm_bo_op_req *req;
-   struct drm_bo_arg_rep *rep;
-   drm_u64_t *prevNext = NULL;
-   drmBO *buf;
-   int ret;
+     drmBONode *node;
+     drmMMListHead *l;
 -    drm_bo_arg_t *arg, *first;
 -    drm_bo_arg_request_t *req;
 -    drm_bo_arg_reply_t *rep;
++    struct drm_bo_op_arg *arg, *first;
++    struct drm_bo_op_req *req;
++    struct drm_bo_arg_rep *rep;
+     drm_u64_t *prevNext = NULL;
+     drmBO *buf;
+     int ret;
  
-   first = NULL;
+     first = NULL;
  
-   for (l = list->list.next; l != &list->list; l = l->next) {
-       node = DRMLISTENTRY(drmBONode, l, head);
+     for (l = list->list.next; l != &list->list; l = l->next) {
 -      node = DRMLISTENTRY(drmBONode, l, head);
++        node = DRMLISTENTRY(drmBONode, l, head);
  
-       arg = &node->bo_arg;
-       req = &arg->d.req;
 -      arg = &node->bo_arg;
 -      req = &arg->d.req;
++        arg = &node->bo_arg;
++        req = &arg->d.req;
  
-       if (!first)
-         first = arg;
 -      if (!first)
 -          first = arg;
++        if (!first)
++            first = arg;
  
-       if (prevNext)
-         *prevNext = (unsigned long) arg;
+       if (prevNext)
+           *prevNext = (unsigned long) arg;
  
-       memset(arg, 0, sizeof(*arg));
-       prevNext = &arg->next;
-       req->bo_req.handle = node->buf->handle;
-       req->op = drm_bo_validate;
-       req->bo_req.flags = node->arg0;
-       req->bo_req.hint = 0;
-       req->bo_req.mask = node->arg1;
-       req->bo_req.fence_class = 0; /* Backwards compat. */
-   }
+       memset(arg, 0, sizeof(*arg));
+       prevNext = &arg->next;
 -      req->handle = node->buf->handle;
++      req->bo_req.handle = node->buf->handle;
+       req->op = drm_bo_validate;
 -      req->mask = node->arg0;
 -      req->hint = 0;
 -      req->arg_handle = node->arg1;
++      req->bo_req.flags = node->arg0;
++      req->bo_req.hint = 0;
++      req->bo_req.mask = node->arg1;
++      req->bo_req.fence_class = 0; /* Backwards compat. */
+     }
 -  
 -    if (!first) 
 +
-   if (!first)
-       return 0;
++    if (!first)
+       return 0;
  
-   do{
-       ret = ioctl(fd, DRM_IOCTL_BO_OP, first);
-   } while (ret && errno == EAGAIN);
 -    do {
 -      ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first);
++    do{
++      ret = ioctl(fd, DRM_IOCTL_BO_OP, first);
+     } while (ret && errno == EAGAIN);
  
 -  
+     if (ret)
+       return -errno;
-   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;
 +
 -
+     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->bo_info, buf);
-   }
-   return 0;
 +      
 -
+       if (!arg->handled) {
+           drmMsg("Unhandled request\n");
+           return -EFAULT;
+       }
+       if (rep->ret)
+           return rep->ret;
 -      drmBOCopyReply(rep, buf);
++      
+       buf = node->buf;
 -
++      drmBOCopyReply(&rep->bo_info, buf);
+     }
++    
+     return 0;
  }
          
--
  int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle)
  {
-    
-   drmBONode *node;
-   drmMMListHead *l;
-   struct drm_bo_op_arg *arg, *first;
-   struct drm_bo_op_req *req;
-   struct drm_bo_arg_rep *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->bo_req.handle = node->buf->handle;
-       req->op = drm_bo_fence;
-       req->bo_req.mask = node->arg0;
-       req->arg_handle = fenceHandle;
-   }
+     drmBONode *node;
+     drmMMListHead *l;
 -    drm_bo_arg_t *arg, *first;
 -    drm_bo_arg_request_t *req;
 -    drm_bo_arg_reply_t *rep;
++    struct drm_bo_op_arg *arg, *first;
++    struct drm_bo_op_req *req;
++    struct drm_bo_arg_rep *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);
 -
++        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->bo_req.handle = node->buf->handle;
+       req->op = drm_bo_fence;
 -      req->mask = node->arg0;
++      req->bo_req.mask = node->arg0;
+       req->arg_handle = fenceHandle;
+     }
    
-   if (!first) 
-       return 0;
+     if (!first) 
+       return 0;
  
-   ret = ioctl(fd, DRM_IOCTL_BO_OP, first);
 -    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first);
++    ret = ioctl(fd, DRM_IOCTL_BO_OP, first);
  
-   if (ret)
-       return -errno;
+     if (ret)
+       return -errno;
    
-   for (l = list->list.next; l != &list->list; l = l->next) {
-       node = DRMLISTENTRY(drmBONode, l, head);
+     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->bo_info, node->buf);
-   }
+       arg = &node->bo_arg;
+       rep = &arg->d.rep;
++
+               if (!arg->handled)
+           return -EFAULT;
+       if (rep->ret)
+           return rep->ret;
 -      drmBOCopyReply(rep, node->buf);
++      drmBOCopyReply(&rep->bo_info, node->buf);
+     }
  
-   return 0;
+     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;
  
  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; 
  }
  
@@@ -3139,13 -3254,14 +3209,13 @@@ int drmMMLock(int fd, unsigned memType
      int ret;
  
      memset(&arg, 0, sizeof(arg));
 -    arg.req.op = mm_lock;
 -    arg.req.mem_type = memType;
 +    arg.mem_type = memType;
  
      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 ret;
  
      memset(&arg, 0, sizeof(arg));
 -    arg.req.op = mm_unlock;
 -    arg.req.mem_type = memType;
 +    
 +    arg.mem_type = memType;
  
      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;
  }
  
  #define DRM_MAX_FDS 16
diff --cc libdrm/xf86mm.h
@@@ -124,11 -123,11 +126,11 @@@ typedef struct _drmB
      unsigned pad[8];     /* for future expansion */
  } drmBO;
  
typedef struct _drmBONode {
+ typedef struct _drmBONode
+ {
      drmMMListHead head;
      drmBO *buf;
 -    drm_bo_arg_t bo_arg;
 +    struct drm_bo_op_arg bo_arg;
      unsigned long arg0;
      unsigned long arg1;
  } drmBONode;
@@@ -1481,12 -1465,11 +1489,13 @@@ static int drm_buffer_object_validate(d
        return 0;
  }
  
 -static int drm_bo_handle_validate(drm_file_t * priv, uint32_t handle,
 -                                uint32_t flags, uint32_t mask, uint32_t hint,
 -                                drm_bo_arg_reply_t * rep)
 +static int drm_bo_handle_validate(drm_file_t * priv,
 +                                uint32_t handle,
 +                                uint32_t fence_class,
 +                                uint64_t flags, uint64_t mask, uint32_t hint,
 +                                struct drm_bo_info_rep *rep)
  {
+       struct drm_device *dev = priv->head->dev;
        drm_buffer_object_t *bo;
        int ret;
        int no_wait = hint & DRM_BO_HINT_DONT_BLOCK;
        return ret;
  }
  
 -static int drm_bo_handle_info(drm_file_t * priv, uint32_t handle,
 -                            drm_bo_arg_reply_t * rep)
 +static int drm_bo_handle_info(drm_file_t *priv, uint32_t handle,
 +                            struct drm_bo_info_rep *rep)
  {
+       struct drm_device *dev = priv->head->dev;
        drm_buffer_object_t *bo;
  
+       mutex_lock(&dev->struct_mutex);
        bo = drm_lookup_buffer_object(priv, handle, 1);
+       mutex_unlock(&dev->struct_mutex);
        if (!bo) {
                return -EINVAL;
        }
        return 0;
  }
  
 -static int drm_bo_handle_wait(drm_file_t * priv, uint32_t handle,
 -                            uint32_t hint, drm_bo_arg_reply_t * rep)
 +static int drm_bo_handle_wait(drm_file_t *priv, uint32_t handle,
 +                            uint32_t hint,
 +                            struct drm_bo_info_rep *rep)
  {
+       struct drm_device *dev = priv->head->dev;
        drm_buffer_object_t *bo;
        int no_wait = hint & DRM_BO_HINT_DONT_BLOCK;
        int ret;
@@@ -1744,209 -1803,6 +1763,209 @@@ int drm_bo_op_ioctl(DRM_IOCTL_ARGS
        return 0;
  }
  
-               drm_bo_usage_deref_unlocked(entry);
 +int drm_bo_create_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      struct drm_bo_create_arg arg;
 +      struct drm_bo_create_req *req = &arg.d.req;
 +      struct drm_bo_info_rep *rep = &arg.d.rep;
 +      drm_buffer_object_t *entry;
 +      int ret = 0;
 +
 +      if (!dev->bm.initialized) {
 +              DRM_ERROR("Buffer object manager is not initialized.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +      
 +      ret = drm_bo_lock_test(dev, filp);
 +      if (ret)
 +              goto out;
 +
 +      ret = drm_buffer_object_create(priv->head->dev,
 +                                     req->size, req->type, req->mask,
 +                                     req->hint, req->page_alignment,
 +                                     req->buffer_start, &entry);
 +      if (ret)
 +              goto out;
 +      
 +      ret = drm_bo_add_user_object(priv, entry,
 +                                   req->mask & DRM_BO_FLAG_SHAREABLE);
 +      if (ret) {
++              drm_bo_usage_deref_unlocked(&entry);
 +              goto out;
 +      }
 +      
 +      mutex_lock(&entry->mutex);
 +      drm_bo_fill_rep_arg(entry, rep);
 +      mutex_unlock(&entry->mutex);
 +
 +      DRM_COPY_TO_USER_IOCTL((void __user *)data, arg, sizeof(arg));
 +out:
 +      return ret;
 +}
 +
 +
 +int drm_bo_destroy_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      struct drm_bo_handle_arg arg;
 +      drm_user_object_t *uo;
 +      int ret = 0;
 +
 +      if (!dev->bm.initialized) {
 +              DRM_ERROR("Buffer object manager is not initialized.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +
 +      mutex_lock(&dev->struct_mutex);
 +      uo = drm_lookup_user_object(priv, arg.handle);
 +      if (!uo || (uo->type != drm_buffer_type) || uo->owner != priv) {
 +              mutex_unlock(&dev->struct_mutex);
 +              return -EINVAL;
 +      }
 +      ret = drm_remove_user_object(priv, uo);
 +      mutex_unlock(&dev->struct_mutex);
 +      
 +      return ret;
 +}
 +
 +int drm_bo_map_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      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;
 +      if (!dev->bm.initialized) {
 +              DRM_ERROR("Buffer object manager is not initialized.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +
 +      ret = drm_buffer_object_map(priv, req->handle, req->mask,
 +                                  req->hint, rep);
 +      if (ret)
 +              return ret;
 +
 +      DRM_COPY_TO_USER_IOCTL((void __user *)data, arg, sizeof(arg));
 +      return 0;
 +}
 +
 +int drm_bo_unmap_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      struct drm_bo_handle_arg arg;
 +      int ret;
 +      if (!dev->bm.initialized) {
 +              DRM_ERROR("Buffer object manager is not initialized.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +
 +      ret = drm_buffer_object_unmap(priv, arg.handle);
 +      return ret;
 +}
 +
 +
 +int drm_bo_reference_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      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;
 +      drm_user_object_t *uo;
 +      int ret;
 +
 +      if (!dev->bm.initialized) {
 +              DRM_ERROR("Buffer object manager is not initialized.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +
 +      ret = drm_user_object_ref(priv, req->handle,
 +                                drm_buffer_type, &uo);
 +      if (ret)
 +              return ret;
 +      
 +      ret = drm_bo_handle_info(priv, req->handle, rep);
 +      if (ret)
 +              return ret;
 +
 +      DRM_COPY_TO_USER_IOCTL((void __user *)data, arg, sizeof(arg));
 +      return 0;
 +}
 +
 +int drm_bo_unreference_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      struct drm_bo_handle_arg arg;
 +      int ret = 0;
 +
 +      if (!dev->bm.initialized) {
 +              DRM_ERROR("Buffer object manager is not initialized.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +
 +      ret = drm_user_object_unref(priv, arg.handle, drm_buffer_type);
 +      return ret;
 +}
 +
 +int drm_bo_info_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      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;
 +
 +      if (!dev->bm.initialized) {
 +              DRM_ERROR("Buffer object manager is not initialized.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +
 +      ret = drm_bo_handle_info(priv, req->handle, rep);
 +      if (ret)
 +              return ret;
 +      DRM_COPY_TO_USER_IOCTL((void __user *)data, arg, sizeof(arg));
 +      return 0;
 +}
 +
 +int drm_bo_wait_idle_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      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;
 +      if (!dev->bm.initialized) {
 +              DRM_ERROR("Buffer object manager is not initialized.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +
 +      ret = drm_bo_handle_wait(priv, req->handle,
 +                               req->hint, rep);
 +      if (ret)
 +              return ret;
 +
 +      DRM_COPY_TO_USER_IOCTL((void __user *)data, arg, sizeof(arg));
 +      return 0;
 +}
 +
 +
 +
  /**
   *Clean the unfenced list and put on regular LRU.
   *This is part of the memory manager cleanup and should only be
Simple merge
Simple merge
@@@ -556,289 -582,92 +581,288 @@@ int drm_fence_create_ioctl(DRM_IOCTL_AR
        }
  
        DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 -      switch (arg.op) {
 -      case drm_fence_create:
 -              if (arg.flags & DRM_FENCE_FLAG_EMIT)
 -                      LOCK_TEST_WITH_RETURN(dev, filp);
 -              ret = drm_fence_object_create(dev, arg.class,
 -                                            arg.type, arg.flags, &fence);
 -              if (ret)
 -                      return ret;
 -              ret = drm_fence_add_user_object(priv, fence,
 -                                              arg.flags &
 -                                              DRM_FENCE_FLAG_SHAREABLE);
 -              if (ret) {
 -                      drm_fence_usage_deref_unlocked(&fence);
 -                      return ret;
 -              }
 -              arg.handle = fence->base.hash.key;
 +      if (arg.flags & DRM_FENCE_FLAG_EMIT)
 +              LOCK_TEST_WITH_RETURN(dev, filp);
 +      ret = drm_fence_object_create(dev, arg.class,
 +                                    arg.type, arg.flags, &fence);
 +      if (ret)
 +              return ret;
 +      ret = drm_fence_add_user_object(priv, fence,
 +                                      arg.flags &
 +                                      DRM_FENCE_FLAG_SHAREABLE);
 +      if (ret) {
-               drm_fence_usage_deref_unlocked(dev, fence);
++              drm_fence_usage_deref_unlocked(&fence);
 +              return ret;
 +      }
 +      
 +      /*
 +       * usage > 0. No need to lock dev->struct_mutex;
 +       */
 +      
 +      atomic_inc(&fence->usage);
 +      arg.handle = fence->base.hash.key;
  
 -              break;
 -      case drm_fence_destroy:
 -              mutex_lock(&dev->struct_mutex);
 -              uo = drm_lookup_user_object(priv, arg.handle);
 -              if (!uo || (uo->type != drm_fence_type) || uo->owner != priv) {
 -                      mutex_unlock(&dev->struct_mutex);
 -                      return -EINVAL;
 -              }
 -              ret = drm_remove_user_object(priv, uo);
 +      read_lock_irqsave(&fm->lock, flags);
 +      arg.class = fence->class;
 +      arg.type = fence->type;
 +      arg.signaled = fence->signaled;
 +      read_unlock_irqrestore(&fm->lock, flags);
-       drm_fence_usage_deref_unlocked(dev, fence);
++      drm_fence_usage_deref_unlocked(&fence);
 +
 +      DRM_COPY_TO_USER_IOCTL((void __user *)data, arg, sizeof(arg));
 +      return ret;
 +}
 +
 +int drm_fence_destroy_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      int ret;
 +      drm_fence_manager_t *fm = &dev->fm;
 +      drm_fence_arg_t arg;
 +      drm_user_object_t *uo;
 +      ret = 0;
 +
 +      if (!fm->initialized) {
 +              DRM_ERROR("The DRM driver does not support fencing.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +
 +      mutex_lock(&dev->struct_mutex);
 +      uo = drm_lookup_user_object(priv, arg.handle);
 +      if (!uo || (uo->type != drm_fence_type) || uo->owner != priv) {
                mutex_unlock(&dev->struct_mutex);
 +              return -EINVAL;
 +      }
 +      ret = drm_remove_user_object(priv, uo);
 +      mutex_unlock(&dev->struct_mutex);
 +      return ret;
 +}
 +
 +
 +int drm_fence_reference_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      int ret;
 +      drm_fence_manager_t *fm = &dev->fm;
 +      drm_fence_arg_t arg;
 +      drm_fence_object_t *fence;
 +      drm_user_object_t *uo;
 +      unsigned long flags;
 +      ret = 0;
 +
 +      if (!fm->initialized) {
 +              DRM_ERROR("The DRM driver does not support fencing.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +      ret = drm_user_object_ref(priv, arg.handle, drm_fence_type, &uo);
 +      if (ret)
                return ret;
 -      case drm_fence_reference:
 -              ret =
 -                  drm_user_object_ref(priv, arg.handle, drm_fence_type, &uo);
 -              if (ret)
 -                      return ret;
 -              fence = drm_lookup_fence_object(priv, arg.handle);
 -              break;
 -      case drm_fence_unreference:
 -              ret = drm_user_object_unref(priv, arg.handle, drm_fence_type);
 -              return ret;
 -      case drm_fence_signaled:
 -              fence = drm_lookup_fence_object(priv, arg.handle);
 -              if (!fence)
 -                      return -EINVAL;
 -              break;
 -      case drm_fence_flush:
 -              fence = drm_lookup_fence_object(priv, arg.handle);
 -              if (!fence)
 -                      return -EINVAL;
 -              ret = drm_fence_object_flush(fence, arg.type);
 -              break;
 -      case drm_fence_wait:
 -              fence = drm_lookup_fence_object(priv, arg.handle);
 -              if (!fence)
 -                      return -EINVAL;
 -              ret =
 -                  drm_fence_object_wait(fence,
 -                                        arg.flags & DRM_FENCE_FLAG_WAIT_LAZY,
 -                                        0, arg.type);
 -              break;
 -      case drm_fence_emit:
 -              LOCK_TEST_WITH_RETURN(dev, filp);
 -              fence = drm_lookup_fence_object(priv, arg.handle);
 -              if (!fence)
 -                      return -EINVAL;
 -              ret = drm_fence_object_emit(fence, arg.flags, arg.class,
 -                                          arg.type);
 -              break;
 -      case drm_fence_buffers:
 -              if (!dev->bm.initialized) {
 -                      DRM_ERROR("Buffer object manager is not initialized\n");
 -                      return -EINVAL;
 -              }
 -              LOCK_TEST_WITH_RETURN(dev, filp);
 -              ret = drm_fence_buffer_objects(priv, NULL, arg.flags,
 -                                             NULL, &fence);
 -              if (ret)
 -                      return ret;
 -              ret = drm_fence_add_user_object(priv, fence,
 -                                              arg.flags &
 -                                              DRM_FENCE_FLAG_SHAREABLE);
 -              if (ret)
 -                      return ret;
 -              arg.handle = fence->base.hash.key;
 -              break;
 -      default:
 +      fence = drm_lookup_fence_object(priv, arg.handle);
 +
 +      read_lock_irqsave(&fm->lock, flags);
 +      arg.class = fence->class;
 +      arg.type = fence->type;
 +      arg.signaled = fence->signaled;
 +      read_unlock_irqrestore(&fm->lock, flags);
-       drm_fence_usage_deref_unlocked(dev, fence);
++      drm_fence_usage_deref_unlocked(&fence);
 +
 +      DRM_COPY_TO_USER_IOCTL((void __user *)data, arg, sizeof(arg));
 +      return ret;
 +}
 +
 +
 +int drm_fence_unreference_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      int ret;
 +      drm_fence_manager_t *fm = &dev->fm;
 +      drm_fence_arg_t arg;
 +      ret = 0;
 +
 +      if (!fm->initialized) {
 +              DRM_ERROR("The DRM driver does not support fencing.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +      return drm_user_object_unref(priv, arg.handle, drm_fence_type);
 +}
 +
 +int drm_fence_signaled_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      int ret;
 +      drm_fence_manager_t *fm = &dev->fm;
 +      drm_fence_arg_t arg;
 +      drm_fence_object_t *fence;
 +      unsigned long flags;
 +      ret = 0;
 +
 +      if (!fm->initialized) {
 +              DRM_ERROR("The DRM driver does not support fencing.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +
 +      fence = drm_lookup_fence_object(priv, arg.handle);
 +      if (!fence)
 +              return -EINVAL;
 +
 +      read_lock_irqsave(&fm->lock, flags);
 +      arg.class = fence->class;
 +      arg.type = fence->type;
 +      arg.signaled = fence->signaled;
 +      read_unlock_irqrestore(&fm->lock, flags);
-       drm_fence_usage_deref_unlocked(dev, fence);
++      drm_fence_usage_deref_unlocked(&fence);
 +
 +      DRM_COPY_TO_USER_IOCTL((void __user *)data, arg, sizeof(arg));
 +      return ret;
 +}
 +
 +int drm_fence_flush_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      int ret;
 +      drm_fence_manager_t *fm = &dev->fm;
 +      drm_fence_arg_t arg;
 +      drm_fence_object_t *fence;
 +      unsigned long flags;
 +      ret = 0;
 +
 +      if (!fm->initialized) {
 +              DRM_ERROR("The DRM driver does not support fencing.\n");
                return -EINVAL;
        }
-       ret = drm_fence_object_flush(dev, fence, arg.type);
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +
 +      fence = drm_lookup_fence_object(priv, arg.handle);
 +      if (!fence)
 +              return -EINVAL;
-       drm_fence_usage_deref_unlocked(dev, fence);
++      ret = drm_fence_object_flush(fence, arg.type);
 +
 +      read_lock_irqsave(&fm->lock, flags);
 +      arg.class = fence->class;
 +      arg.type = fence->type;
 +      arg.signaled = fence->signaled;
 +      read_unlock_irqrestore(&fm->lock, flags);
-       ret = drm_fence_object_wait(dev, fence,
++      drm_fence_usage_deref_unlocked(&fence);
 +
 +      DRM_COPY_TO_USER_IOCTL((void __user *)data, arg, sizeof(arg));
 +      return ret;
 +}
 +
 +
 +int drm_fence_wait_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      int ret;
 +      drm_fence_manager_t *fm = &dev->fm;
 +      drm_fence_arg_t arg;
 +      drm_fence_object_t *fence;
 +      unsigned long flags;
 +      ret = 0;
 +
 +      if (!fm->initialized) {
 +              DRM_ERROR("The DRM driver does not support fencing.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +
 +      fence = drm_lookup_fence_object(priv, arg.handle);
 +      if (!fence)
 +              return -EINVAL;
-       drm_fence_usage_deref_unlocked(dev, fence);
++      ret = drm_fence_object_wait(fence,
 +                                  arg.flags & DRM_FENCE_FLAG_WAIT_LAZY,
 +                                  0, arg.type);
 +
 +      read_lock_irqsave(&fm->lock, flags);
 +      arg.class = fence->class;
 +      arg.type = fence->type;
 +      arg.signaled = fence->signaled;
 +      read_unlock_irqrestore(&fm->lock, flags);
-       ret = drm_fence_object_emit(dev, fence, arg.flags, arg.class,
++      drm_fence_usage_deref_unlocked(&fence);
 +
 +      DRM_COPY_TO_USER_IOCTL((void __user *)data, arg, sizeof(arg));
 +      return ret;
 +}
 +
 +
 +int drm_fence_emit_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      int ret;
 +      drm_fence_manager_t *fm = &dev->fm;
 +      drm_fence_arg_t arg;
 +      drm_fence_object_t *fence;
 +      unsigned long flags;
 +      ret = 0;
 +
 +      if (!fm->initialized) {
 +              DRM_ERROR("The DRM driver does not support fencing.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +
 +      LOCK_TEST_WITH_RETURN(dev, filp);
 +      fence = drm_lookup_fence_object(priv, arg.handle);
 +      if (!fence)
 +              return -EINVAL;
-       drm_fence_usage_deref_unlocked(dev, fence);
++      ret = drm_fence_object_emit(fence, arg.flags, arg.class,
 +                                  arg.type);
 +
 +      read_lock_irqsave(&fm->lock, flags);
 +      arg.class = fence->class;
 +      arg.type = fence->type;
 +      arg.signaled = fence->signaled;
 +      read_unlock_irqrestore(&fm->lock, flags);
++      drm_fence_usage_deref_unlocked(&fence);
 +
 +      DRM_COPY_TO_USER_IOCTL((void __user *)data, arg, sizeof(arg));
 +      return ret;
 +}
 +
 +int drm_fence_buffers_ioctl(DRM_IOCTL_ARGS)
 +{
 +      DRM_DEVICE;
 +      int ret;
 +      drm_fence_manager_t *fm = &dev->fm;
 +      drm_fence_arg_t arg;
 +      drm_fence_object_t *fence;
 +      unsigned long flags;
 +      ret = 0;
 +
 +      if (!fm->initialized) {
 +              DRM_ERROR("The DRM driver does not support fencing.\n");
 +              return -EINVAL;
 +      }
 +
 +      DRM_COPY_FROM_USER_IOCTL(arg, (void __user *)data, sizeof(arg));
 +
 +      if (!dev->bm.initialized) {
 +              DRM_ERROR("Buffer object manager is not initialized\n");
 +              return -EINVAL;
 +      }
 +      LOCK_TEST_WITH_RETURN(dev, filp);
 +      ret = drm_fence_buffer_objects(priv, NULL, arg.flags,
 +                                     NULL, &fence);
 +      if (ret)
 +              return ret;
 +      ret = drm_fence_add_user_object(priv, fence,
 +                                      arg.flags &
 +                                      DRM_FENCE_FLAG_SHAREABLE);
 +      if (ret)
 +              return ret;
 +      atomic_inc(&fence->usage);
 +      arg.handle = fence->base.hash.key;
 +
        read_lock_irqsave(&fm->lock, flags);
        arg.class = fence->class;
        arg.type = fence->type;
Simple merge
Simple merge