]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'drm-intel/for-linux-next'
authorStephen Rothwell <sfr@canb.auug.org.au>
Fri, 30 May 2014 01:57:21 +0000 (11:57 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Fri, 30 May 2014 01:57:21 +0000 (11:57 +1000)
Conflicts:
drivers/gpu/drm/i915/i915_drv.h

16 files changed:
1  2 
Documentation/DocBook/drm.tmpl
arch/x86/kernel/early-quirks.c
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_execbuffer.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/intel_bios.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_fbdev.c
drivers/gpu/drm/i915/intel_overlay.c
drivers/gpu/drm/i915/intel_panel.c
drivers/gpu/drm/i915/intel_pm.c
drivers/gpu/drm/i915/intel_uncore.c
include/drm/i915_pciids.h

Simple merge
Simple merge
Simple merge
index d6dc54aa123ad72492b1daefd361380a2e8a4955,43ecd19480d644e189ff75cecb862c9bfe6f555b..bea9ab400d6f7455b7206c0022dc92456eb24e3e
@@@ -1609,9 -1713,21 +1698,21 @@@ struct drm_i915_gem_object 
        struct drm_file *pin_filp;
  
        /** for phy allocated objects */
 -      struct drm_i915_gem_phys_object *phys_obj;
 +      drm_dma_handle_t *phys_handle;
- };
  
