[media] videobuf-dma-contig: restore buffer mapping for uncached bufers

from commit a8f3c203e1
restore the mapping scheme for uncached buffers,
which was changed in a common scheme for cached and uncached.
This apparently was wrong, and was probably intended only for cached buffers.
the fix fixes the crash observed while mapping uncached buffers.

Signed-off-by: Lad, Prabhakar <prabhakar.lad@ti.com>
Signed-off-by: Hadli, Manjunath <manjunath.hadli@ti.com>
Acked-by: Federico Vaga <federico.vaga@gmail.com>
Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Cc: stable@kernel.org
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Lad, Prabhakar 2012-06-22 06:19:28 -03:00 committed by Mauro Carvalho Chehab
parent 4faba767c6
commit 4099040eaa

View File

@ -359,32 +359,43 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
size = vma->vm_end - vma->vm_start;
size = (size < mem->size) ? size : mem->size;
if (!mem->cached)
if (!mem->cached) {
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
pos = (unsigned long)mem->vaddr;
while (size > 0) {
page = virt_to_page((void *)pos);
if (NULL == page) {
dev_err(q->dev, "mmap: virt_to_page failed\n");
__videobuf_dc_free(q->dev, mem);
goto error;
}
retval = vm_insert_page(vma, start, page);
retval = remap_pfn_range(vma, vma->vm_start,
mem->dma_handle >> PAGE_SHIFT,
size, vma->vm_page_prot);
if (retval) {
dev_err(q->dev, "mmap: insert failed with error %d\n",
retval);
__videobuf_dc_free(q->dev, mem);
dev_err(q->dev, "mmap: remap failed with error %d. ",
retval);
dma_free_coherent(q->dev, mem->size,
mem->vaddr, mem->dma_handle);
goto error;
}
start += PAGE_SIZE;
pos += PAGE_SIZE;
} else {
pos = (unsigned long)mem->vaddr;
if (size > PAGE_SIZE)
size -= PAGE_SIZE;
else
size = 0;
while (size > 0) {
page = virt_to_page((void *)pos);
if (NULL == page) {
dev_err(q->dev, "mmap: virt_to_page failed\n");
__videobuf_dc_free(q->dev, mem);
goto error;
}
retval = vm_insert_page(vma, start, page);
if (retval) {
dev_err(q->dev, "mmap: insert failed with error %d\n",
retval);
__videobuf_dc_free(q->dev, mem);
goto error;
}
start += PAGE_SIZE;
pos += PAGE_SIZE;
if (size > PAGE_SIZE)
size -= PAGE_SIZE;
else
size = 0;
}
}
vma->vm_ops = &videobuf_vm_ops;