Merge branch 'master' into pre-superioctl-branch
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Tue, 25 Sep 2007 16:03:31 +0000 (18:03 +0200)
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Tue, 25 Sep 2007 16:03:31 +0000 (18:03 +0200)
Conflicts:

linux-core/drm_bo.c
linux-core/drm_fence.c
linux-core/drm_objects.h
shared-core/drm.h

1  2 
linux-core/drm_bo.c
linux-core/drm_fence.c
linux-core/drm_objects.h
linux-core/i915_fence.c
linux-core/via_fence.c
linux-core/xgi_fence.c
shared-core/drm.h

@@@ -587,23 -557,11 +587,23 @@@ int drm_fence_buffer_objects(struct drm
        if (!list)
                list = &bm->unfenced;
  
-               fence_class = fence->class;
 +      if (fence)
++              fence_class = fence->fence_class;
 +
        list_for_each_entry(entry, list, lru) {
                BUG_ON(!(entry->priv_flags & _DRM_BO_FLAG_UNFENCED));
 -              fence_type |= entry->fence_type;
 -              if (entry->fence_class == fence_class)
 -                      count++;
 +              fence_type |= entry->new_fence_type;
 +              if (fence_class == ~0)
 +                      fence_class = entry->new_fence_class;
 +              else if (entry->new_fence_class != fence_class) {
 +                      DRM_ERROR("Unmatching fence classes on unfenced list: "
 +                                "%d and %d.\n",
 +                                fence_class,
 +                                entry->new_fence_class);
 +                      ret = -EINVAL;
 +                      goto out;
 +              }
 +              count++;
        }
  
        if (!count) {
                goto out;
        }
  
 -      /*
 -       * Transfer to a local list before we release the dev->struct_mutex;
 -       * This is so we don't get any new unfenced objects while fencing
 -       * the ones we already have..
 -       */
 -
 -      list_splice_init(list, &f_list);
 -
        if (fence) {
-               if ((fence_type & fence->type) != fence_type) {
+               if ((fence_type & fence->type) != fence_type ||
+                   (fence->fence_class != fence_class)) {
                        DRM_ERROR("Given fence doesn't match buffers "
                                  "on unfenced list.\n");
                        ret = -EINVAL;
@@@ -34,8 -34,8 +34,8 @@@
   * Typically called by the IRQ handler.
   */
  
- void drm_fence_handler(struct drm_device * dev, uint32_t class,
+ void drm_fence_handler(struct drm_device * dev, uint32_t fence_class,
 -                     uint32_t sequence, uint32_t type)
 +                     uint32_t sequence, uint32_t type, uint32_t error)
  {
        int wake = 0;
        uint32_t diff;
@@@ -361,15 -329,7 +361,15 @@@ static int drm_fence_lazy_wait(struct d
                if (ret == -EBUSY) {
                        DRM_ERROR("Fence timeout. "
                                  "GPU lockup or fence driver was "
 -                                "taken down.\n");
 +                                "taken down. %d 0x%08x 0x%02x 0x%02x 0x%02x\n",
-                                 fence->class,
++                                fence->fence_class,
 +                                fence->sequence,
 +                                fence->type,
 +                                mask,
 +                                fence->signaled);
 +                      DRM_ERROR("Pending exe flush %d 0x%08x\n",
 +                                fc->pending_exe_flush,
 +                                fc->exe_flush_sequence);
                }
                return ((ret == -EINTR) ? -EAGAIN : ret);
        }
@@@ -443,11 -402,9 +443,11 @@@ int drm_fence_object_wait(struct drm_fe
  
        return 0;
  }
 +EXPORT_SYMBOL(drm_fence_object_wait);
 +
  
  int drm_fence_object_emit(struct drm_fence_object * fence,
--                        uint32_t fence_flags, uint32_t class, uint32_t type)
++                        uint32_t fence_flags, uint32_t fence_class, uint32_t type)
  {
        struct drm_device *dev = fence->dev;
        struct drm_fence_manager *fm = &dev->fm;
        int ret;
  
        drm_fence_unring(dev, &fence->ring);
--      ret = driver->emit(dev, class, fence_flags, &sequence, &native_type);
++      ret = driver->emit(dev, fence_class, fence_flags, &sequence, &native_type);
        if (ret)
                return ret;
  
        write_lock_irqsave(&fm->lock, flags);
-       fence->class = class;
 -      fence->fence_class = class;
++      fence->fence_class = fence_class;
        fence->type = type;
        fence->flush_mask = 0x00;
        fence->submitted_flush = 0x00;
        write_unlock_irqrestore(&fm->lock, flags);
        return 0;
  }
 +EXPORT_SYMBOL(drm_fence_object_emit);
  
--static int drm_fence_object_init(struct drm_device * dev, uint32_t class,
++static int drm_fence_object_init(struct drm_device * dev, uint32_t fence_class,
                                 uint32_t type,
                                 uint32_t fence_flags,
                                 struct drm_fence_object * fence)
         */
  
        INIT_LIST_HEAD(&fence->base.list);
-       fence->class = class;
 -      fence->fence_class = class;
++      fence->fence_class = fence_class;
        fence->type = type;
        fence->flush_mask = 0;
        fence->submitted_flush = 0;
@@@ -535,7 -491,7 +535,7 @@@ out
  }
  EXPORT_SYMBOL(drm_fence_add_user_object);
  
--int drm_fence_object_create(struct drm_device * dev, uint32_t class, uint32_t type,
++int drm_fence_object_create(struct drm_device * dev, uint32_t fence_class, uint32_t type,
                            unsigned flags, struct drm_fence_object ** c_fence)
  {
        struct drm_fence_object *fence;
        fence = drm_ctl_calloc(1, sizeof(*fence), DRM_MEM_FENCE);
        if (!fence)
                return -ENOMEM;
--      ret = drm_fence_object_init(dev, class, type, flags, fence);
++      ret = drm_fence_object_init(dev, fence_class, type, flags, fence);
        if (ret) {
                drm_fence_usage_deref_unlocked(&fence);
                return ret;
@@@ -561,7 -517,7 +561,7 @@@ EXPORT_SYMBOL(drm_fence_object_create)
  void drm_fence_manager_init(struct drm_device * dev)
  {
        struct drm_fence_manager *fm = &dev->fm;
--      struct drm_fence_class_manager *class;
++      struct drm_fence_class_manager *fence_class;
        struct drm_fence_driver *fed = dev->driver->fence_driver;
        int i;
        unsigned long flags;
        BUG_ON(fm->num_classes > _DRM_FENCE_CLASSES);
  
        for (i=0; i<fm->num_classes; ++i) {
-           class = &fm->class[i];
 -          class = &fm->fence_class[i];
++          fence_class = &fm->fence_class[i];
  
--          INIT_LIST_HEAD(&class->ring);
--          class->pending_flush = 0;
--          DRM_INIT_WAITQUEUE(&class->fence_queue);
++          INIT_LIST_HEAD(&fence_class->ring);
++          fence_class->pending_flush = 0;
++          DRM_INIT_WAITQUEUE(&fence_class->fence_queue);
        }
  
        atomic_set(&fm->count, 0);
        write_unlock_irqrestore(&fm->lock, flags);
  }
  
-       arg->class = fence->class;
 +void drm_fence_fill_arg(struct drm_fence_object *fence, struct drm_fence_arg *arg)
 +{
 +      struct drm_device *dev = fence->dev;
 +      struct drm_fence_manager *fm = &dev->fm;
 +      unsigned long irq_flags;
 +
 +      read_lock_irqsave(&fm->lock, irq_flags);
 +      arg->handle = fence->base.hash.key;
++      arg->fence_class = fence->fence_class;
 +      arg->type = fence->type;
 +      arg->signaled = fence->signaled;
 +      arg->error = fence->error;
++      arg->sequence = fence->sequence;
 +      read_unlock_irqrestore(&fm->lock, irq_flags);
 +}
 +EXPORT_SYMBOL(drm_fence_fill_arg);
 +
 +
  void drm_fence_manager_takedown(struct drm_device * dev)
  {
  }
@@@ -657,10 -597,14 +658,11 @@@ int drm_fence_create_ioctl(struct drm_d
        /*
         * usage > 0. No need to lock dev->struct_mutex;
         */
 -      
 +
        arg->handle = fence->base.hash.key;
  
 -      read_lock_irqsave(&fm->lock, flags);
 -      arg->fence_class = fence->fence_class;
 -      arg->type = fence->type;
 -      arg->signaled = fence->signaled;
 -      read_unlock_irqrestore(&fm->lock, flags);
++
 +      drm_fence_fill_arg(fence, arg);
        drm_fence_usage_deref_unlocked(&fence);
  
        return ret;
@@@ -823,10 -789,14 +825,10 @@@ int drm_fence_emit_ioctl(struct drm_dev
        fence = drm_lookup_fence_object(file_priv, arg->handle);
        if (!fence)
                return -EINVAL;
-       ret = drm_fence_object_emit(fence, arg->flags, arg->class,
+       ret = drm_fence_object_emit(fence, arg->flags, arg->fence_class,
                                    arg->type);
  
 -      read_lock_irqsave(&fm->lock, flags);
 -      arg->fence_class = fence->fence_class;
 -      arg->type = fence->type;
 -      arg->signaled = fence->signaled;
 -      read_unlock_irqrestore(&fm->lock, flags);
 +      drm_fence_fill_arg(fence, arg);
        drm_fence_usage_deref_unlocked(&fence);
  
        return ret;
@@@ -190,18 -184,18 +190,18 @@@ struct drm_fence_driver 
        uint32_t flush_diff;
        uint32_t sequence_mask;
        int lazy_capable;
-       int (*has_irq) (struct drm_device * dev, uint32_t class,
+       int (*has_irq) (struct drm_device * dev, uint32_t fence_class,
                        uint32_t flags);
-       int (*emit) (struct drm_device * dev, uint32_t class, uint32_t flags,
+       int (*emit) (struct drm_device * dev, uint32_t fence_class, uint32_t flags,
                     uint32_t * breadcrumb, uint32_t * native_type);
-       void (*poke_flush) (struct drm_device * dev, uint32_t class);
+       void (*poke_flush) (struct drm_device * dev, uint32_t fence_class);
  };
  
- extern void drm_fence_handler(struct drm_device *dev, uint32_t class,
+ extern void drm_fence_handler(struct drm_device *dev, uint32_t fence_class,
 -                            uint32_t sequence, uint32_t type);
 +                            uint32_t sequence, uint32_t type, uint32_t error);
  extern void drm_fence_manager_init(struct drm_device *dev);
  extern void drm_fence_manager_takedown(struct drm_device *dev);
- extern void drm_fence_flush_old(struct drm_device *dev, uint32_t class,
+ extern void drm_fence_flush_old(struct drm_device *dev, uint32_t fence_class,
                                uint32_t sequence);
  extern int drm_fence_object_flush(struct drm_fence_object * fence, uint32_t type);
  extern int drm_fence_object_signaled(struct drm_fence_object * fence,
@@@ -214,14 -208,8 +214,14 @@@ extern void drm_fence_reference_unlocke
  extern int drm_fence_object_wait(struct drm_fence_object * fence,
                                 int lazy, int ignore_signals, uint32_t mask);
  extern int drm_fence_object_create(struct drm_device *dev, uint32_t type,
-                                  uint32_t fence_flags, uint32_t class,
+                                  uint32_t fence_flags, uint32_t fence_class,
                                   struct drm_fence_object ** c_fence);
 +extern int drm_fence_object_emit(struct drm_fence_object * fence,
 +                               uint32_t fence_flags, uint32_t class,
 +                               uint32_t type);
 +extern void drm_fence_fill_arg(struct drm_fence_object *fence,
 +                             struct drm_fence_arg *arg);
 +
  extern int drm_fence_add_user_object(struct drm_file * priv,
                                     struct drm_fence_object * fence, int shareable);
  
Simple merge
Simple merge
Simple merge
@@@ -652,8 -651,8 +652,10 @@@ struct drm_fence_arg 
        unsigned int type;
        unsigned int flags;
        unsigned int signaled;
-       uint64_t expand_pad[3]; /*Future expansion */
 +      unsigned int error;
 -      uint64_t expand_pad[3]; /*Future expansion */
+       unsigned int sequence;
++        unsigned int pad64;
++      uint64_t expand_pad[2]; /*Future expansion */
  };
  
  /* Buffer permissions, referring to how the GPU uses the buffers.