+       union {
+               struct i915_gem_userptr {
+                       uintptr_t ptr;
+                       unsigned read_only :1;
+                       unsigned workers :4;
+ #define I915_GEM_USERPTR_MAX_WORKERS 15
+                       struct mm_struct *mm;
+                       struct i915_mmu_object *mn;
+                       struct work_struct *work;
+               } userptr;
+       };
+ };
  #define to_intel_bo(x) container_of(x, struct drm_i915_gem_object, base)
  
  /**
@@@ -2199,10 -2296,15 +2286,10 @@@ i915_gem_object_set_to_cpu_domain(struc
  int __must_check
  i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
                                     u32 alignment,
-                                    struct intel_ring_buffer *pipelined);
+                                    struct intel_engine_cs *pipelined);
  void i915_gem_object_unpin_from_display_plane(struct drm_i915_gem_object *obj);
 -int i915_gem_attach_phys_object(struct drm_device *dev,
 -                              struct drm_i915_gem_object *obj,
 -                              int id,
 +int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj,
                                int align);
 -void i915_gem_detach_phys_object(struct drm_device *dev,
 -                               struct drm_i915_gem_object *obj);
 -void i915_gem_free_all_phys_object(struct drm_device *dev);
  int i915_gem_open(struct drm_device *dev, struct drm_file *file);
  void i915_gem_release(struct drm_device *dev, struct drm_file *file);
  
index ca1b84916537c546b8806c9460d690afc63a438e,ea09d1a0fbd9de8b309f9d5688bf4abbb7e36321..f36126383d260166a950ad20c72b69637246c550
@@@ -3991,8 -3896,9 +4037,9 @@@ in
  i915_gem_object_pin(struct drm_i915_gem_object *obj,
                    struct i915_address_space *vm,
                    uint32_t alignment,
 -                  unsigned flags)
 +                  uint64_t flags)
  {
+       struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
        struct i915_vma *vma;
        int ret;
  
@@@ -4815,12 -4783,199 +4921,15 @@@ i915_gem_load(struct drm_device *dev
  
        dev_priv->mm.interruptible = true;
  
-       dev_priv->mm.inactive_shrinker.scan_objects = i915_gem_inactive_scan;
-       dev_priv->mm.inactive_shrinker.count_objects = i915_gem_inactive_count;
-       dev_priv->mm.inactive_shrinker.seeks = DEFAULT_SEEKS;
-       register_shrinker(&dev_priv->mm.inactive_shrinker);
+       dev_priv->mm.shrinker.scan_objects = i915_gem_shrinker_scan;
+       dev_priv->mm.shrinker.count_objects = i915_gem_shrinker_count;
+       dev_priv->mm.shrinker.seeks = DEFAULT_SEEKS;
+       register_shrinker(&dev_priv->mm.shrinker);
+       dev_priv->mm.oom_notifier.notifier_call = i915_gem_shrinker_oom;
+       register_oom_notifier(&dev_priv->mm.oom_notifier);
  }
  
 -/*
 - * Create a physically contiguous memory object for this object
 - * e.g. for cursor + overlay regs
 - */
 -static int i915_gem_init_phys_object(struct drm_device *dev,
 -                                   int id, int size, int align)
 -{
 -      struct drm_i915_private *dev_priv = dev->dev_private;
 -      struct drm_i915_gem_phys_object *phys_obj;
 -      int ret;
 -
 -      if (dev_priv->mm.phys_objs[id - 1] || !size)
 -              return 0;
 -
 -      phys_obj = kzalloc(sizeof(*phys_obj), GFP_KERNEL);
 -      if (!phys_obj)
 -              return -ENOMEM;
 -
 -      phys_obj->id = id;
 -
 -      phys_obj->handle = drm_pci_alloc(dev, size, align);
 -      if (!phys_obj->handle) {
 -              ret = -ENOMEM;
 -              goto kfree_obj;
 -      }
 -#ifdef CONFIG_X86
 -      set_memory_wc((unsigned long)phys_obj->handle->vaddr, phys_obj->handle->size / PAGE_SIZE);
 -#endif
 -
 -      dev_priv->mm.phys_objs[id - 1] = phys_obj;
 -
 -      return 0;
 -kfree_obj:
 -      kfree(phys_obj);
 -      return ret;
 -}
 -
 -static void i915_gem_free_phys_object(struct drm_device *dev, int id)
 -{
 -      struct drm_i915_private *dev_priv = dev->dev_private;
 -      struct drm_i915_gem_phys_object *phys_obj;
 -
 -      if (!dev_priv->mm.phys_objs[id - 1])
 -              return;
 -
 -      phys_obj = dev_priv->mm.phys_objs[id - 1];
 -      if (phys_obj->cur_obj) {
 -              i915_gem_detach_phys_object(dev, phys_obj->cur_obj);
 -      }
 -
 -#ifdef CONFIG_X86
 -      set_memory_wb((unsigned long)phys_obj->handle->vaddr, phys_obj->handle->size / PAGE_SIZE);
 -#endif
 -      drm_pci_free(dev, phys_obj->handle);
 -      kfree(phys_obj);
 -      dev_priv->mm.phys_objs[id - 1] = NULL;
 -}
 -
 -void i915_gem_free_all_phys_object(struct drm_device *dev)
 -{
 -      int i;
 -
 -      for (i = I915_GEM_PHYS_CURSOR_0; i <= I915_MAX_PHYS_OBJECT; i++)
 -              i915_gem_free_phys_object(dev, i);
 -}
 -
 -void i915_gem_detach_phys_object(struct drm_device *dev,
 -                               struct drm_i915_gem_object *obj)
 -{
 -      struct address_space *mapping = file_inode(obj->base.filp)->i_mapping;
 -      char *vaddr;
 -      int i;
 -      int page_count;
 -
 -      if (!obj->phys_obj)
 -              return;
 -      vaddr = obj->phys_obj->handle->vaddr;
 -
 -      page_count = obj->base.size / PAGE_SIZE;
 -      for (i = 0; i < page_count; i++) {
 -              struct page *page = shmem_read_mapping_page(mapping, i);
 -              if (!IS_ERR(page)) {
 -                      char *dst = kmap_atomic(page);
 -                      memcpy(dst, vaddr + i*PAGE_SIZE, PAGE_SIZE);
 -                      kunmap_atomic(dst);
 -
 -                      drm_clflush_pages(&page, 1);
 -
 -                      set_page_dirty(page);
 -                      mark_page_accessed(page);
 -                      page_cache_release(page);
 -              }
 -      }
 -      i915_gem_chipset_flush(dev);
 -
 -      obj->phys_obj->cur_obj = NULL;
 -      obj->phys_obj = NULL;
 -}
 -
 -int
 -i915_gem_attach_phys_object(struct drm_device *dev,
 -                          struct drm_i915_gem_object *obj,
 -                          int id,
 -                          int align)
 -{
 -      struct address_space *mapping = file_inode(obj->base.filp)->i_mapping;
 -      struct drm_i915_private *dev_priv = dev->dev_private;
 -      int ret = 0;
 -      int page_count;
 -      int i;
 -
 -      if (id > I915_MAX_PHYS_OBJECT)
 -              return -EINVAL;
 -
 -      if (obj->phys_obj) {
 -              if (obj->phys_obj->id == id)
 -                      return 0;
 -              i915_gem_detach_phys_object(dev, obj);
 -      }
 -
 -      /* create a new object */
 -      if (!dev_priv->mm.phys_objs[id - 1]) {
 -              ret = i915_gem_init_phys_object(dev, id,
 -                                              obj->base.size, align);
 -              if (ret) {
 -                      DRM_ERROR("failed to init phys object %d size: %zu\n",
 -                                id, obj->base.size);
 -                      return ret;
 -              }
 -      }
 -
 -      /* bind to the object */
 -      obj->phys_obj = dev_priv->mm.phys_objs[id - 1];
 -      obj->phys_obj->cur_obj = obj;
 -
 -      page_count = obj->base.size / PAGE_SIZE;
 -
 -      for (i = 0; i < page_count; i++) {
 -              struct page *page;
 -              char *dst, *src;
 -
 -              page = shmem_read_mapping_page(mapping, i);
 -              if (IS_ERR(page))
 -                      return PTR_ERR(page);
 -
 -              src = kmap_atomic(page);
 -              dst = obj->phys_obj->handle->vaddr + (i * PAGE_SIZE);
 -              memcpy(dst, src, PAGE_SIZE);
 -              kunmap_atomic(src);
 -
 -              mark_page_accessed(page);
 -              page_cache_release(page);
 -      }
 -
 -      return 0;
 -}
 -
 -static int
 -i915_gem_phys_pwrite(struct drm_device *dev,
 -                   struct drm_i915_gem_object *obj,
 -                   struct drm_i915_gem_pwrite *args,
 -                   struct drm_file *file_priv)
 -{
 -      void *vaddr = obj->phys_obj->handle->vaddr + args->offset;
 -      char __user *user_data = to_user_ptr(args->data_ptr);
 -
 -      if (__copy_from_user_inatomic_nocache(vaddr, user_data, args->size)) {
 -              unsigned long unwritten;
 -
 -              /* The physical object once assigned is fixed for the lifetime
 -               * of the obj, so we can safely drop the lock and continue
 -               * to access vaddr.
 -               */
 -              mutex_unlock(&dev->struct_mutex);
 -              unwritten = copy_from_user(vaddr, user_data, args->size);
 -              mutex_lock(&dev->struct_mutex);
 -              if (unwritten)
 -                      return -EFAULT;
 -      }
 -
 -      i915_gem_chipset_flush(dev);
 -      return 0;
 -}
 -
  void i915_gem_release(struct drm_device *dev, struct drm_file *file)
  {
        struct drm_i915_file_private *file_priv = file->driver_priv;
index 8a07ae899ef1fd07cbbd0483723e1ee291a3c22a,008e208e9a3a0739d1dbf3b631ddcd38028ca0bc..1944018e4048c1b8185ab0a3ef2c6213a63e2724
@@@ -600,38 -595,8 +600,38 @@@ i915_gem_execbuffer_reserve_vma(struct 
        return 0;
  }
  
 +static bool
 +eb_vma_misplaced(struct i915_vma *vma, bool has_fenced_gpu_access)
 +{
 +      struct drm_i915_gem_exec_object2 *entry = vma->exec_entry;
 +      struct drm_i915_gem_object *obj = vma->obj;
 +      bool need_fence, need_mappable;
 +
 +      need_fence =
 +              has_fenced_gpu_access &&
 +              entry->flags & EXEC_OBJECT_NEEDS_FENCE &&
 +              obj->tiling_mode != I915_TILING_NONE;
 +      need_mappable = need_fence || need_reloc_mappable(vma);
 +
 +      WARN_ON((need_mappable || need_fence) &&
 +             !i915_is_ggtt(vma->vm));
 +
 +      if (entry->alignment &&
 +          vma->node.start & (entry->alignment - 1))
 +              return true;
 +
 +      if (need_mappable && !obj->map_and_fenceable)
 +              return true;
 +
 +      if (entry->flags & __EXEC_OBJECT_NEEDS_BIAS &&
 +          vma->node.start < BATCH_OFFSET_BIAS)
 +              return true;
 +
 +      return false;
 +}
 +
  static int
- i915_gem_execbuffer_reserve(struct intel_ring_buffer *ring,
+ i915_gem_execbuffer_reserve(struct intel_engine_cs *ring,
                            struct list_head *vmas,
                            bool *need_relocs)
  {
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge