diff options
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) |