]> Git Repo - linux.git/blob - drivers/gpu/drm/msm/msm_gem.c
agp: use semicolons rather than commas to separate statements
[linux.git] / drivers / gpu / drm / msm / msm_gem.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2013 Red Hat
4  * Author: Rob Clark <[email protected]>
5  */
6
7 #include <linux/spinlock.h>
8 #include <linux/shmem_fs.h>
9 #include <linux/dma-buf.h>
10 #include <linux/pfn_t.h>
11
12 #include <drm/drm_prime.h>
13
14 #include "msm_drv.h"
15 #include "msm_fence.h"
16 #include "msm_gem.h"
17 #include "msm_gpu.h"
18 #include "msm_mmu.h"
19
20 static void msm_gem_vunmap_locked(struct drm_gem_object *obj);
21
22
23 static dma_addr_t physaddr(struct drm_gem_object *obj)
24 {
25         struct msm_gem_object *msm_obj = to_msm_bo(obj);
26         struct msm_drm_private *priv = obj->dev->dev_private;
27         return (((dma_addr_t)msm_obj->vram_node->start) << PAGE_SHIFT) +
28                         priv->vram.paddr;
29 }
30
31 static bool use_pages(struct drm_gem_object *obj)
32 {
33         struct msm_gem_object *msm_obj = to_msm_bo(obj);
34         return !msm_obj->vram_node;
35 }
36
37 /*
38  * Cache sync.. this is a bit over-complicated, to fit dma-mapping
39  * API.  Really GPU cache is out of scope here (handled on cmdstream)
40  * and all we need to do is invalidate newly allocated pages before
41  * mapping to CPU as uncached/writecombine.
42  *
43  * On top of this, we have the added headache, that depending on
44  * display generation, the display's iommu may be wired up to either
45  * the toplevel drm device (mdss), or to the mdp sub-node, meaning
46  * that here we either have dma-direct or iommu ops.
47  *
48  * Let this be a cautionary tail of abstraction gone wrong.
49  */
50
51 static void sync_for_device(struct msm_gem_object *msm_obj)
52 {
53         struct device *dev = msm_obj->base.dev->dev;
54
55         if (get_dma_ops(dev) && IS_ENABLED(CONFIG_ARM64)) {
56                 dma_sync_sgtable_for_device(dev, msm_obj->sgt,
57                                             DMA_BIDIRECTIONAL);
58         } else {
59                 dma_map_sgtable(dev, msm_obj->sgt, DMA_BIDIRECTIONAL, 0);
60         }
61 }
62
63 static void sync_for_cpu(struct msm_gem_object *msm_obj)
64 {
65         struct device *dev = msm_obj->base.dev->dev;
66
67         if (get_dma_ops(dev) && IS_ENABLED(CONFIG_ARM64)) {
68                 dma_sync_sgtable_for_cpu(dev, msm_obj->sgt, DMA_BIDIRECTIONAL);
69         } else {
70                 dma_unmap_sgtable(dev, msm_obj->sgt, DMA_BIDIRECTIONAL, 0);
71         }
72 }
73
74 /* allocate pages from VRAM carveout, used when no IOMMU: */
75 static struct page **get_pages_vram(struct drm_gem_object *obj, int npages)
76 {
77         struct msm_gem_object *msm_obj = to_msm_bo(obj);
78         struct msm_drm_private *priv = obj->dev->dev_private;
79         dma_addr_t paddr;
80         struct page **p;
81         int ret, i;
82
83         p = kvmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
84         if (!p)
85                 return ERR_PTR(-ENOMEM);
86
87         spin_lock(&priv->vram.lock);
88         ret = drm_mm_insert_node(&priv->vram.mm, msm_obj->vram_node, npages);
89         spin_unlock(&priv->vram.lock);
90         if (ret) {
91                 kvfree(p);
92                 return ERR_PTR(ret);
93         }
94
95         paddr = physaddr(obj);
96         for (i = 0; i < npages; i++) {
97                 p[i] = phys_to_page(paddr);
98                 paddr += PAGE_SIZE;
99         }
100
101         return p;
102 }
103
104 static struct page **get_pages(struct drm_gem_object *obj)
105 {
106         struct msm_gem_object *msm_obj = to_msm_bo(obj);
107
108         if (!msm_obj->pages) {
109                 struct drm_device *dev = obj->dev;
110                 struct page **p;
111                 int npages = obj->size >> PAGE_SHIFT;
112
113                 if (use_pages(obj))
114                         p = drm_gem_get_pages(obj);
115                 else
116                         p = get_pages_vram(obj, npages);
117
118                 if (IS_ERR(p)) {
119                         DRM_DEV_ERROR(dev->dev, "could not get pages: %ld\n",
120                                         PTR_ERR(p));
121                         return p;
122                 }
123
124                 msm_obj->pages = p;
125
126                 msm_obj->sgt = drm_prime_pages_to_sg(obj->dev, p, npages);
127                 if (IS_ERR(msm_obj->sgt)) {
128                         void *ptr = ERR_CAST(msm_obj->sgt);
129
130                         DRM_DEV_ERROR(dev->dev, "failed to allocate sgt\n");
131                         msm_obj->sgt = NULL;
132                         return ptr;
133                 }
134
135                 /* For non-cached buffers, ensure the new pages are clean
136                  * because display controller, GPU, etc. are not coherent:
137                  */
138                 if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED))
139                         sync_for_device(msm_obj);
140         }
141
142         return msm_obj->pages;
143 }
144
145 static void put_pages_vram(struct drm_gem_object *obj)
146 {
147         struct msm_gem_object *msm_obj = to_msm_bo(obj);
148         struct msm_drm_private *priv = obj->dev->dev_private;
149
150         spin_lock(&priv->vram.lock);
151         drm_mm_remove_node(msm_obj->vram_node);
152         spin_unlock(&priv->vram.lock);
153
154         kvfree(msm_obj->pages);
155 }
156
157 static void put_pages(struct drm_gem_object *obj)
158 {
159         struct msm_gem_object *msm_obj = to_msm_bo(obj);
160
161         if (msm_obj->pages) {
162                 if (msm_obj->sgt) {
163                         /* For non-cached buffers, ensure the new
164                          * pages are clean because display controller,
165                          * GPU, etc. are not coherent:
166                          */
167                         if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED))
168                                 sync_for_cpu(msm_obj);
169
170                         sg_free_table(msm_obj->sgt);
171                         kfree(msm_obj->sgt);
172                 }
173
174                 if (use_pages(obj))
175                         drm_gem_put_pages(obj, msm_obj->pages, true, false);
176                 else
177                         put_pages_vram(obj);
178
179                 msm_obj->pages = NULL;
180         }
181 }
182
183 struct page **msm_gem_get_pages(struct drm_gem_object *obj)
184 {
185         struct msm_gem_object *msm_obj = to_msm_bo(obj);
186         struct page **p;
187
188         mutex_lock(&msm_obj->lock);
189
190         if (WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
191                 mutex_unlock(&msm_obj->lock);
192                 return ERR_PTR(-EBUSY);
193         }
194
195         p = get_pages(obj);
196         mutex_unlock(&msm_obj->lock);
197         return p;
198 }
199
200 void msm_gem_put_pages(struct drm_gem_object *obj)
201 {
202         /* when we start tracking the pin count, then do something here */
203 }
204
205 int msm_gem_mmap_obj(struct drm_gem_object *obj,
206                 struct vm_area_struct *vma)
207 {
208         struct msm_gem_object *msm_obj = to_msm_bo(obj);
209
210         vma->vm_flags &= ~VM_PFNMAP;
211         vma->vm_flags |= VM_MIXEDMAP;
212
213         if (msm_obj->flags & MSM_BO_WC) {
214                 vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
215         } else if (msm_obj->flags & MSM_BO_UNCACHED) {
216                 vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
217         } else {
218                 /*
219                  * Shunt off cached objs to shmem file so they have their own
220                  * address_space (so unmap_mapping_range does what we want,
221                  * in particular in the case of mmap'd dmabufs)
222                  */
223                 fput(vma->vm_file);
224                 get_file(obj->filp);
225                 vma->vm_pgoff = 0;
226                 vma->vm_file  = obj->filp;
227
228                 vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
229         }
230
231         return 0;
232 }
233
234 int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
235 {
236         int ret;
237
238         ret = drm_gem_mmap(filp, vma);
239         if (ret) {
240                 DBG("mmap failed: %d", ret);
241                 return ret;
242         }
243
244         return msm_gem_mmap_obj(vma->vm_private_data, vma);
245 }
246
247 vm_fault_t msm_gem_fault(struct vm_fault *vmf)
248 {
249         struct vm_area_struct *vma = vmf->vma;
250         struct drm_gem_object *obj = vma->vm_private_data;
251         struct msm_gem_object *msm_obj = to_msm_bo(obj);
252         struct page **pages;
253         unsigned long pfn;
254         pgoff_t pgoff;
255         int err;
256         vm_fault_t ret;
257
258         /*
259          * vm_ops.open/drm_gem_mmap_obj and close get and put
260          * a reference on obj. So, we dont need to hold one here.
261          */
262         err = mutex_lock_interruptible(&msm_obj->lock);
263         if (err) {
264                 ret = VM_FAULT_NOPAGE;
265                 goto out;
266         }
267
268         if (WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
269                 mutex_unlock(&msm_obj->lock);
270                 return VM_FAULT_SIGBUS;
271         }
272
273         /* make sure we have pages attached now */
274         pages = get_pages(obj);
275         if (IS_ERR(pages)) {
276                 ret = vmf_error(PTR_ERR(pages));
277                 goto out_unlock;
278         }
279
280         /* We don't use vmf->pgoff since that has the fake offset: */
281         pgoff = (vmf->address - vma->vm_start) >> PAGE_SHIFT;
282
283         pfn = page_to_pfn(pages[pgoff]);
284
285         VERB("Inserting %p pfn %lx, pa %lx", (void *)vmf->address,
286                         pfn, pfn << PAGE_SHIFT);
287
288         ret = vmf_insert_mixed(vma, vmf->address, __pfn_to_pfn_t(pfn, PFN_DEV));
289 out_unlock:
290         mutex_unlock(&msm_obj->lock);
291 out:
292         return ret;
293 }
294
295 /** get mmap offset */
296 static uint64_t mmap_offset(struct drm_gem_object *obj)
297 {
298         struct drm_device *dev = obj->dev;
299         struct msm_gem_object *msm_obj = to_msm_bo(obj);
300         int ret;
301
302         WARN_ON(!mutex_is_locked(&msm_obj->lock));
303
304         /* Make it mmapable */
305         ret = drm_gem_create_mmap_offset(obj);
306
307         if (ret) {
308                 DRM_DEV_ERROR(dev->dev, "could not allocate mmap offset\n");
309                 return 0;
310         }
311
312         return drm_vma_node_offset_addr(&obj->vma_node);
313 }
314
315 uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj)
316 {
317         uint64_t offset;
318         struct msm_gem_object *msm_obj = to_msm_bo(obj);
319
320         mutex_lock(&msm_obj->lock);
321         offset = mmap_offset(obj);
322         mutex_unlock(&msm_obj->lock);
323         return offset;
324 }
325
326 static struct msm_gem_vma *add_vma(struct drm_gem_object *obj,
327                 struct msm_gem_address_space *aspace)
328 {
329         struct msm_gem_object *msm_obj = to_msm_bo(obj);
330         struct msm_gem_vma *vma;
331
332         WARN_ON(!mutex_is_locked(&msm_obj->lock));
333
334         vma = kzalloc(sizeof(*vma), GFP_KERNEL);
335         if (!vma)
336                 return ERR_PTR(-ENOMEM);
337
338         vma->aspace = aspace;
339
340         list_add_tail(&vma->list, &msm_obj->vmas);
341
342         return vma;
343 }
344
345 static struct msm_gem_vma *lookup_vma(struct drm_gem_object *obj,
346                 struct msm_gem_address_space *aspace)
347 {
348         struct msm_gem_object *msm_obj = to_msm_bo(obj);
349         struct msm_gem_vma *vma;
350
351         WARN_ON(!mutex_is_locked(&msm_obj->lock));
352
353         list_for_each_entry(vma, &msm_obj->vmas, list) {
354                 if (vma->aspace == aspace)
355                         return vma;
356         }
357
358         return NULL;
359 }
360
361 static void del_vma(struct msm_gem_vma *vma)
362 {
363         if (!vma)
364                 return;
365
366         list_del(&vma->list);
367         kfree(vma);
368 }
369
370 /* Called with msm_obj->lock locked */
371 static void
372 put_iova(struct drm_gem_object *obj)
373 {
374         struct msm_gem_object *msm_obj = to_msm_bo(obj);
375         struct msm_gem_vma *vma, *tmp;
376
377         WARN_ON(!mutex_is_locked(&msm_obj->lock));
378
379         list_for_each_entry_safe(vma, tmp, &msm_obj->vmas, list) {
380                 if (vma->aspace) {
381                         msm_gem_purge_vma(vma->aspace, vma);
382                         msm_gem_close_vma(vma->aspace, vma);
383                 }
384                 del_vma(vma);
385         }
386 }
387
388 static int msm_gem_get_iova_locked(struct drm_gem_object *obj,
389                 struct msm_gem_address_space *aspace, uint64_t *iova,
390                 u64 range_start, u64 range_end)
391 {
392         struct msm_gem_object *msm_obj = to_msm_bo(obj);
393         struct msm_gem_vma *vma;
394         int ret = 0;
395
396         WARN_ON(!mutex_is_locked(&msm_obj->lock));
397
398         vma = lookup_vma(obj, aspace);
399
400         if (!vma) {
401                 vma = add_vma(obj, aspace);
402                 if (IS_ERR(vma))
403                         return PTR_ERR(vma);
404
405                 ret = msm_gem_init_vma(aspace, vma, obj->size >> PAGE_SHIFT,
406                         range_start, range_end);
407                 if (ret) {
408                         del_vma(vma);
409                         return ret;
410                 }
411         }
412
413         *iova = vma->iova;
414         return 0;
415 }
416
417 static int msm_gem_pin_iova(struct drm_gem_object *obj,
418                 struct msm_gem_address_space *aspace)
419 {
420         struct msm_gem_object *msm_obj = to_msm_bo(obj);
421         struct msm_gem_vma *vma;
422         struct page **pages;
423         int prot = IOMMU_READ;
424
425         if (!(msm_obj->flags & MSM_BO_GPU_READONLY))
426                 prot |= IOMMU_WRITE;
427
428         if (msm_obj->flags & MSM_BO_MAP_PRIV)
429                 prot |= IOMMU_PRIV;
430
431         WARN_ON(!mutex_is_locked(&msm_obj->lock));
432
433         if (WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED))
434                 return -EBUSY;
435
436         vma = lookup_vma(obj, aspace);
437         if (WARN_ON(!vma))
438                 return -EINVAL;
439
440         pages = get_pages(obj);
441         if (IS_ERR(pages))
442                 return PTR_ERR(pages);
443
444         return msm_gem_map_vma(aspace, vma, prot,
445                         msm_obj->sgt, obj->size >> PAGE_SHIFT);
446 }
447
448 /*
449  * get iova and pin it. Should have a matching put
450  * limits iova to specified range (in pages)
451  */
452 int msm_gem_get_and_pin_iova_range(struct drm_gem_object *obj,
453                 struct msm_gem_address_space *aspace, uint64_t *iova,
454                 u64 range_start, u64 range_end)
455 {
456         struct msm_gem_object *msm_obj = to_msm_bo(obj);
457         u64 local;
458         int ret;
459
460         mutex_lock(&msm_obj->lock);
461
462         ret = msm_gem_get_iova_locked(obj, aspace, &local,
463                 range_start, range_end);
464
465         if (!ret)
466                 ret = msm_gem_pin_iova(obj, aspace);
467
468         if (!ret)
469                 *iova = local;
470
471         mutex_unlock(&msm_obj->lock);
472         return ret;
473 }
474
475 /* get iova and pin it. Should have a matching put */
476 int msm_gem_get_and_pin_iova(struct drm_gem_object *obj,
477                 struct msm_gem_address_space *aspace, uint64_t *iova)
478 {
479         return msm_gem_get_and_pin_iova_range(obj, aspace, iova, 0, U64_MAX);
480 }
481
482 /*
483  * Get an iova but don't pin it. Doesn't need a put because iovas are currently
484  * valid for the life of the object
485  */
486 int msm_gem_get_iova(struct drm_gem_object *obj,
487                 struct msm_gem_address_space *aspace, uint64_t *iova)
488 {
489         struct msm_gem_object *msm_obj = to_msm_bo(obj);
490         int ret;
491
492         mutex_lock(&msm_obj->lock);
493         ret = msm_gem_get_iova_locked(obj, aspace, iova, 0, U64_MAX);
494         mutex_unlock(&msm_obj->lock);
495
496         return ret;
497 }
498
499 /* get iova without taking a reference, used in places where you have
500  * already done a 'msm_gem_get_and_pin_iova' or 'msm_gem_get_iova'
501  */
502 uint64_t msm_gem_iova(struct drm_gem_object *obj,
503                 struct msm_gem_address_space *aspace)
504 {
505         struct msm_gem_object *msm_obj = to_msm_bo(obj);
506         struct msm_gem_vma *vma;
507
508         mutex_lock(&msm_obj->lock);
509         vma = lookup_vma(obj, aspace);
510         mutex_unlock(&msm_obj->lock);
511         WARN_ON(!vma);
512
513         return vma ? vma->iova : 0;
514 }
515
516 /*
517  * Unpin a iova by updating the reference counts. The memory isn't actually
518  * purged until something else (shrinker, mm_notifier, destroy, etc) decides
519  * to get rid of it
520  */
521 void msm_gem_unpin_iova(struct drm_gem_object *obj,
522                 struct msm_gem_address_space *aspace)
523 {
524         struct msm_gem_object *msm_obj = to_msm_bo(obj);
525         struct msm_gem_vma *vma;
526
527         mutex_lock(&msm_obj->lock);
528         vma = lookup_vma(obj, aspace);
529
530         if (!WARN_ON(!vma))
531                 msm_gem_unmap_vma(aspace, vma);
532
533         mutex_unlock(&msm_obj->lock);
534 }
535
536 int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
537                 struct drm_mode_create_dumb *args)
538 {
539         args->pitch = align_pitch(args->width, args->bpp);
540         args->size  = PAGE_ALIGN(args->pitch * args->height);
541         return msm_gem_new_handle(dev, file, args->size,
542                         MSM_BO_SCANOUT | MSM_BO_WC, &args->handle, "dumb");
543 }
544
545 int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
546                 uint32_t handle, uint64_t *offset)
547 {
548         struct drm_gem_object *obj;
549         int ret = 0;
550
551         /* GEM does all our handle to object mapping */
552         obj = drm_gem_object_lookup(file, handle);
553         if (obj == NULL) {
554                 ret = -ENOENT;
555                 goto fail;
556         }
557
558         *offset = msm_gem_mmap_offset(obj);
559
560         drm_gem_object_put(obj);
561
562 fail:
563         return ret;
564 }
565
566 static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
567 {
568         struct msm_gem_object *msm_obj = to_msm_bo(obj);
569         int ret = 0;
570
571         if (obj->import_attach)
572                 return ERR_PTR(-ENODEV);
573
574         mutex_lock(&msm_obj->lock);
575
576         if (WARN_ON(msm_obj->madv > madv)) {
577                 DRM_DEV_ERROR(obj->dev->dev, "Invalid madv state: %u vs %u\n",
578                         msm_obj->madv, madv);
579                 mutex_unlock(&msm_obj->lock);
580                 return ERR_PTR(-EBUSY);
581         }
582
583         /* increment vmap_count *before* vmap() call, so shrinker can
584          * check vmap_count (is_vunmapable()) outside of msm_obj->lock.
585          * This guarantees that we won't try to msm_gem_vunmap() this
586          * same object from within the vmap() call (while we already
587          * hold msm_obj->lock)
588          */
589         msm_obj->vmap_count++;
590
591         if (!msm_obj->vaddr) {
592                 struct page **pages = get_pages(obj);
593                 if (IS_ERR(pages)) {
594                         ret = PTR_ERR(pages);
595                         goto fail;
596                 }
597                 msm_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT,
598                                 VM_MAP, pgprot_writecombine(PAGE_KERNEL));
599                 if (msm_obj->vaddr == NULL) {
600                         ret = -ENOMEM;
601                         goto fail;
602                 }
603         }
604
605         mutex_unlock(&msm_obj->lock);
606         return msm_obj->vaddr;
607
608 fail:
609         msm_obj->vmap_count--;
610         mutex_unlock(&msm_obj->lock);
611         return ERR_PTR(ret);
612 }
613
614 void *msm_gem_get_vaddr(struct drm_gem_object *obj)
615 {
616         return get_vaddr(obj, MSM_MADV_WILLNEED);
617 }
618
619 /*
620  * Don't use this!  It is for the very special case of dumping
621  * submits from GPU hangs or faults, were the bo may already
622  * be MSM_MADV_DONTNEED, but we know the buffer is still on the
623  * active list.
624  */
625 void *msm_gem_get_vaddr_active(struct drm_gem_object *obj)
626 {
627         return get_vaddr(obj, __MSM_MADV_PURGED);
628 }
629
630 void msm_gem_put_vaddr(struct drm_gem_object *obj)
631 {
632         struct msm_gem_object *msm_obj = to_msm_bo(obj);
633
634         mutex_lock(&msm_obj->lock);
635         WARN_ON(msm_obj->vmap_count < 1);
636         msm_obj->vmap_count--;
637         mutex_unlock(&msm_obj->lock);
638 }
639
640 /* Update madvise status, returns true if not purged, else
641  * false or -errno.
642  */
643 int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv)
644 {
645         struct msm_gem_object *msm_obj = to_msm_bo(obj);
646
647         mutex_lock(&msm_obj->lock);
648
649         WARN_ON(!mutex_is_locked(&obj->dev->struct_mutex));
650
651         if (msm_obj->madv != __MSM_MADV_PURGED)
652                 msm_obj->madv = madv;
653
654         madv = msm_obj->madv;
655
656         mutex_unlock(&msm_obj->lock);
657
658         return (madv != __MSM_MADV_PURGED);
659 }
660
661 void msm_gem_purge(struct drm_gem_object *obj, enum msm_gem_lock subclass)
662 {
663         struct drm_device *dev = obj->dev;
664         struct msm_gem_object *msm_obj = to_msm_bo(obj);
665
666         WARN_ON(!mutex_is_locked(&dev->struct_mutex));
667         WARN_ON(!is_purgeable(msm_obj));
668         WARN_ON(obj->import_attach);
669
670         mutex_lock_nested(&msm_obj->lock, subclass);
671
672         put_iova(obj);
673
674         msm_gem_vunmap_locked(obj);
675
676         put_pages(obj);
677
678         msm_obj->madv = __MSM_MADV_PURGED;
679
680         drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping);
681         drm_gem_free_mmap_offset(obj);
682
683         /* Our goal here is to return as much of the memory as
684          * is possible back to the system as we are called from OOM.
685          * To do this we must instruct the shmfs to drop all of its
686          * backing pages, *now*.
687          */
688         shmem_truncate_range(file_inode(obj->filp), 0, (loff_t)-1);
689
690         invalidate_mapping_pages(file_inode(obj->filp)->i_mapping,
691                         0, (loff_t)-1);
692
693         mutex_unlock(&msm_obj->lock);
694 }
695
696 static void msm_gem_vunmap_locked(struct drm_gem_object *obj)
697 {
698         struct msm_gem_object *msm_obj = to_msm_bo(obj);
699
700         WARN_ON(!mutex_is_locked(&msm_obj->lock));
701
702         if (!msm_obj->vaddr || WARN_ON(!is_vunmapable(msm_obj)))
703                 return;
704
705         vunmap(msm_obj->vaddr);
706         msm_obj->vaddr = NULL;
707 }
708
709 void msm_gem_vunmap(struct drm_gem_object *obj, enum msm_gem_lock subclass)
710 {
711         struct msm_gem_object *msm_obj = to_msm_bo(obj);
712
713         mutex_lock_nested(&msm_obj->lock, subclass);
714         msm_gem_vunmap_locked(obj);
715         mutex_unlock(&msm_obj->lock);
716 }
717
718 /* must be called before _move_to_active().. */
719 int msm_gem_sync_object(struct drm_gem_object *obj,
720                 struct msm_fence_context *fctx, bool exclusive)
721 {
722         struct dma_resv_list *fobj;
723         struct dma_fence *fence;
724         int i, ret;
725
726         fobj = dma_resv_get_list(obj->resv);
727         if (!fobj || (fobj->shared_count == 0)) {
728                 fence = dma_resv_get_excl(obj->resv);
729                 /* don't need to wait on our own fences, since ring is fifo */
730                 if (fence && (fence->context != fctx->context)) {
731                         ret = dma_fence_wait(fence, true);
732                         if (ret)
733                                 return ret;
734                 }
735         }
736
737         if (!exclusive || !fobj)
738                 return 0;
739
740         for (i = 0; i < fobj->shared_count; i++) {
741                 fence = rcu_dereference_protected(fobj->shared[i],
742                                                 dma_resv_held(obj->resv));
743                 if (fence->context != fctx->context) {
744                         ret = dma_fence_wait(fence, true);
745                         if (ret)
746                                 return ret;
747                 }
748         }
749
750         return 0;
751 }
752
753 void msm_gem_move_to_active(struct drm_gem_object *obj,
754                 struct msm_gpu *gpu, bool exclusive, struct dma_fence *fence)
755 {
756         struct msm_gem_object *msm_obj = to_msm_bo(obj);
757         WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED);
758         msm_obj->gpu = gpu;
759         if (exclusive)
760                 dma_resv_add_excl_fence(obj->resv, fence);
761         else
762                 dma_resv_add_shared_fence(obj->resv, fence);
763         list_del_init(&msm_obj->mm_list);
764         list_add_tail(&msm_obj->mm_list, &gpu->active_list);
765 }
766
767 void msm_gem_move_to_inactive(struct drm_gem_object *obj)
768 {
769         struct drm_device *dev = obj->dev;
770         struct msm_drm_private *priv = dev->dev_private;
771         struct msm_gem_object *msm_obj = to_msm_bo(obj);
772
773         WARN_ON(!mutex_is_locked(&dev->struct_mutex));
774
775         msm_obj->gpu = NULL;
776         list_del_init(&msm_obj->mm_list);
777         list_add_tail(&msm_obj->mm_list, &priv->inactive_list);
778 }
779
780 int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout)
781 {
782         bool write = !!(op & MSM_PREP_WRITE);
783         unsigned long remain =
784                 op & MSM_PREP_NOSYNC ? 0 : timeout_to_jiffies(timeout);
785         long ret;
786
787         ret = dma_resv_wait_timeout_rcu(obj->resv, write,
788                                                   true,  remain);
789         if (ret == 0)
790                 return remain == 0 ? -EBUSY : -ETIMEDOUT;
791         else if (ret < 0)
792                 return ret;
793
794         /* TODO cache maintenance */
795
796         return 0;
797 }
798
799 int msm_gem_cpu_fini(struct drm_gem_object *obj)
800 {
801         /* TODO cache maintenance */
802         return 0;
803 }
804
805 #ifdef CONFIG_DEBUG_FS
806 static void describe_fence(struct dma_fence *fence, const char *type,
807                 struct seq_file *m)
808 {
809         if (!dma_fence_is_signaled(fence))
810                 seq_printf(m, "\t%9s: %s %s seq %llu\n", type,
811                                 fence->ops->get_driver_name(fence),
812                                 fence->ops->get_timeline_name(fence),
813                                 fence->seqno);
814 }
815
816 void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
817 {
818         struct msm_gem_object *msm_obj = to_msm_bo(obj);
819         struct dma_resv *robj = obj->resv;
820         struct dma_resv_list *fobj;
821         struct dma_fence *fence;
822         struct msm_gem_vma *vma;
823         uint64_t off = drm_vma_node_start(&obj->vma_node);
824         const char *madv;
825
826         mutex_lock(&msm_obj->lock);
827
828         switch (msm_obj->madv) {
829         case __MSM_MADV_PURGED:
830                 madv = " purged";
831                 break;
832         case MSM_MADV_DONTNEED:
833                 madv = " purgeable";
834                 break;
835         case MSM_MADV_WILLNEED:
836         default:
837                 madv = "";
838                 break;
839         }
840
841         seq_printf(m, "%08x: %c %2d (%2d) %08llx %p",
842                         msm_obj->flags, is_active(msm_obj) ? 'A' : 'I',
843                         obj->name, kref_read(&obj->refcount),
844                         off, msm_obj->vaddr);
845
846         seq_printf(m, " %08zu %9s %-32s\n", obj->size, madv, msm_obj->name);
847
848         if (!list_empty(&msm_obj->vmas)) {
849
850                 seq_puts(m, "      vmas:");
851
852                 list_for_each_entry(vma, &msm_obj->vmas, list)
853                         seq_printf(m, " [%s: %08llx,%s,inuse=%d]",
854                                 vma->aspace != NULL ? vma->aspace->name : NULL,
855                                 vma->iova, vma->mapped ? "mapped" : "unmapped",
856                                 vma->inuse);
857
858                 seq_puts(m, "\n");
859         }
860
861         rcu_read_lock();
862         fobj = rcu_dereference(robj->fence);
863         if (fobj) {
864                 unsigned int i, shared_count = fobj->shared_count;
865
866                 for (i = 0; i < shared_count; i++) {
867                         fence = rcu_dereference(fobj->shared[i]);
868                         describe_fence(fence, "Shared", m);
869                 }
870         }
871
872         fence = rcu_dereference(robj->fence_excl);
873         if (fence)
874                 describe_fence(fence, "Exclusive", m);
875         rcu_read_unlock();
876
877         mutex_unlock(&msm_obj->lock);
878 }
879
880 void msm_gem_describe_objects(struct list_head *list, struct seq_file *m)
881 {
882         struct msm_gem_object *msm_obj;
883         int count = 0;
884         size_t size = 0;
885
886         seq_puts(m, "   flags       id ref  offset   kaddr            size     madv      name\n");
887         list_for_each_entry(msm_obj, list, mm_list) {
888                 struct drm_gem_object *obj = &msm_obj->base;
889                 seq_puts(m, "   ");
890                 msm_gem_describe(obj, m);
891                 count++;
892                 size += obj->size;
893         }
894
895         seq_printf(m, "Total %d objects, %zu bytes\n", count, size);
896 }
897 #endif
898
899 /* don't call directly!  Use drm_gem_object_put_locked() and friends */
900 void msm_gem_free_object(struct drm_gem_object *obj)
901 {
902         struct msm_gem_object *msm_obj = to_msm_bo(obj);
903         struct drm_device *dev = obj->dev;
904         struct msm_drm_private *priv = dev->dev_private;
905
906         if (llist_add(&msm_obj->freed, &priv->free_list))
907                 queue_work(priv->wq, &priv->free_work);
908 }
909
910 static void free_object(struct msm_gem_object *msm_obj)
911 {
912         struct drm_gem_object *obj = &msm_obj->base;
913         struct drm_device *dev = obj->dev;
914
915         WARN_ON(!mutex_is_locked(&dev->struct_mutex));
916
917         /* object should not be on active list: */
918         WARN_ON(is_active(msm_obj));
919
920         list_del(&msm_obj->mm_list);
921
922         mutex_lock(&msm_obj->lock);
923
924         put_iova(obj);
925
926         if (obj->import_attach) {
927                 WARN_ON(msm_obj->vaddr);
928
929                 /* Don't drop the pages for imported dmabuf, as they are not
930                  * ours, just free the array we allocated:
931                  */
932                 if (msm_obj->pages)
933                         kvfree(msm_obj->pages);
934
935                 drm_prime_gem_destroy(obj, msm_obj->sgt);
936         } else {
937                 msm_gem_vunmap_locked(obj);
938                 put_pages(obj);
939         }
940
941         drm_gem_object_release(obj);
942
943         mutex_unlock(&msm_obj->lock);
944         kfree(msm_obj);
945 }
946
947 void msm_gem_free_work(struct work_struct *work)
948 {
949         struct msm_drm_private *priv =
950                 container_of(work, struct msm_drm_private, free_work);
951         struct drm_device *dev = priv->dev;
952         struct llist_node *freed;
953         struct msm_gem_object *msm_obj, *next;
954
955         while ((freed = llist_del_all(&priv->free_list))) {
956
957                 mutex_lock(&dev->struct_mutex);
958
959                 llist_for_each_entry_safe(msm_obj, next,
960                                           freed, freed)
961                         free_object(msm_obj);
962
963                 mutex_unlock(&dev->struct_mutex);
964
965                 if (need_resched())
966                         break;
967         }
968 }
969
970 /* convenience method to construct a GEM buffer object, and userspace handle */
971 int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
972                 uint32_t size, uint32_t flags, uint32_t *handle,
973                 char *name)
974 {
975         struct drm_gem_object *obj;
976         int ret;
977
978         obj = msm_gem_new(dev, size, flags);
979
980         if (IS_ERR(obj))
981                 return PTR_ERR(obj);
982
983         if (name)
984                 msm_gem_object_set_name(obj, "%s", name);
985
986         ret = drm_gem_handle_create(file, obj, handle);
987
988         /* drop reference from allocate - handle holds it now */
989         drm_gem_object_put(obj);
990
991         return ret;
992 }
993
994 static int msm_gem_new_impl(struct drm_device *dev,
995                 uint32_t size, uint32_t flags,
996                 struct drm_gem_object **obj)
997 {
998         struct msm_gem_object *msm_obj;
999
1000         switch (flags & MSM_BO_CACHE_MASK) {
1001         case MSM_BO_UNCACHED:
1002         case MSM_BO_CACHED:
1003         case MSM_BO_WC:
1004                 break;
1005         default:
1006                 DRM_DEV_ERROR(dev->dev, "invalid cache flag: %x\n",
1007                                 (flags & MSM_BO_CACHE_MASK));
1008                 return -EINVAL;
1009         }
1010
1011         msm_obj = kzalloc(sizeof(*msm_obj), GFP_KERNEL);
1012         if (!msm_obj)
1013                 return -ENOMEM;
1014
1015         mutex_init(&msm_obj->lock);
1016
1017         msm_obj->flags = flags;
1018         msm_obj->madv = MSM_MADV_WILLNEED;
1019
1020         INIT_LIST_HEAD(&msm_obj->submit_entry);
1021         INIT_LIST_HEAD(&msm_obj->vmas);
1022
1023         *obj = &msm_obj->base;
1024
1025         return 0;
1026 }
1027
1028 static struct drm_gem_object *_msm_gem_new(struct drm_device *dev,
1029                 uint32_t size, uint32_t flags, bool struct_mutex_locked)
1030 {
1031         struct msm_drm_private *priv = dev->dev_private;
1032         struct msm_gem_object *msm_obj;
1033         struct drm_gem_object *obj = NULL;
1034         bool use_vram = false;
1035         int ret;
1036
1037         size = PAGE_ALIGN(size);
1038
1039         if (!msm_use_mmu(dev))
1040                 use_vram = true;
1041         else if ((flags & (MSM_BO_STOLEN | MSM_BO_SCANOUT)) && priv->vram.size)
1042                 use_vram = true;
1043
1044         if (WARN_ON(use_vram && !priv->vram.size))
1045                 return ERR_PTR(-EINVAL);
1046
1047         /* Disallow zero sized objects as they make the underlying
1048          * infrastructure grumpy
1049          */
1050         if (size == 0)
1051                 return ERR_PTR(-EINVAL);
1052
1053         ret = msm_gem_new_impl(dev, size, flags, &obj);
1054         if (ret)
1055                 goto fail;
1056
1057         msm_obj = to_msm_bo(obj);
1058
1059         if (use_vram) {
1060                 struct msm_gem_vma *vma;
1061                 struct page **pages;
1062
1063                 mutex_lock(&msm_obj->lock);
1064
1065                 vma = add_vma(obj, NULL);
1066                 mutex_unlock(&msm_obj->lock);
1067                 if (IS_ERR(vma)) {
1068                         ret = PTR_ERR(vma);
1069                         goto fail;
1070                 }
1071
1072                 to_msm_bo(obj)->vram_node = &vma->node;
1073
1074                 drm_gem_private_object_init(dev, obj, size);
1075
1076                 pages = get_pages(obj);
1077                 if (IS_ERR(pages)) {
1078                         ret = PTR_ERR(pages);
1079                         goto fail;
1080                 }
1081
1082                 vma->iova = physaddr(obj);
1083         } else {
1084                 ret = drm_gem_object_init(dev, obj, size);
1085                 if (ret)
1086                         goto fail;
1087                 /*
1088                  * Our buffers are kept pinned, so allocating them from the
1089                  * MOVABLE zone is a really bad idea, and conflicts with CMA.
1090                  * See comments above new_inode() why this is required _and_
1091                  * expected if you're going to pin these pages.
1092                  */
1093                 mapping_set_gfp_mask(obj->filp->f_mapping, GFP_HIGHUSER);
1094         }
1095
1096         if (struct_mutex_locked) {
1097                 WARN_ON(!mutex_is_locked(&dev->struct_mutex));
1098                 list_add_tail(&msm_obj->mm_list, &priv->inactive_list);
1099         } else {
1100                 mutex_lock(&dev->struct_mutex);
1101                 list_add_tail(&msm_obj->mm_list, &priv->inactive_list);
1102                 mutex_unlock(&dev->struct_mutex);
1103         }
1104
1105         return obj;
1106
1107 fail:
1108         drm_gem_object_put(obj);
1109         return ERR_PTR(ret);
1110 }
1111
1112 struct drm_gem_object *msm_gem_new_locked(struct drm_device *dev,
1113                 uint32_t size, uint32_t flags)
1114 {
1115         return _msm_gem_new(dev, size, flags, true);
1116 }
1117
1118 struct drm_gem_object *msm_gem_new(struct drm_device *dev,
1119                 uint32_t size, uint32_t flags)
1120 {
1121         return _msm_gem_new(dev, size, flags, false);
1122 }
1123
1124 struct drm_gem_object *msm_gem_import(struct drm_device *dev,
1125                 struct dma_buf *dmabuf, struct sg_table *sgt)
1126 {
1127         struct msm_drm_private *priv = dev->dev_private;
1128         struct msm_gem_object *msm_obj;
1129         struct drm_gem_object *obj;
1130         uint32_t size;
1131         int ret, npages;
1132
1133         /* if we don't have IOMMU, don't bother pretending we can import: */
1134         if (!msm_use_mmu(dev)) {
1135                 DRM_DEV_ERROR(dev->dev, "cannot import without IOMMU\n");
1136                 return ERR_PTR(-EINVAL);
1137         }
1138
1139         size = PAGE_ALIGN(dmabuf->size);
1140
1141         ret = msm_gem_new_impl(dev, size, MSM_BO_WC, &obj);
1142         if (ret)
1143                 goto fail;
1144
1145         drm_gem_private_object_init(dev, obj, size);
1146
1147         npages = size / PAGE_SIZE;
1148
1149         msm_obj = to_msm_bo(obj);
1150         mutex_lock(&msm_obj->lock);
1151         msm_obj->sgt = sgt;
1152         msm_obj->pages = kvmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
1153         if (!msm_obj->pages) {
1154                 mutex_unlock(&msm_obj->lock);
1155                 ret = -ENOMEM;
1156                 goto fail;
1157         }
1158
1159         ret = drm_prime_sg_to_page_addr_arrays(sgt, msm_obj->pages, NULL, npages);
1160         if (ret) {
1161                 mutex_unlock(&msm_obj->lock);
1162                 goto fail;
1163         }
1164
1165         mutex_unlock(&msm_obj->lock);
1166
1167         mutex_lock(&dev->struct_mutex);
1168         list_add_tail(&msm_obj->mm_list, &priv->inactive_list);
1169         mutex_unlock(&dev->struct_mutex);
1170
1171         return obj;
1172
1173 fail:
1174         drm_gem_object_put(obj);
1175         return ERR_PTR(ret);
1176 }
1177
1178 static void *_msm_gem_kernel_new(struct drm_device *dev, uint32_t size,
1179                 uint32_t flags, struct msm_gem_address_space *aspace,
1180                 struct drm_gem_object **bo, uint64_t *iova, bool locked)
1181 {
1182         void *vaddr;
1183         struct drm_gem_object *obj = _msm_gem_new(dev, size, flags, locked);
1184         int ret;
1185
1186         if (IS_ERR(obj))
1187                 return ERR_CAST(obj);
1188
1189         if (iova) {
1190                 ret = msm_gem_get_and_pin_iova(obj, aspace, iova);
1191                 if (ret)
1192                         goto err;
1193         }
1194
1195         vaddr = msm_gem_get_vaddr(obj);
1196         if (IS_ERR(vaddr)) {
1197                 msm_gem_unpin_iova(obj, aspace);
1198                 ret = PTR_ERR(vaddr);
1199                 goto err;
1200         }
1201
1202         if (bo)
1203                 *bo = obj;
1204
1205         return vaddr;
1206 err:
1207         if (locked)
1208                 drm_gem_object_put_locked(obj);
1209         else
1210                 drm_gem_object_put(obj);
1211
1212         return ERR_PTR(ret);
1213
1214 }
1215
1216 void *msm_gem_kernel_new(struct drm_device *dev, uint32_t size,
1217                 uint32_t flags, struct msm_gem_address_space *aspace,
1218                 struct drm_gem_object **bo, uint64_t *iova)
1219 {
1220         return _msm_gem_kernel_new(dev, size, flags, aspace, bo, iova, false);
1221 }
1222
1223 void *msm_gem_kernel_new_locked(struct drm_device *dev, uint32_t size,
1224                 uint32_t flags, struct msm_gem_address_space *aspace,
1225                 struct drm_gem_object **bo, uint64_t *iova)
1226 {
1227         return _msm_gem_kernel_new(dev, size, flags, aspace, bo, iova, true);
1228 }
1229
1230 void msm_gem_kernel_put(struct drm_gem_object *bo,
1231                 struct msm_gem_address_space *aspace, bool locked)
1232 {
1233         if (IS_ERR_OR_NULL(bo))
1234                 return;
1235
1236         msm_gem_put_vaddr(bo);
1237         msm_gem_unpin_iova(bo, aspace);
1238
1239         if (locked)
1240                 drm_gem_object_put_locked(bo);
1241         else
1242                 drm_gem_object_put(bo);
1243 }
1244
1245 void msm_gem_object_set_name(struct drm_gem_object *bo, const char *fmt, ...)
1246 {
1247         struct msm_gem_object *msm_obj = to_msm_bo(bo);
1248         va_list ap;
1249
1250         if (!fmt)
1251                 return;
1252
1253         va_start(ap, fmt);
1254         vsnprintf(msm_obj->name, sizeof(msm_obj->name), fmt, ap);
1255         va_end(ap);
1256 }
This page took 0.103121 seconds and 4 git commands to generate.