Merge remote-tracking branches 'regulator/fix/da9211', 'regulator/fix/ltc3589' and...
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / i915 / i915_gem_userptr.c
1 /*
2  * Copyright © 2012-2014 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  *
23  */
24
25 #include "drmP.h"
26 #include "i915_drm.h"
27 #include "i915_drv.h"
28 #include "i915_trace.h"
29 #include "intel_drv.h"
30 #include <linux/mmu_context.h>
31 #include <linux/mmu_notifier.h>
32 #include <linux/mempolicy.h>
33 #include <linux/swap.h>
34
35 struct i915_mm_struct {
36         struct mm_struct *mm;
37         struct drm_device *dev;
38         struct i915_mmu_notifier *mn;
39         struct hlist_node node;
40         struct kref kref;
41         struct work_struct work;
42 };
43
44 #if defined(CONFIG_MMU_NOTIFIER)
45 #include <linux/interval_tree.h>
46
47 struct i915_mmu_notifier {
48         spinlock_t lock;
49         struct hlist_node node;
50         struct mmu_notifier mn;
51         struct rb_root objects;
52         struct list_head linear;
53         unsigned long serial;
54         bool has_linear;
55 };
56
57 struct i915_mmu_object {
58         struct i915_mmu_notifier *mn;
59         struct interval_tree_node it;
60         struct list_head link;
61         struct drm_i915_gem_object *obj;
62         bool is_linear;
63 };
64
65 static unsigned long cancel_userptr(struct drm_i915_gem_object *obj)
66 {
67         struct drm_device *dev = obj->base.dev;
68         unsigned long end;
69
70         mutex_lock(&dev->struct_mutex);
71         /* Cancel any active worker and force us to re-evaluate gup */
72         obj->userptr.work = NULL;
73
74         if (obj->pages != NULL) {
75                 struct drm_i915_private *dev_priv = to_i915(dev);
76                 struct i915_vma *vma, *tmp;
77                 bool was_interruptible;
78
79                 was_interruptible = dev_priv->mm.interruptible;
80                 dev_priv->mm.interruptible = false;
81
82                 list_for_each_entry_safe(vma, tmp, &obj->vma_list, vma_link) {
83                         int ret = i915_vma_unbind(vma);
84                         WARN_ON(ret && ret != -EIO);
85                 }
86                 WARN_ON(i915_gem_object_put_pages(obj));
87
88                 dev_priv->mm.interruptible = was_interruptible;
89         }
90
91         end = obj->userptr.ptr + obj->base.size;
92
93         drm_gem_object_unreference(&obj->base);
94         mutex_unlock(&dev->struct_mutex);
95
96         return end;
97 }
98
99 static void *invalidate_range__linear(struct i915_mmu_notifier *mn,
100                                       struct mm_struct *mm,
101                                       unsigned long start,
102                                       unsigned long end)
103 {
104         struct i915_mmu_object *mo;
105         unsigned long serial;
106
107 restart:
108         serial = mn->serial;
109         list_for_each_entry(mo, &mn->linear, link) {
110                 struct drm_i915_gem_object *obj;
111
112                 if (mo->it.last < start || mo->it.start > end)
113                         continue;
114
115                 obj = mo->obj;
116                 drm_gem_object_reference(&obj->base);
117                 spin_unlock(&mn->lock);
118
119                 cancel_userptr(obj);
120
121                 spin_lock(&mn->lock);
122                 if (serial != mn->serial)
123                         goto restart;
124         }
125
126         return NULL;
127 }
128
129 static void i915_gem_userptr_mn_invalidate_range_start(struct mmu_notifier *_mn,
130                                                        struct mm_struct *mm,
131                                                        unsigned long start,
132                                                        unsigned long end)
133 {
134         struct i915_mmu_notifier *mn = container_of(_mn, struct i915_mmu_notifier, mn);
135         struct interval_tree_node *it = NULL;
136         unsigned long next = start;
137         unsigned long serial = 0;
138
139         end--; /* interval ranges are inclusive, but invalidate range is exclusive */
140         while (next < end) {
141                 struct drm_i915_gem_object *obj = NULL;
142
143                 spin_lock(&mn->lock);
144                 if (mn->has_linear)
145                         it = invalidate_range__linear(mn, mm, start, end);
146                 else if (serial == mn->serial)
147                         it = interval_tree_iter_next(it, next, end);
148                 else
149                         it = interval_tree_iter_first(&mn->objects, start, end);
150                 if (it != NULL) {
151                         obj = container_of(it, struct i915_mmu_object, it)->obj;
152                         drm_gem_object_reference(&obj->base);
153                         serial = mn->serial;
154                 }
155                 spin_unlock(&mn->lock);
156                 if (obj == NULL)
157                         return;
158
159                 next = cancel_userptr(obj);
160         }
161 }
162
163 static const struct mmu_notifier_ops i915_gem_userptr_notifier = {
164         .invalidate_range_start = i915_gem_userptr_mn_invalidate_range_start,
165 };
166
167 static struct i915_mmu_notifier *
168 i915_mmu_notifier_create(struct mm_struct *mm)
169 {
170         struct i915_mmu_notifier *mn;
171         int ret;
172
173         mn = kmalloc(sizeof(*mn), GFP_KERNEL);
174         if (mn == NULL)
175                 return ERR_PTR(-ENOMEM);
176
177         spin_lock_init(&mn->lock);
178         mn->mn.ops = &i915_gem_userptr_notifier;
179         mn->objects = RB_ROOT;
180         mn->serial = 1;
181         INIT_LIST_HEAD(&mn->linear);
182         mn->has_linear = false;
183
184          /* Protected by mmap_sem (write-lock) */
185         ret = __mmu_notifier_register(&mn->mn, mm);
186         if (ret) {
187                 kfree(mn);
188                 return ERR_PTR(ret);
189         }
190
191         return mn;
192 }
193
194 static void __i915_mmu_notifier_update_serial(struct i915_mmu_notifier *mn)
195 {
196         if (++mn->serial == 0)
197                 mn->serial = 1;
198 }
199
200 static int
201 i915_mmu_notifier_add(struct drm_device *dev,
202                       struct i915_mmu_notifier *mn,
203                       struct i915_mmu_object *mo)
204 {
205         struct interval_tree_node *it;
206         int ret;
207
208         ret = i915_mutex_lock_interruptible(dev);
209         if (ret)
210                 return ret;
211
212         /* Make sure we drop the final active reference (and thereby
213          * remove the objects from the interval tree) before we do
214          * the check for overlapping objects.
215          */
216         i915_gem_retire_requests(dev);
217
218         spin_lock(&mn->lock);
219         it = interval_tree_iter_first(&mn->objects,
220                                       mo->it.start, mo->it.last);
221         if (it) {
222                 struct drm_i915_gem_object *obj;
223
224                 /* We only need to check the first object in the range as it
225                  * either has cancelled gup work queued and we need to
226                  * return back to the user to give time for the gup-workers
227                  * to flush their object references upon which the object will
228                  * be removed from the interval-tree, or the the range is
229                  * still in use by another client and the overlap is invalid.
230                  *
231                  * If we do have an overlap, we cannot use the interval tree
232                  * for fast range invalidation.
233                  */
234
235                 obj = container_of(it, struct i915_mmu_object, it)->obj;
236                 if (!obj->userptr.workers)
237                         mn->has_linear = mo->is_linear = true;
238                 else
239                         ret = -EAGAIN;
240         } else
241                 interval_tree_insert(&mo->it, &mn->objects);
242
243         if (ret == 0) {
244                 list_add(&mo->link, &mn->linear);
245                 __i915_mmu_notifier_update_serial(mn);
246         }
247         spin_unlock(&mn->lock);
248         mutex_unlock(&dev->struct_mutex);
249
250         return ret;
251 }
252
253 static bool i915_mmu_notifier_has_linear(struct i915_mmu_notifier *mn)
254 {
255         struct i915_mmu_object *mo;
256
257         list_for_each_entry(mo, &mn->linear, link)
258                 if (mo->is_linear)
259                         return true;
260
261         return false;
262 }
263
264 static void
265 i915_mmu_notifier_del(struct i915_mmu_notifier *mn,
266                       struct i915_mmu_object *mo)
267 {
268         spin_lock(&mn->lock);
269         list_del(&mo->link);
270         if (mo->is_linear)
271                 mn->has_linear = i915_mmu_notifier_has_linear(mn);
272         else
273                 interval_tree_remove(&mo->it, &mn->objects);
274         __i915_mmu_notifier_update_serial(mn);
275         spin_unlock(&mn->lock);
276 }
277
278 static void
279 i915_gem_userptr_release__mmu_notifier(struct drm_i915_gem_object *obj)
280 {
281         struct i915_mmu_object *mo;
282
283         mo = obj->userptr.mmu_object;
284         if (mo == NULL)
285                 return;
286
287         i915_mmu_notifier_del(mo->mn, mo);
288         kfree(mo);
289
290         obj->userptr.mmu_object = NULL;
291 }
292
293 static struct i915_mmu_notifier *
294 i915_mmu_notifier_find(struct i915_mm_struct *mm)
295 {
296         if (mm->mn == NULL) {
297                 down_write(&mm->mm->mmap_sem);
298                 mutex_lock(&to_i915(mm->dev)->mm_lock);
299                 if (mm->mn == NULL)
300                         mm->mn = i915_mmu_notifier_create(mm->mm);
301                 mutex_unlock(&to_i915(mm->dev)->mm_lock);
302                 up_write(&mm->mm->mmap_sem);
303         }
304         return mm->mn;
305 }
306
307 static int
308 i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj,
309                                     unsigned flags)
310 {
311         struct i915_mmu_notifier *mn;
312         struct i915_mmu_object *mo;
313         int ret;
314
315         if (flags & I915_USERPTR_UNSYNCHRONIZED)
316                 return capable(CAP_SYS_ADMIN) ? 0 : -EPERM;
317
318         if (WARN_ON(obj->userptr.mm == NULL))
319                 return -EINVAL;
320
321         mn = i915_mmu_notifier_find(obj->userptr.mm);
322         if (IS_ERR(mn))
323                 return PTR_ERR(mn);
324
325         mo = kzalloc(sizeof(*mo), GFP_KERNEL);
326         if (mo == NULL)
327                 return -ENOMEM;
328
329         mo->mn = mn;
330         mo->it.start = obj->userptr.ptr;
331         mo->it.last = mo->it.start + obj->base.size - 1;
332         mo->obj = obj;
333
334         ret = i915_mmu_notifier_add(obj->base.dev, mn, mo);
335         if (ret) {
336                 kfree(mo);
337                 return ret;
338         }
339
340         obj->userptr.mmu_object = mo;
341         return 0;
342 }
343
344 static void
345 i915_mmu_notifier_free(struct i915_mmu_notifier *mn,
346                        struct mm_struct *mm)
347 {
348         if (mn == NULL)
349                 return;
350
351         mmu_notifier_unregister(&mn->mn, mm);
352         kfree(mn);
353 }
354
355 #else
356
357 static void
358 i915_gem_userptr_release__mmu_notifier(struct drm_i915_gem_object *obj)
359 {
360 }
361
362 static int
363 i915_gem_userptr_init__mmu_notifier(struct drm_i915_gem_object *obj,
364                                     unsigned flags)
365 {
366         if ((flags & I915_USERPTR_UNSYNCHRONIZED) == 0)
367                 return -ENODEV;
368
369         if (!capable(CAP_SYS_ADMIN))
370                 return -EPERM;
371
372         return 0;
373 }
374
375 static void
376 i915_mmu_notifier_free(struct i915_mmu_notifier *mn,
377                        struct mm_struct *mm)
378 {
379 }
380
381 #endif
382
383 static struct i915_mm_struct *
384 __i915_mm_struct_find(struct drm_i915_private *dev_priv, struct mm_struct *real)
385 {
386         struct i915_mm_struct *mm;
387
388         /* Protected by dev_priv->mm_lock */
389         hash_for_each_possible(dev_priv->mm_structs, mm, node, (unsigned long)real)
390                 if (mm->mm == real)
391                         return mm;
392
393         return NULL;
394 }
395
396 static int
397 i915_gem_userptr_init__mm_struct(struct drm_i915_gem_object *obj)
398 {
399         struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
400         struct i915_mm_struct *mm;
401         int ret = 0;
402
403         /* During release of the GEM object we hold the struct_mutex. This
404          * precludes us from calling mmput() at that time as that may be
405          * the last reference and so call exit_mmap(). exit_mmap() will
406          * attempt to reap the vma, and if we were holding a GTT mmap
407          * would then call drm_gem_vm_close() and attempt to reacquire
408          * the struct mutex. So in order to avoid that recursion, we have
409          * to defer releasing the mm reference until after we drop the
410          * struct_mutex, i.e. we need to schedule a worker to do the clean
411          * up.
412          */
413         mutex_lock(&dev_priv->mm_lock);
414         mm = __i915_mm_struct_find(dev_priv, current->mm);
415         if (mm == NULL) {
416                 mm = kmalloc(sizeof(*mm), GFP_KERNEL);
417                 if (mm == NULL) {
418                         ret = -ENOMEM;
419                         goto out;
420                 }
421
422                 kref_init(&mm->kref);
423                 mm->dev = obj->base.dev;
424
425                 mm->mm = current->mm;
426                 atomic_inc(&current->mm->mm_count);
427
428                 mm->mn = NULL;
429
430                 /* Protected by dev_priv->mm_lock */
431                 hash_add(dev_priv->mm_structs,
432                          &mm->node, (unsigned long)mm->mm);
433         } else
434                 kref_get(&mm->kref);
435
436         obj->userptr.mm = mm;
437 out:
438         mutex_unlock(&dev_priv->mm_lock);
439         return ret;
440 }
441
442 static void
443 __i915_mm_struct_free__worker(struct work_struct *work)
444 {
445         struct i915_mm_struct *mm = container_of(work, typeof(*mm), work);
446         i915_mmu_notifier_free(mm->mn, mm->mm);
447         mmdrop(mm->mm);
448         kfree(mm);
449 }
450
451 static void
452 __i915_mm_struct_free(struct kref *kref)
453 {
454         struct i915_mm_struct *mm = container_of(kref, typeof(*mm), kref);
455
456         /* Protected by dev_priv->mm_lock */
457         hash_del(&mm->node);
458         mutex_unlock(&to_i915(mm->dev)->mm_lock);
459
460         INIT_WORK(&mm->work, __i915_mm_struct_free__worker);
461         schedule_work(&mm->work);
462 }
463
464 static void
465 i915_gem_userptr_release__mm_struct(struct drm_i915_gem_object *obj)
466 {
467         if (obj->userptr.mm == NULL)
468                 return;
469
470         kref_put_mutex(&obj->userptr.mm->kref,
471                        __i915_mm_struct_free,
472                        &to_i915(obj->base.dev)->mm_lock);
473         obj->userptr.mm = NULL;
474 }
475
476 struct get_pages_work {
477         struct work_struct work;
478         struct drm_i915_gem_object *obj;
479         struct task_struct *task;
480 };
481
482 #if IS_ENABLED(CONFIG_SWIOTLB)
483 #define swiotlb_active() swiotlb_nr_tbl()
484 #else
485 #define swiotlb_active() 0
486 #endif
487
488 static int
489 st_set_pages(struct sg_table **st, struct page **pvec, int num_pages)
490 {
491         struct scatterlist *sg;
492         int ret, n;
493
494         *st = kmalloc(sizeof(**st), GFP_KERNEL);
495         if (*st == NULL)
496                 return -ENOMEM;
497
498         if (swiotlb_active()) {
499                 ret = sg_alloc_table(*st, num_pages, GFP_KERNEL);
500                 if (ret)
501                         goto err;
502
503                 for_each_sg((*st)->sgl, sg, num_pages, n)
504                         sg_set_page(sg, pvec[n], PAGE_SIZE, 0);
505         } else {
506                 ret = sg_alloc_table_from_pages(*st, pvec, num_pages,
507                                                 0, num_pages << PAGE_SHIFT,
508                                                 GFP_KERNEL);
509                 if (ret)
510                         goto err;
511         }
512
513         return 0;
514
515 err:
516         kfree(*st);
517         *st = NULL;
518         return ret;
519 }
520
521 static void
522 __i915_gem_userptr_get_pages_worker(struct work_struct *_work)
523 {
524         struct get_pages_work *work = container_of(_work, typeof(*work), work);
525         struct drm_i915_gem_object *obj = work->obj;
526         struct drm_device *dev = obj->base.dev;
527         const int num_pages = obj->base.size >> PAGE_SHIFT;
528         struct page **pvec;
529         int pinned, ret;
530
531         ret = -ENOMEM;
532         pinned = 0;
533
534         pvec = kmalloc(num_pages*sizeof(struct page *),
535                        GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY);
536         if (pvec == NULL)
537                 pvec = drm_malloc_ab(num_pages, sizeof(struct page *));
538         if (pvec != NULL) {
539                 struct mm_struct *mm = obj->userptr.mm->mm;
540
541                 down_read(&mm->mmap_sem);
542                 while (pinned < num_pages) {
543                         ret = get_user_pages(work->task, mm,
544                                              obj->userptr.ptr + pinned * PAGE_SIZE,
545                                              num_pages - pinned,
546                                              !obj->userptr.read_only, 0,
547                                              pvec + pinned, NULL);
548                         if (ret < 0)
549                                 break;
550
551                         pinned += ret;
552                 }
553                 up_read(&mm->mmap_sem);
554         }
555
556         mutex_lock(&dev->struct_mutex);
557         if (obj->userptr.work != &work->work) {
558                 ret = 0;
559         } else if (pinned == num_pages) {
560                 ret = st_set_pages(&obj->pages, pvec, num_pages);
561                 if (ret == 0) {
562                         list_add_tail(&obj->global_list, &to_i915(dev)->mm.unbound_list);
563                         pinned = 0;
564                 }
565         }
566
567         obj->userptr.work = ERR_PTR(ret);
568         obj->userptr.workers--;
569         drm_gem_object_unreference(&obj->base);
570         mutex_unlock(&dev->struct_mutex);
571
572         release_pages(pvec, pinned, 0);
573         drm_free_large(pvec);
574
575         put_task_struct(work->task);
576         kfree(work);
577 }
578
579 static int
580 i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj)
581 {
582         const int num_pages = obj->base.size >> PAGE_SHIFT;
583         struct page **pvec;
584         int pinned, ret;
585
586         /* If userspace should engineer that these pages are replaced in
587          * the vma between us binding this page into the GTT and completion
588          * of rendering... Their loss. If they change the mapping of their
589          * pages they need to create a new bo to point to the new vma.
590          *
591          * However, that still leaves open the possibility of the vma
592          * being copied upon fork. Which falls under the same userspace
593          * synchronisation issue as a regular bo, except that this time
594          * the process may not be expecting that a particular piece of
595          * memory is tied to the GPU.
596          *
597          * Fortunately, we can hook into the mmu_notifier in order to
598          * discard the page references prior to anything nasty happening
599          * to the vma (discard or cloning) which should prevent the more
600          * egregious cases from causing harm.
601          */
602
603         pvec = NULL;
604         pinned = 0;
605         if (obj->userptr.mm->mm == current->mm) {
606                 pvec = kmalloc(num_pages*sizeof(struct page *),
607                                GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY);
608                 if (pvec == NULL) {
609                         pvec = drm_malloc_ab(num_pages, sizeof(struct page *));
610                         if (pvec == NULL)
611                                 return -ENOMEM;
612                 }
613
614                 pinned = __get_user_pages_fast(obj->userptr.ptr, num_pages,
615                                                !obj->userptr.read_only, pvec);
616         }
617         if (pinned < num_pages) {
618                 if (pinned < 0) {
619                         ret = pinned;
620                         pinned = 0;
621                 } else {
622                         /* Spawn a worker so that we can acquire the
623                          * user pages without holding our mutex. Access
624                          * to the user pages requires mmap_sem, and we have
625                          * a strict lock ordering of mmap_sem, struct_mutex -
626                          * we already hold struct_mutex here and so cannot
627                          * call gup without encountering a lock inversion.
628                          *
629                          * Userspace will keep on repeating the operation
630                          * (thanks to EAGAIN) until either we hit the fast
631                          * path or the worker completes. If the worker is
632                          * cancelled or superseded, the task is still run
633                          * but the results ignored. (This leads to
634                          * complications that we may have a stray object
635                          * refcount that we need to be wary of when
636                          * checking for existing objects during creation.)
637                          * If the worker encounters an error, it reports
638                          * that error back to this function through
639                          * obj->userptr.work = ERR_PTR.
640                          */
641                         ret = -EAGAIN;
642                         if (obj->userptr.work == NULL &&
643                             obj->userptr.workers < I915_GEM_USERPTR_MAX_WORKERS) {
644                                 struct get_pages_work *work;
645
646                                 work = kmalloc(sizeof(*work), GFP_KERNEL);
647                                 if (work != NULL) {
648                                         obj->userptr.work = &work->work;
649                                         obj->userptr.workers++;
650
651                                         work->obj = obj;
652                                         drm_gem_object_reference(&obj->base);
653
654                                         work->task = current;
655                                         get_task_struct(work->task);
656
657                                         INIT_WORK(&work->work, __i915_gem_userptr_get_pages_worker);
658                                         schedule_work(&work->work);
659                                 } else
660                                         ret = -ENOMEM;
661                         } else {
662                                 if (IS_ERR(obj->userptr.work)) {
663                                         ret = PTR_ERR(obj->userptr.work);
664                                         obj->userptr.work = NULL;
665                                 }
666                         }
667                 }
668         } else {
669                 ret = st_set_pages(&obj->pages, pvec, num_pages);
670                 if (ret == 0) {
671                         obj->userptr.work = NULL;
672                         pinned = 0;
673                 }
674         }
675
676         release_pages(pvec, pinned, 0);
677         drm_free_large(pvec);
678         return ret;
679 }
680
681 static void
682 i915_gem_userptr_put_pages(struct drm_i915_gem_object *obj)
683 {
684         struct scatterlist *sg;
685         int i;
686
687         BUG_ON(obj->userptr.work != NULL);
688
689         if (obj->madv != I915_MADV_WILLNEED)
690                 obj->dirty = 0;
691
692         for_each_sg(obj->pages->sgl, sg, obj->pages->nents, i) {
693                 struct page *page = sg_page(sg);
694
695                 if (obj->dirty)
696                         set_page_dirty(page);
697
698                 mark_page_accessed(page);
699                 page_cache_release(page);
700         }
701         obj->dirty = 0;
702
703         sg_free_table(obj->pages);
704         kfree(obj->pages);
705 }
706
707 static void
708 i915_gem_userptr_release(struct drm_i915_gem_object *obj)
709 {
710         i915_gem_userptr_release__mmu_notifier(obj);
711         i915_gem_userptr_release__mm_struct(obj);
712 }
713
714 static int
715 i915_gem_userptr_dmabuf_export(struct drm_i915_gem_object *obj)
716 {
717         if (obj->userptr.mmu_object)
718                 return 0;
719
720         return i915_gem_userptr_init__mmu_notifier(obj, 0);
721 }
722
723 static const struct drm_i915_gem_object_ops i915_gem_userptr_ops = {
724         .dmabuf_export = i915_gem_userptr_dmabuf_export,
725         .get_pages = i915_gem_userptr_get_pages,
726         .put_pages = i915_gem_userptr_put_pages,
727         .release = i915_gem_userptr_release,
728 };
729
730 /**
731  * Creates a new mm object that wraps some normal memory from the process
732  * context - user memory.
733  *
734  * We impose several restrictions upon the memory being mapped
735  * into the GPU.
736  * 1. It must be page aligned (both start/end addresses, i.e ptr and size).
737  * 2. It must be normal system memory, not a pointer into another map of IO
738  *    space (e.g. it must not be a GTT mmapping of another object).
739  * 3. We only allow a bo as large as we could in theory map into the GTT,
740  *    that is we limit the size to the total size of the GTT.
741  * 4. The bo is marked as being snoopable. The backing pages are left
742  *    accessible directly by the CPU, but reads and writes by the GPU may
743  *    incur the cost of a snoop (unless you have an LLC architecture).
744  *
745  * Synchronisation between multiple users and the GPU is left to userspace
746  * through the normal set-domain-ioctl. The kernel will enforce that the
747  * GPU relinquishes the VMA before it is returned back to the system
748  * i.e. upon free(), munmap() or process termination. However, the userspace
749  * malloc() library may not immediately relinquish the VMA after free() and
750  * instead reuse it whilst the GPU is still reading and writing to the VMA.
751  * Caveat emptor.
752  *
753  * Also note, that the object created here is not currently a "first class"
754  * object, in that several ioctls are banned. These are the CPU access
755  * ioctls: mmap(), pwrite and pread. In practice, you are expected to use
756  * direct access via your pointer rather than use those ioctls.
757  *
758  * If you think this is a good interface to use to pass GPU memory between
759  * drivers, please use dma-buf instead. In fact, wherever possible use
760  * dma-buf instead.
761  */
762 int
763 i915_gem_userptr_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
764 {
765         struct drm_i915_private *dev_priv = dev->dev_private;
766         struct drm_i915_gem_userptr *args = data;
767         struct drm_i915_gem_object *obj;
768         int ret;
769         u32 handle;
770
771         if (args->flags & ~(I915_USERPTR_READ_ONLY |
772                             I915_USERPTR_UNSYNCHRONIZED))
773                 return -EINVAL;
774
775         if (offset_in_page(args->user_ptr | args->user_size))
776                 return -EINVAL;
777
778         if (args->user_size > dev_priv->gtt.base.total)
779                 return -E2BIG;
780
781         if (!access_ok(args->flags & I915_USERPTR_READ_ONLY ? VERIFY_READ : VERIFY_WRITE,
782                        (char __user *)(unsigned long)args->user_ptr, args->user_size))
783                 return -EFAULT;
784
785         if (args->flags & I915_USERPTR_READ_ONLY) {
786                 /* On almost all of the current hw, we cannot tell the GPU that a
787                  * page is readonly, so this is just a placeholder in the uAPI.
788                  */
789                 return -ENODEV;
790         }
791
792         obj = i915_gem_object_alloc(dev);
793         if (obj == NULL)
794                 return -ENOMEM;
795
796         drm_gem_private_object_init(dev, &obj->base, args->user_size);
797         i915_gem_object_init(obj, &i915_gem_userptr_ops);
798         obj->cache_level = I915_CACHE_LLC;
799         obj->base.write_domain = I915_GEM_DOMAIN_CPU;
800         obj->base.read_domains = I915_GEM_DOMAIN_CPU;
801
802         obj->userptr.ptr = args->user_ptr;
803         obj->userptr.read_only = !!(args->flags & I915_USERPTR_READ_ONLY);
804
805         /* And keep a pointer to the current->mm for resolving the user pages
806          * at binding. This means that we need to hook into the mmu_notifier
807          * in order to detect if the mmu is destroyed.
808          */
809         ret = i915_gem_userptr_init__mm_struct(obj);
810         if (ret == 0)
811                 ret = i915_gem_userptr_init__mmu_notifier(obj, args->flags);
812         if (ret == 0)
813                 ret = drm_gem_handle_create(file, &obj->base, &handle);
814
815         /* drop reference from allocate - handle holds it now */
816         drm_gem_object_unreference_unlocked(&obj->base);
817         if (ret)
818                 return ret;
819
820         args->handle = handle;
821         return 0;
822 }
823
824 int
825 i915_gem_init_userptr(struct drm_device *dev)
826 {
827         struct drm_i915_private *dev_priv = to_i915(dev);
828         mutex_init(&dev_priv->mm_lock);
829         hash_init(dev_priv->mm_structs);
830         return 0;
831 }