On ma, 2015-03-16 at 18:50 +0100, Daniel Vetter wrote:
> On Mon, Mar 16, 2015 at 02:11:13PM +0200, Joonas Lahtinen wrote:

> [snip]
> >  int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
> >               u32 flags);
> > @@ -2800,60 +2796,48 @@ struct dma_buf *i915_gem_prime_export(struct 
> > drm_device *dev,
> >  
> >  void i915_gem_restore_fences(struct drm_device *dev);
> >  
> > -unsigned long i915_gem_obj_offset_view(struct drm_i915_gem_object *o,
> > -                                  struct i915_address_space *vm,
> > -                                  enum i915_ggtt_view_type view);
> > -static inline
> > -unsigned long i915_gem_obj_offset(struct drm_i915_gem_object *o,
> > -                             struct i915_address_space *vm)
> > +static inline bool i915_is_ggtt(struct i915_address_space *vm);
> 
> This forward decl seems unneeded leftover from earlier patch iterations.
> I've removed it and merged the patch.
> 
> Thanks, Daniel
> 
> > +
> > +unsigned long
> > +i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o,
> > +                         enum i915_ggtt_view_type view);
> > +unsigned long
> > +i915_gem_obj_offset(struct drm_i915_gem_object *o,
> > +               struct i915_address_space *vm);
> > +static inline unsigned long
> > +i915_gem_obj_ggtt_offset(struct drm_i915_gem_object *o)
> >  {
> > -   return i915_gem_obj_offset_view(o, vm, I915_GGTT_VIEW_NORMAL);
> > +   return i915_gem_obj_ggtt_offset_view(o, I915_GGTT_VIEW_NORMAL);
> >  }
> > +
> >  bool i915_gem_obj_bound_any(struct drm_i915_gem_object *o);
> > -bool i915_gem_obj_bound_view(struct drm_i915_gem_object *o,
> > -                        struct i915_address_space *vm,
> > -                        enum i915_ggtt_view_type view);
> > -static inline
> > +bool i915_gem_obj_ggtt_bound_view(struct drm_i915_gem_object *o,
> > +                             enum i915_ggtt_view_type view);
> >  bool i915_gem_obj_bound(struct drm_i915_gem_object *o,
> > -                   struct i915_address_space *vm)
> > -{
> > -   return i915_gem_obj_bound_view(o, vm, I915_GGTT_VIEW_NORMAL);
> > -}
> > +                   struct i915_address_space *vm);
> >  
> >  unsigned long i915_gem_obj_size(struct drm_i915_gem_object *o,
> >                             struct i915_address_space *vm);
> > -struct i915_vma *i915_gem_obj_to_vma_view(struct drm_i915_gem_object *obj,
> > -                                     struct i915_address_space *vm,
> > -                                     const struct i915_ggtt_view *view);
> > -static inline
> > -struct i915_vma *i915_gem_obj_to_vma(struct drm_i915_gem_object *obj,
> > -                                struct i915_address_space *vm)
> > -{
> > -   return i915_gem_obj_to_vma_view(obj, vm, &i915_ggtt_view_normal);
> > -}
> > -
> >  struct i915_vma *
> > -i915_gem_obj_lookup_or_create_vma_view(struct drm_i915_gem_object *obj,
> > -                                  struct i915_address_space *vm,
> > -                                  const struct i915_ggtt_view *view);
> > +i915_gem_obj_to_vma(struct drm_i915_gem_object *obj,
> > +               struct i915_address_space *vm);
> > +struct i915_vma *
> > +i915_gem_obj_to_ggtt_view(struct drm_i915_gem_object *obj,
> > +                     const struct i915_ggtt_view *view);
> >  
> > -static inline
> >  struct i915_vma *
> >  i915_gem_obj_lookup_or_create_vma(struct drm_i915_gem_object *obj,
> > -                             struct i915_address_space *vm)
> > -{
> > -   return i915_gem_obj_lookup_or_create_vma_view(obj, vm,
> > -                                           &i915_ggtt_view_normal);
> > -}
> > +                             struct i915_address_space *vm);
> > +struct i915_vma *
> > +i915_gem_obj_lookup_or_create_ggtt_vma(struct drm_i915_gem_object *obj,
> > +                                  const struct i915_ggtt_view *view);
> >  
> > -struct i915_vma *i915_gem_obj_to_ggtt(struct drm_i915_gem_object *obj);
> > -static inline bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj) 
> > {
> > -   struct i915_vma *vma;
> > -   list_for_each_entry(vma, &obj->vma_list, vma_link)
> > -           if (vma->pin_count > 0)
> > -                   return true;
> > -   return false;
> > +static inline struct i915_vma *
> > +i915_gem_obj_to_ggtt(struct drm_i915_gem_object *obj)
> > +{
> > +   return i915_gem_obj_to_ggtt_view(obj, &i915_ggtt_view_normal);
> >  }
> > +bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj);
> >  
> >  /* Some GGTT VM helpers */
> >  #define i915_obj_to_ggtt(obj) \
> > @@ -2876,13 +2860,7 @@ i915_vm_to_ppgtt(struct i915_address_space *vm)
> >  
> >  static inline bool i915_gem_obj_ggtt_bound(struct drm_i915_gem_object *obj)
> >  {
> > -   return i915_gem_obj_bound(obj, i915_obj_to_ggtt(obj));
> > -}
> > -
> > -static inline unsigned long
> > -i915_gem_obj_ggtt_offset(struct drm_i915_gem_object *obj)
> > -{
> > -   return i915_gem_obj_offset(obj, i915_obj_to_ggtt(obj));
> > +   return i915_gem_obj_ggtt_bound_view(obj, I915_GGTT_VIEW_NORMAL);
> >  }
> >  
> >  static inline unsigned long
> > diff --git a/drivers/gpu/drm/i915/i915_gem.c 
> > b/drivers/gpu/drm/i915/i915_gem.c
> > index 0fe313d..e2876bf 100644
> > --- a/drivers/gpu/drm/i915/i915_gem.c
> > +++ b/drivers/gpu/drm/i915/i915_gem.c
> > @@ -3518,9 +3518,9 @@ static bool i915_gem_valid_gtt_space(struct i915_vma 
> > *vma,
> >  static struct i915_vma *
> >  i915_gem_object_bind_to_vm(struct drm_i915_gem_object *obj,
> >                        struct i915_address_space *vm,
> > +                      const struct i915_ggtt_view *ggtt_view,
> >                        unsigned alignment,
> > -                      uint64_t flags,
> > -                      const struct i915_ggtt_view *view)
> > +                      uint64_t flags)
> >  {
> >     struct drm_device *dev = obj->base.dev;
> >     struct drm_i915_private *dev_priv = dev->dev_private;
> > @@ -3532,6 +3532,9 @@ i915_gem_object_bind_to_vm(struct drm_i915_gem_object 
> > *obj,
> >     struct i915_vma *vma;
> >     int ret;
> >  
> > +   if(WARN_ON(i915_is_ggtt(vm) != !!ggtt_view))
> > +           return ERR_PTR(-EINVAL);
> > +
> >     fence_size = i915_gem_get_gtt_size(dev,
> >                                        obj->base.size,
> >                                        obj->tiling_mode);
> > @@ -3570,7 +3573,9 @@ i915_gem_object_bind_to_vm(struct drm_i915_gem_object 
> > *obj,
> >  
> >     i915_gem_object_pin_pages(obj);
> >  
> > -   vma = i915_gem_obj_lookup_or_create_vma_view(obj, vm, view);
> > +   vma = ggtt_view ? i915_gem_obj_lookup_or_create_ggtt_vma(obj, 
> > ggtt_view) :
> > +                     i915_gem_obj_lookup_or_create_vma(obj, vm);
> > +
> >     if (IS_ERR(vma))
> >             goto err_unpin;
> >  
> > @@ -4167,12 +4172,12 @@ i915_vma_misplaced(struct i915_vma *vma, uint32_t 
> > alignment, uint64_t flags)
> >     return false;
> >  }
> >  
> > -int
> > -i915_gem_object_pin_view(struct drm_i915_gem_object *obj,
> > -                    struct i915_address_space *vm,
> > -                    uint32_t alignment,
> > -                    uint64_t flags,
> > -                    const struct i915_ggtt_view *view)
> > +static int
> > +i915_gem_object_do_pin(struct drm_i915_gem_object *obj,
> > +                  struct i915_address_space *vm,
> > +                  const struct i915_ggtt_view *ggtt_view,
> > +                  uint32_t alignment,
> > +                  uint64_t flags)
> >  {
> >     struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
> >     struct i915_vma *vma;
> > @@ -4188,17 +4193,29 @@ i915_gem_object_pin_view(struct drm_i915_gem_object 
> > *obj,
> >     if (WARN_ON((flags & (PIN_MAPPABLE | PIN_GLOBAL)) == PIN_MAPPABLE))
> >             return -EINVAL;
> >  
> > -   vma = i915_gem_obj_to_vma_view(obj, vm, view);
> > +   if (WARN_ON(i915_is_ggtt(vm) != !!ggtt_view))
> > +           return -EINVAL;
> > +
> > +   vma = ggtt_view ? i915_gem_obj_to_ggtt_view(obj, ggtt_view) :
> > +                     i915_gem_obj_to_vma(obj, vm);
> > +
> > +   if (IS_ERR(vma))
> > +           return PTR_ERR(vma);
> > +
> >     if (vma) {
> >             if (WARN_ON(vma->pin_count == 
> > DRM_I915_GEM_OBJECT_MAX_PIN_COUNT))
> >                     return -EBUSY;
> >  
> >             if (i915_vma_misplaced(vma, alignment, flags)) {
> > +                   unsigned long offset;
> > +                   offset = ggtt_view ? i915_gem_obj_ggtt_offset_view(obj, 
> > ggtt_view->type) :
> > +                                        i915_gem_obj_offset(obj, vm);
> >                     WARN(vma->pin_count,
> > -                        "bo is already pinned with incorrect alignment:"
> > +                        "bo is already pinned in %s with incorrect 
> > alignment:"
> >                          " offset=%lx, req.alignment=%x, 
> > req.map_and_fenceable=%d,"
> >                          " obj->map_and_fenceable=%d\n",
> > -                        i915_gem_obj_offset_view(obj, vm, view->type),
> > +                        ggtt_view ? "ggtt" : "ppgtt",
> > +                        offset,
> >                          alignment,
> >                          !!(flags & PIN_MAPPABLE),
> >                          obj->map_and_fenceable);
> > @@ -4212,8 +4229,8 @@ i915_gem_object_pin_view(struct drm_i915_gem_object 
> > *obj,
> >  
> >     bound = vma ? vma->bound : 0;
> >     if (vma == NULL || !drm_mm_node_allocated(&vma->node)) {
> > -           vma = i915_gem_object_bind_to_vm(obj, vm, alignment,
> > -                                            flags, view);
> > +           vma = i915_gem_object_bind_to_vm(obj, vm, ggtt_view, alignment,
> > +                                            flags);
> >             if (IS_ERR(vma))
> >                     return PTR_ERR(vma);
> >     }
> > @@ -4254,6 +4271,30 @@ i915_gem_object_pin_view(struct drm_i915_gem_object 
> > *obj,
> >     return 0;
> >  }
> >  
> > +int
> > +i915_gem_object_pin(struct drm_i915_gem_object *obj,
> > +               struct i915_address_space *vm,
> > +               uint32_t alignment,
> > +               uint64_t flags)
> > +{
> > +   return i915_gem_object_do_pin(obj, vm,
> > +                                 i915_is_ggtt(vm) ? &i915_ggtt_view_normal 
> > : NULL,
> > +                                 alignment, flags);
> > +}
> > +
> > +int
> > +i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj,
> > +                    const struct i915_ggtt_view *view,
> > +                    uint32_t alignment,
> > +                    uint64_t flags)
> > +{
> > +   if (WARN_ONCE(!view, "no view specified"))
> > +           return -EINVAL;
> > +
> > +   return i915_gem_object_do_pin(obj, i915_obj_to_ggtt(obj), view,
> > +                                 alignment, flags);
> > +}
> > +
> >  void
> >  i915_gem_object_ggtt_unpin(struct drm_i915_gem_object *obj)
> >  {
> > @@ -4559,15 +4600,32 @@ void i915_gem_free_object(struct drm_gem_object 
> > *gem_obj)
> >     intel_runtime_pm_put(dev_priv);
> >  }
> >  
> > -struct i915_vma *i915_gem_obj_to_vma_view(struct drm_i915_gem_object *obj,
> > -                                     struct i915_address_space *vm,
> > -                                     const struct i915_ggtt_view *view)
> > +struct i915_vma *i915_gem_obj_to_vma(struct drm_i915_gem_object *obj,
> > +                                struct i915_address_space *vm)
> >  {
> >     struct i915_vma *vma;
> > -   list_for_each_entry(vma, &obj->vma_list, vma_link)
> > -           if (vma->vm == vm && vma->ggtt_view.type == view->type)
> > +   list_for_each_entry(vma, &obj->vma_list, vma_link) {
> > +           if (i915_is_ggtt(vma->vm) &&
> > +               vma->ggtt_view.type != I915_GGTT_VIEW_NORMAL)
> > +                   continue;
> > +           if (vma->vm == vm)
> >                     return vma;
> > +   }
> > +   return NULL;
> > +}
> >  
> > +struct i915_vma *i915_gem_obj_to_ggtt_view(struct drm_i915_gem_object *obj,
> > +                                      const struct i915_ggtt_view *view)
> > +{
> > +   struct i915_address_space *ggtt = i915_obj_to_ggtt(obj);
> > +   struct i915_vma *vma;
> > +
> > +   if (WARN_ONCE(!view, "no view specified"))
> > +           return ERR_PTR(-EINVAL);
> > +
> > +   list_for_each_entry(vma, &obj->vma_list, vma_link)
> > +           if (vma->vm == ggtt && vma->ggtt_view.type == view->type)
> > +                   return vma;
> >     return NULL;
> >  }
> >  
> > @@ -5176,9 +5234,9 @@ i915_gem_shrinker_count(struct shrinker *shrinker, 
> > struct shrink_control *sc)
> >  }
> >  
> >  /* All the new VM stuff */
> > -unsigned long i915_gem_obj_offset_view(struct drm_i915_gem_object *o,
> > -                                  struct i915_address_space *vm,
> > -                                  enum i915_ggtt_view_type view)
> > +unsigned long
> > +i915_gem_obj_offset(struct drm_i915_gem_object *o,
> > +               struct i915_address_space *vm)
> >  {
> >     struct drm_i915_private *dev_priv = o->base.dev->dev_private;
> >     struct i915_vma *vma;
> > @@ -5186,23 +5244,58 @@ unsigned long i915_gem_obj_offset_view(struct 
> > drm_i915_gem_object *o,
> >     WARN_ON(vm == &dev_priv->mm.aliasing_ppgtt->base);
> >  
> >     list_for_each_entry(vma, &o->vma_list, vma_link) {
> > -           if (vma->vm == vm && vma->ggtt_view.type == view)
> > +           if (i915_is_ggtt(vma->vm) &&
> > +               vma->ggtt_view.type != I915_GGTT_VIEW_NORMAL)
> > +                   continue;
> > +           if (vma->vm == vm)
> >                     return vma->node.start;
> > -
> >     }
> > +
> >     WARN(1, "%s vma for this object not found.\n",
> >          i915_is_ggtt(vm) ? "global" : "ppgtt");
> >     return -1;
> >  }
> >  
> > -bool i915_gem_obj_bound_view(struct drm_i915_gem_object *o,
> > -                        struct i915_address_space *vm,
> > -                        enum i915_ggtt_view_type view)
> > +unsigned long
> > +i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o,
> > +                         enum i915_ggtt_view_type view)
> >  {
> > +   struct drm_i915_private *dev_priv = o->base.dev->dev_private;
> > +   struct i915_address_space *ggtt = i915_obj_to_ggtt(o);
> >     struct i915_vma *vma;
> >  
> >     list_for_each_entry(vma, &o->vma_list, vma_link)
> > -           if (vma->vm == vm &&
> > +           if (vma->vm == ggtt && vma->ggtt_view.type == view)
> > +                   return vma->node.start;
> > +
> > +   WARN(1, "global vma for this object not found.\n");
> > +   return -1;
> > +}
> > +
> > +bool i915_gem_obj_bound(struct drm_i915_gem_object *o,
> > +                   struct i915_address_space *vm)
> > +{
> > +   struct i915_vma *vma;
> > +
> > +   list_for_each_entry(vma, &o->vma_list, vma_link) {
> > +           if (i915_is_ggtt(vma->vm) &&
> > +               vma->ggtt_view.type != I915_GGTT_VIEW_NORMAL)
> > +                   continue;
> > +           if (vma->vm == vm && drm_mm_node_allocated(&vma->node))
> > +                   return true;
> > +   }
> > +
> > +   return false;
> > +}
> > +
> > +bool i915_gem_obj_ggtt_bound_view(struct drm_i915_gem_object *o,
> > +                             enum i915_ggtt_view_type view)
> > +{
> > +   struct i915_address_space *ggtt = i915_obj_to_ggtt(o);
> > +   struct i915_vma *vma;
> > +
> > +   list_for_each_entry(vma, &o->vma_list, vma_link)
> > +           if (vma->vm == ggtt &&
> >                 vma->ggtt_view.type == view &&
> >                 drm_mm_node_allocated(&vma->node))
> >                     return true;
> > @@ -5231,10 +5324,13 @@ unsigned long i915_gem_obj_size(struct 
> > drm_i915_gem_object *o,
> >  
> >     BUG_ON(list_empty(&o->vma_list));
> >  
> > -   list_for_each_entry(vma, &o->vma_list, vma_link)
> > +   list_for_each_entry(vma, &o->vma_list, vma_link) {
> > +           if (i915_is_ggtt(vma->vm) &&
> > +               vma->ggtt_view.type != I915_GGTT_VIEW_NORMAL)
> > +                   continue;
> >             if (vma->vm == vm)
> >                     return vma->node.size;
> > -
> > +   }
> >     return 0;
> >  }
> >  
> > @@ -5334,15 +5430,16 @@ i915_gem_shrinker_oom(struct notifier_block *nb, 
> > unsigned long event, void *ptr)
> >     return NOTIFY_DONE;
> >  }
> >  
> > -struct i915_vma *i915_gem_obj_to_ggtt(struct drm_i915_gem_object *obj)
> > +bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj)
> >  {
> > -   struct i915_address_space *ggtt = i915_obj_to_ggtt(obj);
> >     struct i915_vma *vma;
> > -
> > -   list_for_each_entry(vma, &obj->vma_list, vma_link)
> > -           if (vma->vm == ggtt &&
> > -               vma->ggtt_view.type == I915_GGTT_VIEW_NORMAL)
> > -                   return vma;
> > -
> > -   return NULL;
> > +   list_for_each_entry(vma, &obj->vma_list, vma_link) {
> > +           if (i915_is_ggtt(vma->vm) &&
> > +               vma->ggtt_view.type != I915_GGTT_VIEW_NORMAL)
> > +                   continue;
> > +           if (vma->pin_count > 0)
> > +                   return true;
> > +   }
> > +   return false;
> >  }
> > +
> > diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c 
> > b/drivers/gpu/drm/i915/i915_gem_gtt.c
> > index 2034f7c..f1b9ea6 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> > @@ -67,8 +67,9 @@
> >   * i915_ggtt_view_type and struct i915_ggtt_view.
> >   *
> >   * A new flavour of core GEM functions which work with GGTT bound objects 
> > were
> > - * added with the _view suffix. They take the struct i915_ggtt_view 
> > parameter
> > - * encapsulating all metadata required to implement a view.
> > + * added with the _ggtt_ infix, and sometimes with _view postfix to avoid
> > + * renaming  in large amounts of code. They take the struct i915_ggtt_view
> > + * parameter encapsulating all metadata required to implement a view.
> >   *
> >   * As a helper for callers which are only interested in the normal view,
> >   * globally const i915_ggtt_view_normal singleton instance exists. All old 
> > core
> > @@ -1726,11 +1727,15 @@ static void ggtt_bind_vma(struct i915_vma *vma,
> >     struct drm_device *dev = vma->vm->dev;
> >     struct drm_i915_private *dev_priv = dev->dev_private;
> >     struct drm_i915_gem_object *obj = vma->obj;
> > +   struct sg_table *pages = obj->pages;
> >  
> >     /* Currently applicable only to VLV */
> >     if (obj->gt_ro)
> >             flags |= PTE_READ_ONLY;
> >  
> > +   if (i915_is_ggtt(vma->vm))
> > +           pages = vma->ggtt_view.pages;
> > +
> >     /* If there is no aliasing PPGTT, or the caller needs a global mapping,
> >      * or we have a global mapping already but the cacheability flags have
> >      * changed, set the global PTEs.
> > @@ -1745,7 +1750,7 @@ static void ggtt_bind_vma(struct i915_vma *vma,
> >     if (!dev_priv->mm.aliasing_ppgtt || flags & GLOBAL_BIND) {
> >             if (!(vma->bound & GLOBAL_BIND) ||
> >                 (cache_level != obj->cache_level)) {
> > -                   vma->vm->insert_entries(vma->vm, vma->ggtt_view.pages,
> > +                   vma->vm->insert_entries(vma->vm, pages,
> >                                             vma->node.start,
> >                                             cache_level, flags);
> >                     vma->bound |= GLOBAL_BIND;
> > @@ -1756,8 +1761,7 @@ static void ggtt_bind_vma(struct i915_vma *vma,
> >         (!(vma->bound & LOCAL_BIND) ||
> >          (cache_level != obj->cache_level))) {
> >             struct i915_hw_ppgtt *appgtt = dev_priv->mm.aliasing_ppgtt;
> > -           appgtt->base.insert_entries(&appgtt->base,
> > -                                       vma->ggtt_view.pages,
> > +           appgtt->base.insert_entries(&appgtt->base, pages,
> >                                         vma->node.start,
> >                                         cache_level, flags);
> >             vma->bound |= LOCAL_BIND;
> > @@ -2331,23 +2335,28 @@ int i915_gem_gtt_init(struct drm_device *dev)
> >     return 0;
> >  }
> >  
> > -static struct i915_vma *__i915_gem_vma_create(struct drm_i915_gem_object 
> > *obj,
> > -                                         struct i915_address_space *vm,
> > -                                         const struct i915_ggtt_view *view)
> > +static struct i915_vma *
> > +__i915_gem_vma_create(struct drm_i915_gem_object *obj,
> > +                 struct i915_address_space *vm,
> > +                 const struct i915_ggtt_view *ggtt_view)
> >  {
> >     struct i915_vma *vma = kzalloc(sizeof(*vma), GFP_KERNEL);
> >     if (vma == NULL)
> >             return ERR_PTR(-ENOMEM);
> >  
> > +   if (WARN_ON(i915_is_ggtt(vm) != !!ggtt_view))
> > +           return ERR_PTR(-EINVAL);
> > +
> >     INIT_LIST_HEAD(&vma->vma_link);
> >     INIT_LIST_HEAD(&vma->mm_list);
> >     INIT_LIST_HEAD(&vma->exec_list);
> >     vma->vm = vm;
> >     vma->obj = obj;
> > -   vma->ggtt_view = *view;
> >  
> >     if (INTEL_INFO(vm->dev)->gen >= 6) {
> >             if (i915_is_ggtt(vm)) {
> > +                   vma->ggtt_view = *ggtt_view;
> > +
> >                     vma->unbind_vma = ggtt_unbind_vma;
> >                     vma->bind_vma = ggtt_bind_vma;
> >             } else {
> > @@ -2356,6 +2365,7 @@ static struct i915_vma *__i915_gem_vma_create(struct 
> > drm_i915_gem_object *obj,
> >             }
> >     } else {
> >             BUG_ON(!i915_is_ggtt(vm));
> > +           vma->ggtt_view = *ggtt_view;
> >             vma->unbind_vma = i915_ggtt_unbind_vma;
> >             vma->bind_vma = i915_ggtt_bind_vma;
> >     }
> > @@ -2368,21 +2378,44 @@ static struct i915_vma 
> > *__i915_gem_vma_create(struct drm_i915_gem_object *obj,
> >  }
> >  
> >  struct i915_vma *
> > -i915_gem_obj_lookup_or_create_vma_view(struct drm_i915_gem_object *obj,
> > -                                  struct i915_address_space *vm,
> > +i915_gem_obj_lookup_or_create_vma(struct drm_i915_gem_object *obj,
> > +                             struct i915_address_space *vm)
> > +{
> > +   struct i915_vma *vma;
> > +
> > +   vma = i915_gem_obj_to_vma(obj, vm);
> > +   if (!vma)
> > +           vma = __i915_gem_vma_create(obj, vm,
> > +                                       i915_is_ggtt(vm) ? 
> > &i915_ggtt_view_normal : NULL);
> > +
> > +   return vma;
> > +}
> > +
> > +struct i915_vma *
> > +i915_gem_obj_lookup_or_create_ggtt_vma(struct drm_i915_gem_object *obj,
> >                                    const struct i915_ggtt_view *view)
> >  {
> > +   struct i915_address_space *ggtt = i915_obj_to_ggtt(obj);
> >     struct i915_vma *vma;
> >  
> > -   vma = i915_gem_obj_to_vma_view(obj, vm, view);
> > +   if (WARN_ON(!view))
> > +           return ERR_PTR(-EINVAL);
> > +
> > +   vma = i915_gem_obj_to_ggtt_view(obj, view);
> > +
> > +   if (IS_ERR(vma))
> > +           return vma;
> > +
> >     if (!vma)
> > -           vma = __i915_gem_vma_create(obj, vm, view);
> > +           vma = __i915_gem_vma_create(obj, ggtt, view);
> >  
> >     return vma;
> > +
> >  }
> >  
> > +
> >  static inline
> > -int i915_get_vma_pages(struct i915_vma *vma)
> > +int i915_get_ggtt_vma_pages(struct i915_vma *vma)
> >  {
> >     if (vma->ggtt_view.pages)
> >             return 0;
> > @@ -2394,7 +2427,7 @@ int i915_get_vma_pages(struct i915_vma *vma)
> >                       vma->ggtt_view.type);
> >  
> >     if (!vma->ggtt_view.pages) {
> > -           DRM_ERROR("Failed to get pages for VMA view type %u!\n",
> > +           DRM_ERROR("Failed to get pages for GGTT view type %u!\n",
> >                       vma->ggtt_view.type);
> >             return -EINVAL;
> >     }
> > @@ -2415,10 +2448,12 @@ int i915_get_vma_pages(struct i915_vma *vma)
> >  int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
> >               u32 flags)
> >  {
> > -   int ret = i915_get_vma_pages(vma);
> > +   if (i915_is_ggtt(vma->vm)) {
> > +           int ret = i915_get_ggtt_vma_pages(vma);
> >  
> > -   if (ret)
> > -           return ret;
> > +           if (ret)
> > +                   return ret;
> > +   }
> >  
> >     vma->bind_vma(vma, cache_level, flags);
> >  
> > -- 
> > 1.9.3
> > 
> > 
> > 
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> 


_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to