diff options
| -rw-r--r-- | drivers/media/v4l2-core/videobuf2-memops.c | 114 | ||||
| -rw-r--r-- | include/media/videobuf2-memops.h | 6 |
2 files changed, 0 insertions, 120 deletions
diff --git a/drivers/media/v4l2-core/videobuf2-memops.c b/drivers/media/v4l2-core/videobuf2-memops.c index 0ec186d41b9b..48c6a49c4928 100644 --- a/drivers/media/v4l2-core/videobuf2-memops.c +++ b/drivers/media/v4l2-core/videobuf2-memops.c | |||
| @@ -23,120 +23,6 @@ | |||
| 23 | #include <media/videobuf2-memops.h> | 23 | #include <media/videobuf2-memops.h> |
| 24 | 24 | ||
| 25 | /** | 25 | /** |
| 26 | * vb2_get_vma() - acquire and lock the virtual memory area | ||
| 27 | * @vma: given virtual memory area | ||
| 28 | * | ||
| 29 | * This function attempts to acquire an area mapped in the userspace for | ||
| 30 | * the duration of a hardware operation. The area is "locked" by performing | ||
| 31 | * the same set of operation that are done when process calls fork() and | ||
| 32 | * memory areas are duplicated. | ||
| 33 | * | ||
| 34 | * Returns a copy of a virtual memory region on success or NULL. | ||
| 35 | */ | ||
| 36 | struct vm_area_struct *vb2_get_vma(struct vm_area_struct *vma) | ||
| 37 | { | ||
| 38 | struct vm_area_struct *vma_copy; | ||
| 39 | |||
| 40 | vma_copy = kmalloc(sizeof(*vma_copy), GFP_KERNEL); | ||
| 41 | if (vma_copy == NULL) | ||
| 42 | return NULL; | ||
| 43 | |||
| 44 | if (vma->vm_ops && vma->vm_ops->open) | ||
| 45 | vma->vm_ops->open(vma); | ||
| 46 | |||
| 47 | if (vma->vm_file) | ||
| 48 | get_file(vma->vm_file); | ||
| 49 | |||
| 50 | memcpy(vma_copy, vma, sizeof(*vma)); | ||
| 51 | |||
| 52 | vma_copy->vm_mm = NULL; | ||
| 53 | vma_copy->vm_next = NULL; | ||
| 54 | vma_copy->vm_prev = NULL; | ||
| 55 | |||
| 56 | return vma_copy; | ||
| 57 | } | ||
| 58 | EXPORT_SYMBOL_GPL(vb2_get_vma); | ||
| 59 | |||
| 60 | /** | ||
| 61 | * vb2_put_userptr() - release a userspace virtual memory area | ||
| 62 | * @vma: virtual memory region associated with the area to be released | ||
| 63 | * | ||
| 64 | * This function releases the previously acquired memory area after a hardware | ||
| 65 | * operation. | ||
| 66 | */ | ||
| 67 | void vb2_put_vma(struct vm_area_struct *vma) | ||
| 68 | { | ||
| 69 | if (!vma) | ||
| 70 | return; | ||
| 71 | |||
| 72 | if (vma->vm_ops && vma->vm_ops->close) | ||
| 73 | vma->vm_ops->close(vma); | ||
| 74 | |||
| 75 | if (vma->vm_file) | ||
| 76 | fput(vma->vm_file); | ||
| 77 | |||
| 78 | kfree(vma); | ||
| 79 | } | ||
| 80 | EXPORT_SYMBOL_GPL(vb2_put_vma); | ||
| 81 | |||
| 82 | /** | ||
| 83 | * vb2_get_contig_userptr() - lock physically contiguous userspace mapped memory | ||
| 84 | * @vaddr: starting virtual address of the area to be verified | ||
| 85 | * @size: size of the area | ||
| 86 | * @res_paddr: will return physical address for the given vaddr | ||
| 87 | * @res_vma: will return locked copy of struct vm_area for the given area | ||
| 88 | * | ||
| 89 | * This function will go through memory area of size @size mapped at @vaddr and | ||
| 90 | * verify that the underlying physical pages are contiguous. If they are | ||
| 91 | * contiguous the virtual memory area is locked and a @res_vma is filled with | ||
| 92 | * the copy and @res_pa set to the physical address of the buffer. | ||
| 93 | * | ||
| 94 | * Returns 0 on success. | ||
| 95 | */ | ||
| 96 | int vb2_get_contig_userptr(unsigned long vaddr, unsigned long size, | ||
| 97 | struct vm_area_struct **res_vma, dma_addr_t *res_pa) | ||
| 98 | { | ||
| 99 | struct mm_struct *mm = current->mm; | ||
| 100 | struct vm_area_struct *vma; | ||
| 101 | unsigned long offset, start, end; | ||
| 102 | unsigned long this_pfn, prev_pfn; | ||
| 103 | dma_addr_t pa = 0; | ||
| 104 | |||
| 105 | start = vaddr; | ||
| 106 | offset = start & ~PAGE_MASK; | ||
| 107 | end = start + size; | ||
| 108 | |||
| 109 | vma = find_vma(mm, start); | ||
| 110 | |||
| 111 | if (vma == NULL || vma->vm_end < end) | ||
| 112 | return -EFAULT; | ||
| 113 | |||
| 114 | for (prev_pfn = 0; start < end; start += PAGE_SIZE) { | ||
| 115 | int ret = follow_pfn(vma, start, &this_pfn); | ||
| 116 | if (ret) | ||
| 117 | return ret; | ||
| 118 | |||
| 119 | if (prev_pfn == 0) | ||
| 120 | pa = this_pfn << PAGE_SHIFT; | ||
| 121 | else if (this_pfn != prev_pfn + 1) | ||
| 122 | return -EFAULT; | ||
| 123 | |||
| 124 | prev_pfn = this_pfn; | ||
| 125 | } | ||
| 126 | |||
| 127 | /* | ||
| 128 | * Memory is contigous, lock vma and return to the caller | ||
| 129 | */ | ||
| 130 | *res_vma = vb2_get_vma(vma); | ||
| 131 | if (*res_vma == NULL) | ||
| 132 | return -ENOMEM; | ||
| 133 | |||
| 134 | *res_pa = pa + offset; | ||
| 135 | return 0; | ||
| 136 | } | ||
| 137 | EXPORT_SYMBOL_GPL(vb2_get_contig_userptr); | ||
| 138 | |||
| 139 | /** | ||
| 140 | * vb2_create_framevec() - map virtual addresses to pfns | 26 | * vb2_create_framevec() - map virtual addresses to pfns |
| 141 | * @start: Virtual user address where we start mapping | 27 | * @start: Virtual user address where we start mapping |
| 142 | * @length: Length of a range to map | 28 | * @length: Length of a range to map |
diff --git a/include/media/videobuf2-memops.h b/include/media/videobuf2-memops.h index 2f0564ff5f31..830b5239fd8b 100644 --- a/include/media/videobuf2-memops.h +++ b/include/media/videobuf2-memops.h | |||
| @@ -31,12 +31,6 @@ struct vb2_vmarea_handler { | |||
| 31 | 31 | ||
| 32 | extern const struct vm_operations_struct vb2_common_vm_ops; | 32 | extern const struct vm_operations_struct vb2_common_vm_ops; |
| 33 | 33 | ||
| 34 | int vb2_get_contig_userptr(unsigned long vaddr, unsigned long size, | ||
| 35 | struct vm_area_struct **res_vma, dma_addr_t *res_pa); | ||
| 36 | |||
| 37 | struct vm_area_struct *vb2_get_vma(struct vm_area_struct *vma); | ||
| 38 | void vb2_put_vma(struct vm_area_struct *vma); | ||
| 39 | |||
| 40 | struct frame_vector *vb2_create_framevec(unsigned long start, | 34 | struct frame_vector *vb2_create_framevec(unsigned long start, |
| 41 | unsigned long length, | 35 | unsigned long length, |
| 42 | bool write); | 36 | bool write); |
