diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-09-11 19:42:39 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-09-11 19:42:39 -0400 |
commit | 06a660ada2064bbdcd09aeb8173f2ad128c71978 (patch) | |
tree | 1d0172ca83bd0a8c2186fcb41ae750420d7acb14 /drivers/gpu/drm/exynos/exynos_drm_gem.c | |
parent | d9b44fe30fb8637b23f804eab2e7afbce129d714 (diff) | |
parent | 63540f01917c0d8b03b9813a0d6539469b163139 (diff) |
Merge tag 'media/v4.3-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab:
"A series of patches that move part of the code used to allocate memory
from the media subsystem to the mm subsystem"
[ The mm parts have been acked by VM people, and the series was
apparently in -mm for a while - Linus ]
* tag 'media/v4.3-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media:
[media] drm/exynos: Convert g2d_userptr_get_dma_addr() to use get_vaddr_frames()
[media] media: vb2: Remove unused functions
[media] media: vb2: Convert vb2_dc_get_userptr() to use frame vector
[media] media: vb2: Convert vb2_vmalloc_get_userptr() to use frame vector
[media] media: vb2: Convert vb2_dma_sg_get_userptr() to use frame vector
[media] vb2: Provide helpers for mapping virtual addresses
[media] media: omap_vout: Convert omap_vout_uservirt_to_phys() to use get_vaddr_pfns()
[media] mm: Provide new get_vaddr_frames() helper
[media] vb2: Push mmap_sem down to memops
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_gem.c')
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_gem.c | 97 |
1 files changed, 0 insertions, 97 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index 62b9ea1b07fb..f12fbc36b120 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c | |||
@@ -366,103 +366,6 @@ int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data, | |||
366 | return 0; | 366 | return 0; |
367 | } | 367 | } |
368 | 368 | ||
369 | struct vm_area_struct *exynos_gem_get_vma(struct vm_area_struct *vma) | ||
370 | { | ||
371 | struct vm_area_struct *vma_copy; | ||
372 | |||
373 | vma_copy = kmalloc(sizeof(*vma_copy), GFP_KERNEL); | ||
374 | if (!vma_copy) | ||
375 | return NULL; | ||
376 | |||
377 | if (vma->vm_ops && vma->vm_ops->open) | ||
378 | vma->vm_ops->open(vma); | ||
379 | |||
380 | if (vma->vm_file) | ||
381 | get_file(vma->vm_file); | ||
382 | |||
383 | memcpy(vma_copy, vma, sizeof(*vma)); | ||
384 | |||
385 | vma_copy->vm_mm = NULL; | ||
386 | vma_copy->vm_next = NULL; | ||
387 | vma_copy->vm_prev = NULL; | ||
388 | |||
389 | return vma_copy; | ||
390 | } | ||
391 | |||
392 | void exynos_gem_put_vma(struct vm_area_struct *vma) | ||
393 | { | ||
394 | if (!vma) | ||
395 | return; | ||
396 | |||
397 | if (vma->vm_ops && vma->vm_ops->close) | ||
398 | vma->vm_ops->close(vma); | ||
399 | |||
400 | if (vma->vm_file) | ||
401 | fput(vma->vm_file); | ||
402 | |||
403 | kfree(vma); | ||
404 | } | ||
405 | |||
406 | int exynos_gem_get_pages_from_userptr(unsigned long start, | ||
407 | unsigned int npages, | ||
408 | struct page **pages, | ||
409 | struct vm_area_struct *vma) | ||
410 | { | ||
411 | int get_npages; | ||
412 | |||
413 | /* the memory region mmaped with VM_PFNMAP. */ | ||
414 | if (vma_is_io(vma)) { | ||
415 | unsigned int i; | ||
416 | |||
417 | for (i = 0; i < npages; ++i, start += PAGE_SIZE) { | ||
418 | unsigned long pfn; | ||
419 | int ret = follow_pfn(vma, start, &pfn); | ||
420 | if (ret) | ||
421 | return ret; | ||
422 | |||
423 | pages[i] = pfn_to_page(pfn); | ||
424 | } | ||
425 | |||
426 | if (i != npages) { | ||
427 | DRM_ERROR("failed to get user_pages.\n"); | ||
428 | return -EINVAL; | ||
429 | } | ||
430 | |||
431 | return 0; | ||
432 | } | ||
433 | |||
434 | get_npages = get_user_pages(current, current->mm, start, | ||
435 | npages, 1, 1, pages, NULL); | ||
436 | get_npages = max(get_npages, 0); | ||
437 | if (get_npages != npages) { | ||
438 | DRM_ERROR("failed to get user_pages.\n"); | ||
439 | while (get_npages) | ||
440 | put_page(pages[--get_npages]); | ||
441 | return -EFAULT; | ||
442 | } | ||
443 | |||
444 | return 0; | ||
445 | } | ||
446 | |||
447 | void exynos_gem_put_pages_to_userptr(struct page **pages, | ||
448 | unsigned int npages, | ||
449 | struct vm_area_struct *vma) | ||
450 | { | ||
451 | if (!vma_is_io(vma)) { | ||
452 | unsigned int i; | ||
453 | |||
454 | for (i = 0; i < npages; i++) { | ||
455 | set_page_dirty_lock(pages[i]); | ||
456 | |||
457 | /* | ||
458 | * undo the reference we took when populating | ||
459 | * the table. | ||
460 | */ | ||
461 | put_page(pages[i]); | ||
462 | } | ||
463 | } | ||
464 | } | ||
465 | |||
466 | int exynos_gem_map_sgt_with_dma(struct drm_device *drm_dev, | 369 | int exynos_gem_map_sgt_with_dma(struct drm_device *drm_dev, |
467 | struct sg_table *sgt, | 370 | struct sg_table *sgt, |
468 | enum dma_data_direction dir) | 371 | enum dma_data_direction dir) |