]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/gpu/drm/drm_prime.c
Merge tag 'topic/drm-header-rework-2014-09-12' of git://anongit.freedesktop.org/drm...
[karo-tx-linux.git] / drivers / gpu / drm / drm_prime.c
1 /*
2  * Copyright © 2012 Red Hat
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  * Authors:
24  *      Dave Airlie <airlied@redhat.com>
25  *      Rob Clark <rob.clark@linaro.org>
26  *
27  */
28
29 #include <linux/export.h>
30 #include <linux/dma-buf.h>
31 #include <drm/drmP.h>
32 #include "drm_internal.h"
33
34 /*
35  * DMA-BUF/GEM Object references and lifetime overview:
36  *
37  * On the export the dma_buf holds a reference to the exporting GEM
38  * object. It takes this reference in handle_to_fd_ioctl, when it
39  * first calls .prime_export and stores the exporting GEM object in
40  * the dma_buf priv. This reference is released when the dma_buf
41  * object goes away in the driver .release function.
42  *
43  * On the import the importing GEM object holds a reference to the
44  * dma_buf (which in turn holds a ref to the exporting GEM object).
45  * It takes that reference in the fd_to_handle ioctl.
46  * It calls dma_buf_get, creates an attachment to it and stores the
47  * attachment in the GEM object. When this attachment is destroyed
48  * when the imported object is destroyed, we remove the attachment
49  * and drop the reference to the dma_buf.
50  *
51  * Thus the chain of references always flows in one direction
52  * (avoiding loops): importing_gem -> dmabuf -> exporting_gem
53  *
54  * Self-importing: if userspace is using PRIME as a replacement for flink
55  * then it will get a fd->handle request for a GEM object that it created.
56  * Drivers should detect this situation and return back the gem object
57  * from the dma-buf private.  Prime will do this automatically for drivers that
58  * use the drm_gem_prime_{import,export} helpers.
59  */
60
61 struct drm_prime_member {
62         struct list_head entry;
63         struct dma_buf *dma_buf;
64         uint32_t handle;
65 };
66
67 struct drm_prime_attachment {
68         struct sg_table *sgt;
69         enum dma_data_direction dir;
70 };
71
72 static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv,
73                                     struct dma_buf *dma_buf, uint32_t handle)
74 {
75         struct drm_prime_member *member;
76
77         member = kmalloc(sizeof(*member), GFP_KERNEL);
78         if (!member)
79                 return -ENOMEM;
80
81         get_dma_buf(dma_buf);
82         member->dma_buf = dma_buf;
83         member->handle = handle;
84         list_add(&member->entry, &prime_fpriv->head);
85         return 0;
86 }
87
88 static struct dma_buf *drm_prime_lookup_buf_by_handle(struct drm_prime_file_private *prime_fpriv,
89                                                       uint32_t handle)
90 {
91         struct drm_prime_member *member;
92
93         list_for_each_entry(member, &prime_fpriv->head, entry) {
94                 if (member->handle == handle)
95                         return member->dma_buf;
96         }
97
98         return NULL;
99 }
100
101 static int drm_prime_lookup_buf_handle(struct drm_prime_file_private *prime_fpriv,
102                                        struct dma_buf *dma_buf,
103                                        uint32_t *handle)
104 {
105         struct drm_prime_member *member;
106
107         list_for_each_entry(member, &prime_fpriv->head, entry) {
108                 if (member->dma_buf == dma_buf) {
109                         *handle = member->handle;
110                         return 0;
111                 }
112         }
113         return -ENOENT;
114 }
115
116 static int drm_gem_map_attach(struct dma_buf *dma_buf,
117                               struct device *target_dev,
118                               struct dma_buf_attachment *attach)
119 {
120         struct drm_prime_attachment *prime_attach;
121         struct drm_gem_object *obj = dma_buf->priv;
122         struct drm_device *dev = obj->dev;
123
124         prime_attach = kzalloc(sizeof(*prime_attach), GFP_KERNEL);
125         if (!prime_attach)
126                 return -ENOMEM;
127
128         prime_attach->dir = DMA_NONE;
129         attach->priv = prime_attach;
130
131         if (!dev->driver->gem_prime_pin)
132                 return 0;
133
134         return dev->driver->gem_prime_pin(obj);
135 }
136
137 static void drm_gem_map_detach(struct dma_buf *dma_buf,
138                                struct dma_buf_attachment *attach)
139 {
140         struct drm_prime_attachment *prime_attach = attach->priv;
141         struct drm_gem_object *obj = dma_buf->priv;
142         struct drm_device *dev = obj->dev;
143         struct sg_table *sgt;
144
145         if (dev->driver->gem_prime_unpin)
146                 dev->driver->gem_prime_unpin(obj);
147
148         if (!prime_attach)
149                 return;
150
151         sgt = prime_attach->sgt;
152         if (sgt) {
153                 if (prime_attach->dir != DMA_NONE)
154                         dma_unmap_sg(attach->dev, sgt->sgl, sgt->nents,
155                                         prime_attach->dir);
156                 sg_free_table(sgt);
157         }
158
159         kfree(sgt);
160         kfree(prime_attach);
161         attach->priv = NULL;
162 }
163
164 void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv,
165                                         struct dma_buf *dma_buf)
166 {
167         struct drm_prime_member *member, *safe;
168
169         list_for_each_entry_safe(member, safe, &prime_fpriv->head, entry) {
170                 if (member->dma_buf == dma_buf) {
171                         dma_buf_put(dma_buf);
172                         list_del(&member->entry);
173                         kfree(member);
174                 }
175         }
176 }
177
178 static struct sg_table *drm_gem_map_dma_buf(struct dma_buf_attachment *attach,
179                                             enum dma_data_direction dir)
180 {
181         struct drm_prime_attachment *prime_attach = attach->priv;
182         struct drm_gem_object *obj = attach->dmabuf->priv;
183         struct sg_table *sgt;
184
185         if (WARN_ON(dir == DMA_NONE || !prime_attach))
186                 return ERR_PTR(-EINVAL);
187
188         /* return the cached mapping when possible */
189         if (prime_attach->dir == dir)
190                 return prime_attach->sgt;
191
192         /*
193          * two mappings with different directions for the same attachment are
194          * not allowed
195          */
196         if (WARN_ON(prime_attach->dir != DMA_NONE))
197                 return ERR_PTR(-EBUSY);
198
199         sgt = obj->dev->driver->gem_prime_get_sg_table(obj);
200
201         if (!IS_ERR(sgt)) {
202                 if (!dma_map_sg(attach->dev, sgt->sgl, sgt->nents, dir)) {
203                         sg_free_table(sgt);
204                         kfree(sgt);
205                         sgt = ERR_PTR(-ENOMEM);
206                 } else {
207                         prime_attach->sgt = sgt;
208                         prime_attach->dir = dir;
209                 }
210         }
211
212         return sgt;
213 }
214
215 static void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
216                                   struct sg_table *sgt,
217                                   enum dma_data_direction dir)
218 {
219         /* nothing to be done here */
220 }
221
222 /**
223  * drm_gem_dmabuf_release - dma_buf release implementation for GEM
224  * @dma_buf: buffer to be released
225  *
226  * Generic release function for dma_bufs exported as PRIME buffers. GEM drivers
227  * must use this in their dma_buf ops structure as the release callback.
228  */
229 void drm_gem_dmabuf_release(struct dma_buf *dma_buf)
230 {
231         struct drm_gem_object *obj = dma_buf->priv;
232
233         /* drop the reference on the export fd holds */
234         drm_gem_object_unreference_unlocked(obj);
235 }
236 EXPORT_SYMBOL(drm_gem_dmabuf_release);
237
238 static void *drm_gem_dmabuf_vmap(struct dma_buf *dma_buf)
239 {
240         struct drm_gem_object *obj = dma_buf->priv;
241         struct drm_device *dev = obj->dev;
242
243         return dev->driver->gem_prime_vmap(obj);
244 }
245
246 static void drm_gem_dmabuf_vunmap(struct dma_buf *dma_buf, void *vaddr)
247 {
248         struct drm_gem_object *obj = dma_buf->priv;
249         struct drm_device *dev = obj->dev;
250
251         dev->driver->gem_prime_vunmap(obj, vaddr);
252 }
253
254 static void *drm_gem_dmabuf_kmap_atomic(struct dma_buf *dma_buf,
255                                         unsigned long page_num)
256 {
257         return NULL;
258 }
259
260 static void drm_gem_dmabuf_kunmap_atomic(struct dma_buf *dma_buf,
261                                          unsigned long page_num, void *addr)
262 {
263
264 }
265 static void *drm_gem_dmabuf_kmap(struct dma_buf *dma_buf,
266                                  unsigned long page_num)
267 {
268         return NULL;
269 }
270
271 static void drm_gem_dmabuf_kunmap(struct dma_buf *dma_buf,
272                                   unsigned long page_num, void *addr)
273 {
274
275 }
276
277 static int drm_gem_dmabuf_mmap(struct dma_buf *dma_buf,
278                                struct vm_area_struct *vma)
279 {
280         struct drm_gem_object *obj = dma_buf->priv;
281         struct drm_device *dev = obj->dev;
282
283         if (!dev->driver->gem_prime_mmap)
284                 return -ENOSYS;
285
286         return dev->driver->gem_prime_mmap(obj, vma);
287 }
288
289 static const struct dma_buf_ops drm_gem_prime_dmabuf_ops =  {
290         .attach = drm_gem_map_attach,
291         .detach = drm_gem_map_detach,
292         .map_dma_buf = drm_gem_map_dma_buf,
293         .unmap_dma_buf = drm_gem_unmap_dma_buf,
294         .release = drm_gem_dmabuf_release,
295         .kmap = drm_gem_dmabuf_kmap,
296         .kmap_atomic = drm_gem_dmabuf_kmap_atomic,
297         .kunmap = drm_gem_dmabuf_kunmap,
298         .kunmap_atomic = drm_gem_dmabuf_kunmap_atomic,
299         .mmap = drm_gem_dmabuf_mmap,
300         .vmap = drm_gem_dmabuf_vmap,
301         .vunmap = drm_gem_dmabuf_vunmap,
302 };
303
304 /**
305  * DOC: PRIME Helpers
306  *
307  * Drivers can implement @gem_prime_export and @gem_prime_import in terms of
308  * simpler APIs by using the helper functions @drm_gem_prime_export and
309  * @drm_gem_prime_import.  These functions implement dma-buf support in terms of
310  * five lower-level driver callbacks:
311  *
312  * Export callbacks:
313  *
314  *  - @gem_prime_pin (optional): prepare a GEM object for exporting
315  *
316  *  - @gem_prime_get_sg_table: provide a scatter/gather table of pinned pages
317  *
318  *  - @gem_prime_vmap: vmap a buffer exported by your driver
319  *
320  *  - @gem_prime_vunmap: vunmap a buffer exported by your driver
321  *
322  * Import callback:
323  *
324  *  - @gem_prime_import_sg_table (import): produce a GEM object from another
325  *    driver's scatter/gather table
326  */
327
328 /**
329  * drm_gem_prime_export - helper library implemention of the export callback
330  * @dev: drm_device to export from
331  * @obj: GEM object to export
332  * @flags: flags like DRM_CLOEXEC
333  *
334  * This is the implementation of the gem_prime_export functions for GEM drivers
335  * using the PRIME helpers.
336  */
337 struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
338                                      struct drm_gem_object *obj, int flags)
339 {
340         struct reservation_object *robj = NULL;
341
342         if (dev->driver->gem_prime_res_obj)
343                 robj = dev->driver->gem_prime_res_obj(obj);
344
345         return dma_buf_export(obj, &drm_gem_prime_dmabuf_ops, obj->size,
346                               flags, robj);
347 }
348 EXPORT_SYMBOL(drm_gem_prime_export);
349
350 static struct dma_buf *export_and_register_object(struct drm_device *dev,
351                                                   struct drm_gem_object *obj,
352                                                   uint32_t flags)
353 {
354         struct dma_buf *dmabuf;
355
356         /* prevent races with concurrent gem_close. */
357         if (obj->handle_count == 0) {
358                 dmabuf = ERR_PTR(-ENOENT);
359                 return dmabuf;
360         }
361
362         dmabuf = dev->driver->gem_prime_export(dev, obj, flags);
363         if (IS_ERR(dmabuf)) {
364                 /* normally the created dma-buf takes ownership of the ref,
365                  * but if that fails then drop the ref
366                  */
367                 return dmabuf;
368         }
369
370         /*
371          * Note that callers do not need to clean up the export cache
372          * since the check for obj->handle_count guarantees that someone
373          * will clean it up.
374          */
375         obj->dma_buf = dmabuf;
376         get_dma_buf(obj->dma_buf);
377         /* Grab a new ref since the callers is now used by the dma-buf */
378         drm_gem_object_reference(obj);
379
380         return dmabuf;
381 }
382
383 /**
384  * drm_gem_prime_handle_to_fd - PRIME export function for GEM drivers
385  * @dev: dev to export the buffer from
386  * @file_priv: drm file-private structure
387  * @handle: buffer handle to export
388  * @flags: flags like DRM_CLOEXEC
389  * @prime_fd: pointer to storage for the fd id of the create dma-buf
390  *
391  * This is the PRIME export function which must be used mandatorily by GEM
392  * drivers to ensure correct lifetime management of the underlying GEM object.
393  * The actual exporting from GEM object to a dma-buf is done through the
394  * gem_prime_export driver callback.
395  */
396 int drm_gem_prime_handle_to_fd(struct drm_device *dev,
397                                struct drm_file *file_priv, uint32_t handle,
398                                uint32_t flags,
399                                int *prime_fd)
400 {
401         struct drm_gem_object *obj;
402         int ret = 0;
403         struct dma_buf *dmabuf;
404
405         mutex_lock(&file_priv->prime.lock);
406         obj = drm_gem_object_lookup(dev, file_priv, handle);
407         if (!obj)  {
408                 ret = -ENOENT;
409                 goto out_unlock;
410         }
411
412         dmabuf = drm_prime_lookup_buf_by_handle(&file_priv->prime, handle);
413         if (dmabuf) {
414                 get_dma_buf(dmabuf);
415                 goto out_have_handle;
416         }
417
418         mutex_lock(&dev->object_name_lock);
419         /* re-export the original imported object */
420         if (obj->import_attach) {
421                 dmabuf = obj->import_attach->dmabuf;
422                 get_dma_buf(dmabuf);
423                 goto out_have_obj;
424         }
425
426         if (obj->dma_buf) {
427                 get_dma_buf(obj->dma_buf);
428                 dmabuf = obj->dma_buf;
429                 goto out_have_obj;
430         }
431
432         dmabuf = export_and_register_object(dev, obj, flags);
433         if (IS_ERR(dmabuf)) {
434                 /* normally the created dma-buf takes ownership of the ref,
435                  * but if that fails then drop the ref
436                  */
437                 ret = PTR_ERR(dmabuf);
438                 mutex_unlock(&dev->object_name_lock);
439                 goto out;
440         }
441
442 out_have_obj:
443         /*
444          * If we've exported this buffer then cheat and add it to the import list
445          * so we get the correct handle back. We must do this under the
446          * protection of dev->object_name_lock to ensure that a racing gem close
447          * ioctl doesn't miss to remove this buffer handle from the cache.
448          */
449         ret = drm_prime_add_buf_handle(&file_priv->prime,
450                                        dmabuf, handle);
451         mutex_unlock(&dev->object_name_lock);
452         if (ret)
453                 goto fail_put_dmabuf;
454
455 out_have_handle:
456         ret = dma_buf_fd(dmabuf, flags);
457         /*
458          * We must _not_ remove the buffer from the handle cache since the newly
459          * created dma buf is already linked in the global obj->dma_buf pointer,
460          * and that is invariant as long as a userspace gem handle exists.
461          * Closing the handle will clean out the cache anyway, so we don't leak.
462          */
463         if (ret < 0) {
464                 goto fail_put_dmabuf;
465         } else {
466                 *prime_fd = ret;
467                 ret = 0;
468         }
469
470         goto out;
471
472 fail_put_dmabuf:
473         dma_buf_put(dmabuf);
474 out:
475         drm_gem_object_unreference_unlocked(obj);
476 out_unlock:
477         mutex_unlock(&file_priv->prime.lock);
478
479         return ret;
480 }
481 EXPORT_SYMBOL(drm_gem_prime_handle_to_fd);
482
483 /**
484  * drm_gem_prime_import - helper library implemention of the import callback
485  * @dev: drm_device to import into
486  * @dma_buf: dma-buf object to import
487  *
488  * This is the implementation of the gem_prime_import functions for GEM drivers
489  * using the PRIME helpers.
490  */
491 struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
492                                             struct dma_buf *dma_buf)
493 {
494         struct dma_buf_attachment *attach;
495         struct sg_table *sgt;
496         struct drm_gem_object *obj;
497         int ret;
498
499         if (!dev->driver->gem_prime_import_sg_table)
500                 return ERR_PTR(-EINVAL);
501
502         if (dma_buf->ops == &drm_gem_prime_dmabuf_ops) {
503                 obj = dma_buf->priv;
504                 if (obj->dev == dev) {
505                         /*
506                          * Importing dmabuf exported from out own gem increases
507                          * refcount on gem itself instead of f_count of dmabuf.
508                          */
509                         drm_gem_object_reference(obj);
510                         return obj;
511                 }
512         }
513
514         attach = dma_buf_attach(dma_buf, dev->dev);
515         if (IS_ERR(attach))
516                 return ERR_CAST(attach);
517
518         get_dma_buf(dma_buf);
519
520         sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
521         if (IS_ERR(sgt)) {
522                 ret = PTR_ERR(sgt);
523                 goto fail_detach;
524         }
525
526         obj = dev->driver->gem_prime_import_sg_table(dev, dma_buf->size, sgt);
527         if (IS_ERR(obj)) {
528                 ret = PTR_ERR(obj);
529                 goto fail_unmap;
530         }
531
532         obj->import_attach = attach;
533
534         return obj;
535
536 fail_unmap:
537         dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
538 fail_detach:
539         dma_buf_detach(dma_buf, attach);
540         dma_buf_put(dma_buf);
541
542         return ERR_PTR(ret);
543 }
544 EXPORT_SYMBOL(drm_gem_prime_import);
545
546 /**
547  * drm_gem_prime_fd_to_handle - PRIME import function for GEM drivers
548  * @dev: dev to export the buffer from
549  * @file_priv: drm file-private structure
550  * @prime_fd: fd id of the dma-buf which should be imported
551  * @handle: pointer to storage for the handle of the imported buffer object
552  *
553  * This is the PRIME import function which must be used mandatorily by GEM
554  * drivers to ensure correct lifetime management of the underlying GEM object.
555  * The actual importing of GEM object from the dma-buf is done through the
556  * gem_import_export driver callback.
557  */
558 int drm_gem_prime_fd_to_handle(struct drm_device *dev,
559                                struct drm_file *file_priv, int prime_fd,
560                                uint32_t *handle)
561 {
562         struct dma_buf *dma_buf;
563         struct drm_gem_object *obj;
564         int ret;
565
566         dma_buf = dma_buf_get(prime_fd);
567         if (IS_ERR(dma_buf))
568                 return PTR_ERR(dma_buf);
569
570         mutex_lock(&file_priv->prime.lock);
571
572         ret = drm_prime_lookup_buf_handle(&file_priv->prime,
573                         dma_buf, handle);
574         if (ret == 0)
575                 goto out_put;
576
577         /* never seen this one, need to import */
578         mutex_lock(&dev->object_name_lock);
579         obj = dev->driver->gem_prime_import(dev, dma_buf);
580         if (IS_ERR(obj)) {
581                 ret = PTR_ERR(obj);
582                 goto out_unlock;
583         }
584
585         if (obj->dma_buf) {
586                 WARN_ON(obj->dma_buf != dma_buf);
587         } else {
588                 obj->dma_buf = dma_buf;
589                 get_dma_buf(dma_buf);
590         }
591
592         /* drm_gem_handle_create_tail unlocks dev->object_name_lock. */
593         ret = drm_gem_handle_create_tail(file_priv, obj, handle);
594         drm_gem_object_unreference_unlocked(obj);
595         if (ret)
596                 goto out_put;
597
598         ret = drm_prime_add_buf_handle(&file_priv->prime,
599                         dma_buf, *handle);
600         if (ret)
601                 goto fail;
602
603         mutex_unlock(&file_priv->prime.lock);
604
605         dma_buf_put(dma_buf);
606
607         return 0;
608
609 fail:
610         /* hmm, if driver attached, we are relying on the free-object path
611          * to detach.. which seems ok..
612          */
613         drm_gem_handle_delete(file_priv, *handle);
614 out_unlock:
615         mutex_unlock(&dev->object_name_lock);
616 out_put:
617         dma_buf_put(dma_buf);
618         mutex_unlock(&file_priv->prime.lock);
619         return ret;
620 }
621 EXPORT_SYMBOL(drm_gem_prime_fd_to_handle);
622
623 int drm_prime_handle_to_fd_ioctl(struct drm_device *dev, void *data,
624                                  struct drm_file *file_priv)
625 {
626         struct drm_prime_handle *args = data;
627         uint32_t flags;
628
629         if (!drm_core_check_feature(dev, DRIVER_PRIME))
630                 return -EINVAL;
631
632         if (!dev->driver->prime_handle_to_fd)
633                 return -ENOSYS;
634
635         /* check flags are valid */
636         if (args->flags & ~DRM_CLOEXEC)
637                 return -EINVAL;
638
639         /* we only want to pass DRM_CLOEXEC which is == O_CLOEXEC */
640         flags = args->flags & DRM_CLOEXEC;
641
642         return dev->driver->prime_handle_to_fd(dev, file_priv,
643                         args->handle, flags, &args->fd);
644 }
645
646 int drm_prime_fd_to_handle_ioctl(struct drm_device *dev, void *data,
647                                  struct drm_file *file_priv)
648 {
649         struct drm_prime_handle *args = data;
650
651         if (!drm_core_check_feature(dev, DRIVER_PRIME))
652                 return -EINVAL;
653
654         if (!dev->driver->prime_fd_to_handle)
655                 return -ENOSYS;
656
657         return dev->driver->prime_fd_to_handle(dev, file_priv,
658                         args->fd, &args->handle);
659 }
660
661 /**
662  * drm_prime_pages_to_sg - converts a page array into an sg list
663  * @pages: pointer to the array of page pointers to convert
664  * @nr_pages: length of the page vector
665  *
666  * This helper creates an sg table object from a set of pages
667  * the driver is responsible for mapping the pages into the
668  * importers address space for use with dma_buf itself.
669  */
670 struct sg_table *drm_prime_pages_to_sg(struct page **pages, int nr_pages)
671 {
672         struct sg_table *sg = NULL;
673         int ret;
674
675         sg = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
676         if (!sg) {
677                 ret = -ENOMEM;
678                 goto out;
679         }
680
681         ret = sg_alloc_table_from_pages(sg, pages, nr_pages, 0,
682                                 nr_pages << PAGE_SHIFT, GFP_KERNEL);
683         if (ret)
684                 goto out;
685
686         return sg;
687 out:
688         kfree(sg);
689         return ERR_PTR(ret);
690 }
691 EXPORT_SYMBOL(drm_prime_pages_to_sg);
692
693 /**
694  * drm_prime_sg_to_page_addr_arrays - convert an sg table into a page array
695  * @sgt: scatter-gather table to convert
696  * @pages: array of page pointers to store the page array in
697  * @addrs: optional array to store the dma bus address of each page
698  * @max_pages: size of both the passed-in arrays
699  *
700  * Exports an sg table into an array of pages and addresses. This is currently
701  * required by the TTM driver in order to do correct fault handling.
702  */
703 int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
704                                      dma_addr_t *addrs, int max_pages)
705 {
706         unsigned count;
707         struct scatterlist *sg;
708         struct page *page;
709         u32 len;
710         int pg_index;
711         dma_addr_t addr;
712
713         pg_index = 0;
714         for_each_sg(sgt->sgl, sg, sgt->nents, count) {
715                 len = sg->length;
716                 page = sg_page(sg);
717                 addr = sg_dma_address(sg);
718
719                 while (len > 0) {
720                         if (WARN_ON(pg_index >= max_pages))
721                                 return -1;
722                         pages[pg_index] = page;
723                         if (addrs)
724                                 addrs[pg_index] = addr;
725
726                         page++;
727                         addr += PAGE_SIZE;
728                         len -= PAGE_SIZE;
729                         pg_index++;
730                 }
731         }
732         return 0;
733 }
734 EXPORT_SYMBOL(drm_prime_sg_to_page_addr_arrays);
735
736 /**
737  * drm_prime_gem_destroy - helper to clean up a PRIME-imported GEM object
738  * @obj: GEM object which was created from a dma-buf
739  * @sg: the sg-table which was pinned at import time
740  *
741  * This is the cleanup functions which GEM drivers need to call when they use
742  * @drm_gem_prime_import to import dma-bufs.
743  */
744 void drm_prime_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg)
745 {
746         struct dma_buf_attachment *attach;
747         struct dma_buf *dma_buf;
748         attach = obj->import_attach;
749         if (sg)
750                 dma_buf_unmap_attachment(attach, sg, DMA_BIDIRECTIONAL);
751         dma_buf = attach->dmabuf;
752         dma_buf_detach(attach->dmabuf, attach);
753         /* remove the reference */
754         dma_buf_put(dma_buf);
755 }
756 EXPORT_SYMBOL(drm_prime_gem_destroy);
757
758 void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv)
759 {
760         INIT_LIST_HEAD(&prime_fpriv->head);
761         mutex_init(&prime_fpriv->lock);
762 }
763
764 void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv)
765 {
766         /* by now drm_gem_release should've made sure the list is empty */
767         WARN_ON(!list_empty(&prime_fpriv->head));
768 }